Включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации <serviceDebug>) на сервере - PullRequest
153 голосов
/ 29 ноября 2011

У меня есть служба WCF, которая отлично работает, и что-то изменилось, и я не знаю, что.

Я получаю это исключение:

System.ServiceModel.FaultException: серверу не удалось обработать запрос из-за внутренней ошибки. Для получения дополнительных сведений об ошибке либо включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации) на сервере, чтобы отправить информацию об исключении обратно клиенту, либо включите трассировку согласно документации Microsoft .NET Framework 3.0 SDK и проверьте журналы трассировки сервера.

Это сбивает с толку, потому что я использую .NET 4.0.

Где мне включить IncludeExceptionDetailInFaults? Я сражаюсь, чтобы найти его.

Ответы [ 6 ]

254 голосов
/ 29 ноября 2011

Определите поведение в вашем .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>

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

60 голосов
/ 29 ноября 2011

Он находится в файле app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>
43 голосов
/ 30 января 2014

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

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
24 голосов
/ 10 октября 2014

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

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

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

4 голосов
/ 08 мая 2013

Я также получал ту же ошибку, 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();
      }

Просто попробуйте это, это поможет точно определить проблему.

0 голосов
/ 16 февраля 2016

Как говорится в информации об ошибке, попробуйте увеличить значение тайм-аута как на стороне клиента, так и на стороне обслуживания, следующим образом:

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

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

...