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

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

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

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

Это запутанно, потому что я запускаю .NET 4.0.

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

 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();
      }

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

Ответ 6

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

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

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