[英]Turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server
我有一个完美的WCF服务,有些东西已经改变,我不知道是什么。
我得到这个例外:
System.ServiceModel.FaultException:由于内部错误,服务器无法处理请求。 有关错误的更多信息,请在服务器上启用IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或配置行为)以将异常信息发送回客户端,或者根据Microsoft .NET Framework 3.0 SDK文档启用跟踪并检查服务器跟踪日志。
这很令人困惑,因为我正在运行.NET 4.0。
我在哪里打开IncludeExceptionDetailInFaults
? 我正在努力寻找它。
在.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>
您也可以通过编程方式进行设置。 看到这个问题 。
它位于app.config文件中。
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="true"/>
如果您想通过代码执行此操作,可以添加如下行为:
serviceHost.Description.Behaviors.Remove(
typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
您也可以在继承接口的类声明上方的[ServiceBehavior]标记中进行设置
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}
Immortal Blue在公开发布的版本中没有公开exeption详细信息是正确的,但出于测试目的,这是一个方便的工具。 释放时始终关闭。
我也得到了相同的错误,当我在Dev环境中使用我的凭据时,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();
}
试试这个,它将有助于确保获得确切的问题。
由于首先说错误信息,请尝试增加客户端和服务端的超时值,如下所示:
<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" />
如果以上情况无济于事,那么如果您可以尝试在此处上传您的主项目会更好,那么我想在我身边进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.