在服务器上打开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。