在服务器上打开IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或来自<serviceDebug>configuration行为)

我有一个完美的WCF服务,而且有些事情已经改变,我不知道是什么。

我得到这个例外:

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

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

我在哪里打开IncludeExceptionDetailInFaults ? 我正在争取find它。

.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 }); 

你也可以在inheritance接口的类声明上面的[ServiceBehavior]标签中设置它

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

Immortal Blue在向公开发布版本披露豁免详情是正确的,但出于testing目的,这是一个方便的工具。 释放时总是closures。

我也遇到了同样的错误,当我在开发环境中使用凭据时,WCF正在为我正常工作,但是当其他人在TEST中使用它时,它也抛出了相同的错误。 我做了大量的研究,然后,而不是做configuration更新,在故障exception的帮助下处理WCF方法中的exception。 此外,WCF的身份需要使用与数据库访问相同的凭据进行设置,有人可能已经改变了您的权限。 请在下面find相同的代码:

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

那么请不要忘记通过执行以下操作将此绑定configuration应用于端点:

 <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_ACRMS" contract="MonitorRAM.IService1" /> 

如果上述不能帮助,那么如果你可以尝试在这里上传你的主项目会更好,那么我想在我身边进行testing。