在服务器上打开 IncludeExceptionDetailInFault (来自 ServiceBehavior orAttribute 或 < serviceDebug > 配置行为)

我有一个周转基金服务,一直工作得很好,有些事情已经改变了,我不知道是什么。

我有个例外:

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

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

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

344583 次浏览

它在 app.config 文件中。

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

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

也可以通过编程方式设置它。

我也得到了同样的错误,当我在 Dev Environment 中使用它和我的凭证时,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();
}

只要试试这个,它将肯定有助于得到确切的问题。

如果希望通过代码实现这一点,可以添加如下行为:

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

您还可以在继承接口的类声明上面的[ ServiceBehavior ]标记中设置它

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

不朽蓝色没有向公开发布的版本披露异常细节是正确的,但是出于测试目的,这是一个方便的工具。释放时总是关闭。

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

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

如果以上不能帮助,它会更好,如果你可以尝试上传你的主要项目在这里,然后我想有一个测试在我的身边。