【问题标题】:Turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自 <serviceDebug> 配置行为)
【发布时间】:2012-01-09 01:55:36
【问题描述】:

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

我得到了这个例外:

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

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

在哪里打开IncludeExceptionDetailInFaults?我正在努力寻找它。

【问题讨论】:

    标签: c# wcf exception wcf-data-services


    【解决方案1】:

    .config 文件中定义一个behavior

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

    您也可以通过编程方式进行设置。见this question

    【讨论】:

    • 您好 Otivel,我的情况是嵌套文件夹包含不同的站点和服务。我的服务所在的文件夹和我收到错误的文件夹是相对于主 Web 应用程序的第三级嵌套,我为每个服务都有专用的 web.config。我相应地更改了相应的 web.config 以添加 。但我仍然收到错误消息。我需要更改完整 Web 应用程序中的所有 web.config 吗?
    • @AkshayKulkarni:不确定,我对你的案子没有经验。确保您的服务首先引用了 serviceBehavior(检查 gagogra 答案)。如果这不能解决问题,请在 SO 上提问。
    • @MatthewLock:更新了答案。另外,如果您需要更多详细信息,请查看<behavior><service>
    • Visual Studio 告诉我 serviceBehaviors 不能是 system.serviceModel 的直接子代。最终得到了rich.okelly的回答。
    • 注意:VS2013 将 标签放在默认的 Web.config 中,并将其设置为 false。如果您没有像我一样注意到并添加上面的 XML,显然文件中最后的内容会获胜。希望这对那里的人有用。
    【解决方案2】:

    它在 app.config 文件中。

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

    【讨论】:

    • 如果您希望将其应用于您的所有服务,请不要设置 的 name 属性(如@Otiel 回答)。
    【解决方案3】:

    如果你想通过代码做到这一点,你可以添加这样的行为:

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

    【讨论】:

    • 将此添加到您的 ServiceHost 对象实例中:示例:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
    【解决方案4】:

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

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

    Immortal Blue 没有向公开发布的版本透露例外细节是正确的,但出于测试目的,这是一个方便的工具。释放时始终关闭。

    【讨论】:

    • 我在后端运行的应用程序中使用了它,并且永远不会公开查看,所以它完美地工作
    【解决方案5】:

    我也遇到了同样的错误,当我在开发环境中使用我的凭据时,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();
          }
    

    试试这个,它肯定会帮助你找到确切的问题。

    【讨论】:

    • 您不应该公开底层异常详细信息。在客户端和服务器之间分离异常以及需要此标志的全部目的是防止异常信息对客户端可用。恶意用户可能会使用此信息来操纵您的服务!如果您正在开发,请使用描述的行为 IncludeExceptionDetailInFaults 来传播整个异常,或者在部署中,引发一个错误异常,给出一个非常基本的错误,例如“无法保存文件”,而不是给出堆栈跟踪和完整的详细信息例外。
    • 嗨..在我的情况下,所有其他服务函数都被我用来保存文件的函数调用,抛出异常......要知道我使用日志记录系统但没有日志的确切问题为该方法创建...我创建 3 个日志 1)当服务命中时 2)在保存任何文件之前和 3)异常日志。
    【解决方案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" />
    

    如果以上都帮不上忙,你可以尝试把你的主项目上传到这里就更好了,那我想在我这边做个测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2014-02-20
      • 2017-08-08
      相关资源
      最近更新 更多