Увімкніть сервер IncludeExceptionDetailInFaults (або від ServiceBehaviorAttribute, або від конфігурації <serviceDebug>) на сервері


157

У мене є служба WCF, яка прекрасно працює, і щось змінилося, і я не знаю, що.

Я отримую цей виняток:

System.ServiceModel.FaultException: Сервер не зміг обробити запит через внутрішню помилку. Щоб отримати додаткові відомості про помилку, увімкніть на сервері IncludeExceptionDetailInFaults (від ServiceBehaviorAttribute або від поведінки конфігурації), щоб повернути клієнту інформацію про винятки, або ж увімкніть трасування відповідно до документації Microsoft .NET Framework 3.0 SDK і перевірити журнали слідів сервера.

Це заплутано, оскільки я працюю .NET 4.0.

Де я включаюсь IncludeExceptionDetailInFaults? Я борюся, щоб знайти його.

Відповіді:


265

Визначте поведінку у вашому .configфайлі:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    ...
  </system.serviceModel>
</configuration>

Потім застосуйте поведінку до вашої служби наступним чином:

<configuration>
  <system.serviceModel>
    ...
    <services>
      <service name="MyServiceName" behaviorConfiguration="debug" />
    </services>
  </system.serviceModel>
</configuration>

Ви також можете встановити це програмно. Дивіться це питання .


1
Привіт, Otivel, я мою справу, є вкладені папки, що містять різні сайти та служби. Папка, в якій знаходиться моя служба, і я отримую помилку, знаходиться на третьому ступені вкладеності відносно основного веб-додатка, і я виділив web.config для кожної служби. Я відповідно змінюю відповідний web.config, щоб додати <serviceDebug includeExceptionDetailInFaults = "true" />. Але я все одно отримую помилку. Чи потрібно мені змінити всю web.config у повному веб-додатку?
MaxRecursion

2
@AkshayKulkarni: Не впевнений, у мене немає досвіду вашої справи. Спершу переконайтеся, що ваші служби мають посилання на службу поведінки (перевірте відповідь gagogra ). Якщо це не вирішує проблему, будь ласка, поставте запитання на ТАК.
Otiel

1
@MatthewLock: оновлена ​​відповідь. Також перевірте <поведінка> та <сервіс>, якщо вам потрібні додаткові відомості.
Otiel

1
Visual Studio каже мені, що serviceBehaviors не може бути безпосередньою системою system.serviceModel. Закінчився з відповіді rich.okelly.
andrewb

3
Примітка: VS2013 ставить тег <serviceDebug> у веб-конфігурацію Web.config за замовчуванням та встановлює значення false. Якщо ви не помічаєте, як я цього не зробив, і додайте XML вище, мабуть, те, що остання у файлі, виграє. Сподіваюся, це корисно комусь там.
Джефф

63

Це у файлі app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>

9
Не встановлюйте атрибут імені <behavior> (як у відповіді @Otiel), якщо ви хочете, щоб він застосовувався до всіх ваших служб.
Пашек

47

Якщо ви хочете зробити це за кодом, ви можете додати поведінку так:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

Додайте це до свого ServiceHostоб'єкта: Приклад:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

Ви також можете встановити його в тезі [ServiceBehavior] над декларацією класу, що успадковує інтерфейс

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}

Безсмертний блакитний правильний у тому, що не розголошує відомості про вилучення у публічно випущеній версії, але для цілей тестування це зручний інструмент. Під час вивільнення завжди вимикайте назад.


Я використовував це в додатку, який працює на бекенді і ніколи не буде публічним для перегляду, тому це працює чудово
AlbatrossCafe

4

Я також отримував ту саму помилку, WCF працював належним чином для мене, коли я використовував її в середовищі Dev за допомогою моїх облікових даних, але коли хтось інший використовував її в TEST, він кидав ту саму помилку. Я провів багато досліджень, а потім замість того, щоб робити оновлення конфігурації, обробляв виняток у методі WCF за допомогою винятку помилок. Також особу для WCF потрібно встановити з тими ж обліковими даними, які мають доступ до бази даних, хтось, можливо, змінив ваші повноваження. Будь ласка, знайдіть нижче код для того ж:

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    ForDataset GetCCDBdata();

    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    string GetCCDBdataasXMLstring();


    //[OperationContract]
    //string GetData(int value);

    //[OperationContract]
    //CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

  [DataContract]
public class ServiceData
{
    [DataMember]
    public bool Result { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
    [DataMember]
    public string ErrorDetails { get; set; }
}

у вашому service1.svc.cs ви можете використовувати це у блоці вилову:

 catch (Exception ex)
        {
            myServiceData.Result = false;
            myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
            myServiceData.ErrorDetails = ex.ToString();
            throw new FaultException<ServiceData>(myServiceData, ex.ToString());
        }

І використовуйте це в додатку Клієнт, як наведено нижче:

  ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();

            string str = obj.GetCCDBdataasXMLstring();

        }

        catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
      {
          Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
          Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
          Console.ReadLine();
      }

Просто спробуйте це, це допоможе напевно отримати точну проблему.


4
НЕ слід викривати основні деталі виключення. Вся мета розмежування винятків між клієнтом та сервером та взагалі необхідністю цього прапора - запобігти наданню клієнтові інформації про виключення. Зловмисний користувач може використовувати цю інформацію для маніпулювання вашою послугою! Якщо ви розробляєте, використовуйте поведінку IncludeExceptionDetailInFaults, як описано, для розповсюдження цілого винятку або під час розгортання, піднімайте помилку про помилку, що дає дуже основну помилку, наприклад, "Неможливо зберегти файл", а не давати слід стеку та повну інформацію про виняток.
Безсмертний блакитний

Привіт .. у моєму випадку всі інші сервісні функції викликаються функцією, яка ім, що використовується для збереження файлу, кидає це виняток ... щоб знати точну проблему, яку я використовував систему реєстрації, але для цього методу не створюється журнал ... я створюю 3 журнали 1), коли служба потрапляє 2) перед збереженням будь-якого файлу та 3) журнал виключень.
user3217843

0

Оскільки інформація про помилку сказана спочатку, будь ласка, спробуйте збільшити значення тайм-ауту як на стороні клієнта, так і на стороні сервісу наступним чином:

<basicHttpBinding>
    <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647"
      openTimeout="00:20:00" 
      receiveTimeout="00:20:00" closeTimeout="00:20:00"
      sendTimeout="00:20:00">
      <readerQuotas maxDepth="32" maxStringContentLength="2097152"
        maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
    </binding>

Тоді, будь ласка, не забудьте застосувати цю конфігурацію прив’язки до кінцевої точки, виконавши наступне:

<endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding_ACRMS"
      contract="MonitorRAM.IService1" />

Якщо вищесказане не може допомогти, то буде краще, якщо ви можете спробувати завантажити тут свій основний проект, то я хочу мати тест у себе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.