在服务器上打开IncludeExceptionDetailInFaults(通过ServiceBehaviorAttribute或<serviceDebug>配置行为)


157

我有一个运转良好的WCF服务,但情况有所变化,我不知道是什么。

我得到这个例外:

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

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

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

Answers:


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>

您也可以通过编程设置它。看到这个问题


1
嗨,Otivel,我的情况是有包含不同站点和服务的嵌套文件夹。我的服务所在的文件夹,并且我遇到错误,相对于主Web应用程序,它处于嵌套的第三级,并且我为每个服务都有专用的web.config。我相应地更改了相应的web.config,以添加<serviceDebug includeExceptionDetailInFaults =“ true” />。但是我仍然遇到错误。我需要在完整的Web应用程序中更改所有web.config吗?
MaxRecursion 2012年

2
@AkshayKulkarni:不确定,我对您的案件没有经验。确保您的服务首先引用serviceBehavior(检查gagogra答案)。如果那不能解决问题,请在SO上提问。
Otiel 2012年

1
@MatthewLock:更新的答案。另外,如果需要更多详细信息,请检查<behavior><service>
Otiel

1
Visual Studio告诉我,serviceBehaviors不能是system.serviceModel的直接子级。最终得到了rich.okelly的回答。
andrewb 2013年

3
注意:VS2013将<serviceDebug>标记放入默认的Web.config中,并将其设置为false。如果您没有注意到我没有注意,则在文件中最后添加的XML显然会获胜。希望这对外面的人有用。
杰夫

63

在app.config文件中。

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

9
如果您希望将其应用于所有服务,请不要设置<behavior>的名称属性(如@Otiel答案中所示)。
Pashec'1

47

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

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

将此添加到您的ServiceHost对象实例:示例:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

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

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

不朽蓝是正确的,因为它没有公开公开版本的细节,但是出于测试目的,这是一个方便的工具。释放时请务必关闭电源。


我在后端运行的应用程序中使用了该应用程序,该应用程序将永远不会公开可见,因此非常有效
AlbatrossCafe

4

我也遇到了同样的错误,当我使用自己的凭据在开发环境中使用WCF时,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传播整个异常,或者在部署中,提出一个FaultException,给出一个非常基本的错误,例如“无法保存文件”,而不是给出堆栈跟踪和完整的详细信息。例外。
不朽的蓝色

嗨..在我的情况下,所有其他服务函数都被该函数调用,我用来保存文件的函数抛出该异常...以了解我使用日志记录系统的确切问题,但没有为该方法创建日志...即时消息创建3日志1)服务击中2)保存任何文件之前3)异常日志。
user3217843 '16

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

如果以上方法不能解决问题,那么可以尝试在此处上传主项目会更好,那么我想进行一次测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.