Включите 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>

Вы также можете установить его программно. Смотрите этот вопрос .

Otiel
источник
1
Привет Otivel, в моем случае есть вложенные папки, содержащие различные сайты и сервисы. Папка, в которой находится моя служба, и я получаю сообщение об ошибке, находится на третьей степени вложенности относительно основного веб-приложения, и у меня есть выделенный файл web.config для каждой службы. Я соответственно изменяю свой соответствующий web.config, чтобы добавить <serviceDebug includeExceptionDetailInFaults = "true" />. Но я все еще получаю ошибку. Нужно ли менять весь файл web.config в полном веб-приложении?
MaxRecursion
2
@AkshayKulkarni: Не уверен, у меня нет опыта в вашем деле. Убедитесь, что ваши услуги имеют ссылку на службу поведения (проверьте ответ gagogra ) в первую очередь. Если это не решит проблему, пожалуйста, задайте вопрос о SO.
Отиэль
1
@MatthewLock: обновленный ответ. Кроме того, проверьте <поведение> и <сервис>, если вам нужно больше деталей.
Отиэль
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
Не устанавливайте атрибут имени <поведение> (как в ответе @Otiel), если вы хотите, чтобы он применялся ко всем вашим службам.
Пашек
47

Если вы хотите сделать это с помощью кода, вы можете добавить такое поведение:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
Ян Чжан
источник
Добавьте это к своему ServiceHostэкземпляру объекта: Пример:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Даниэль Бонетти
28

Вы также можете установить его в теге [ServiceBehavior] над объявлением класса, которое наследует интерфейс

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

Immortal Blue прав в том, что не раскрывает подробности исключений для общедоступной версии, но для целей тестирования это удобный инструмент. Всегда выключайте при отпускании.

LievenV
источник
Я использовал это в приложении, которое работает на сервере и никогда не будет доступно для публичного просмотра, так что это отлично работает
AlbatrossCafe
4

Я также получал ту же ошибку, WCF работал правильно для меня, когда я использовал его в среде разработки со своими учетными данными, но когда кто-то еще использовал его в 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:

 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" />

Если вышесказанное не может помочь, будет лучше, если вы попытаетесь загрузить свой основной проект здесь, тогда я хочу провести тест на моей стороне.

Мухаммед Мохсин Мьюнер
источник