在服务器上启用 IncludeExceptionDetailInFaults(从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)

问题描述 投票:0回答:7

我有一个一直运行良好的 WCF 服务,但有些东西发生了变化,但我不知道是什么。

我得到这个例外:

System.ServiceModel.FaultException:由于内部错误,服务器无法处理请求。有关错误的详细信息,请在服务器上打开 IncludeExceptionDetailInFaults(从 ServiceBehaviorAttribute 或从配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework 3.0 SDK 文档打开跟踪并检查服务器跟踪日志。

这很令人困惑,因为我正在运行 .NET 4.0。

我在哪里打开

IncludeExceptionDetailInFaults
?我正在努力寻找它。

c# wcf exception wcf-data-services
7个回答
288
投票

在您的 .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>

您也可以通过编程方式进行设置。请参阅这个问题


66
投票

它位于 app.config 文件中。

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

51
投票

如果您想通过代码执行此操作,您可以添加如下行为:

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

30
投票

您也可以在继承接口的类声明上方的[ServiceBehavior]标签中设置

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

Immortal Blue 没有向公开发布的版本披露例外详细信息是正确的,但出于测试目的,这是一个方便的工具。释放时请务必关闭。


4
投票

我也遇到了同样的错误,当我在开发环境中使用我的凭据使用 WCF 时,它对我来说工作正常,但是当其他人在测试中使用它时,它会抛出相同的错误。 我做了很多研究,然后没有进行配置更新,而是借助故障异常处理了 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
投票

首先按照错误信息所述,请尝试增加客户端和服务端的超时值,如下所示:

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

如果以上方法没有帮助的话,如果你可以尝试在这里上传你的主项目会更好,然后我想在我身边进行测试。


0
投票

服务器上的 ServiceBehaviorAttribute 或配置行为),以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪并检查服务器跟踪日志。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.