WCF客户端未从服务获取异常

WCF客户端未从服务获取异常,wcf,Wcf,我有一个WCF服务,它的includeExceptionDetailInFaults设置为true。在SOAP UI中测试服务时,我可以看到响应包含错误: <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <HelpLink i:nil="tr

我有一个
WCF
服务,它的
includeExceptionDetailInFaults
设置为true。在
SOAP UI
中测试服务时,我可以看到响应包含错误:

<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel"    xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <HelpLink i:nil="true"/>
   <InnerException i:nil="true"/>
   <Message>Invalid Session Protocol</Message>

无效会话协议
然而,我的客户只是选择了一个非常乏味的问题

远程服务器返回意外响应:(400)错误请求

信息。因此,我必须在客户机中执行一些操作,以使其能够读取来自服务的响应

我的服务配置如下:

<system.serviceModel>
   <client>
      <endpoint 
          address="http://az00439/DRGDataService/StoreDataDotNet.svc" 
          binding="basicHttpBinding" bindingConfiguration="" 
          contract="DRGDataService.IStoreDataDotNet" 
          name="DotNetClient" kind="" endpointConfiguration="">
          <identity>
              <certificateReference storeName="My" storeLocation="LocalMachine" 
                                    x509FindType="FindBySubjectDistinguishedName"/>
          </identity>
      </endpoint>
   </client>
   <bindings>
      <basicHttpBinding>
         <binding name="basicBinding">
            <security mode="TransportCredentialOnly">
            </security>
         </binding>
      </basicHttpBinding>
      <webHttpBinding>
         <binding name="webBinding">
             <security mode="Transport">
                <transport clientCredentialType="None"/>
             </security>
         </binding>
      </webHttpBinding>
   </bindings>
   <behaviors>
      <endpointBehaviors>
         <behavior name="AspNetAjaxBehavior">
            <enableWebScript/>
         </behavior>
         <behavior name="webEndpoint">
             <webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" 
                      helpEnabled="true"/>
         </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
         <behavior name="StoreDataBehaviour">
             <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
             <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"  
                           httpsHelpPageUrl="true"/>
         </behavior>
      </serviceBehaviors>
   </behaviors>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true"  
                              multipleSiteBindingsEnabled="true"/>
   <services>
       <service behaviorConfiguration="StoreDataBehaviour" name="DRGDataLibrary.StoreData">
          <host>
             <baseAddresses>
                 <add baseAddress="https://az00439/DRGDataService/StoreData.svc"/>
             </baseAddresses>
          </host>
          <endpoint name="StoreDatawebHTTPBindingEndpoint"  
              address="" 
              behaviorConfiguration="AspNetAjaxBehavior" 
              binding="webHttpBinding" bindingConfiguration="webBinding" 
              contract="DRGDataLibrary.StoreData" />
   </service>
   <service name="DRGDataLibrary.StoreDataDotNet"
       behaviorConfiguration="StoreDataBehaviour" >
       <host>
          <baseAddresses>
               <add baseAddress="https://az00439/DRGDataService/StoreDataDotNet.svc"/>
               <add baseAddress="http://az00439/DRGDataService/StoreDataDotNet.svc"/>
          </baseAddresses>
       </host>
       <endpoint name="StoreDataDotNetWebHttpEndpoint" 
           address="" 
           behaviorConfiguration="webEndpoint"
           binding="webHttpBinding" bindingConfiguration="webBinding"  
           contract="DRGDataLibrary.IStoreDataDotNet" />

       <endpoint name="StoreDataDotNetBasicHttpEndpoint" 
           address="http://az00439/DRGDataService/StoreDataDotNet.svc" 
           behaviorConfiguration=""
           binding="basicHttpBinding" bindingConfiguration="basicBinding" 
           contract="DRGDataLibrary.IStoreDataDotNet" />
       </service>
    </services>
</system.serviceModel>

(在这个配置中有相当一部分内容,因为我使用SSL并对服务进行JS调用)

谢谢


尼克·赖特(Nick Wright)

您捕获的异常类型是什么?如果它只是一个非通用的
故障异常
,则无法访问服务提供的任何特定于故障的详细信息

当您启用
includeExceptionDetailInFaults
时,WCF似乎使用数据协定对您在SoapUI中看到的信息进行编码,这意味着您应该能够通过捕获
FaultException
并检查异常的
Detail
属性来获取它


综上所述,使用
includeExceptionDetailInFaults
仅用于调试,并且使用自定义故障契约和
IErrorHandler
-因此您的客户是否应该依赖
ExceptionDetail
中的信息是值得怀疑的。

嗨-谢谢您的回答。我还没有机会回到这个话题上,但我会在我做的时候尝试你的建议。