2013-08-18 23 views
1

當我嘗試拋出FaultException<T>時,如果手動生成消息,我會得到正確的SOAP消息。但是,當我從服務器上的方法中拋出FaultException<T>時,我沒有收到正確的SOAP消息。 SOAP消息的頭/動作值爲http://www.w3.org/2005/08/addressing/soap/fault,並且我的Body/Fault/Detail元素完全丟失。WCF Generic FaultException未填充SOAP正文詳細元素

請看看我的代碼的重要部分。

服務合同

[ServiceContract(Namespace = "http://namespace.com/fault")] 
public interface IFaultService 
{ 
    [OperationContract(IsOneWay = false)] 
    [FaultContract(typeof (MyFault))] 
    void ThrowFaultException(); 
} 

實施 (該message_fault和消息是手動進行測試僅創建)

public class FaultService : IFaultService 
{ 
    public void ThrowFaultException() 
    { 
     var fault = new MyFault("This is from the service"); 
     var fault_exception = new FaultException<MyFault> 
      (fault, 
      "Fault Service Reason", 
      FaultCode.CreateReceiverFaultCode("FaultCodeName","http://namespace.com/fault"), 
      "http://namespace.com/fault/IFaultService/ThrowFaultExceptionMyFaultFault"); 

        var message_fault = fault_exception.CreateMessageFault(); 
     var message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, message_fault, 
              fault_exception.Action); 

     throw fault_exception; 
    } 
} 

數據契約

[DataContract(Namespace = "http://namespace.com/fault")] 
public class MyFault 
{ 
    public MyFault(string Message) 
    { 
     this.Message = Message; 
    } 

    [DataMember] 
    public string Message { get; set; } 
} 

在web.config system.serviceModel部分

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBindingNoSecurity"> 
      <security mode="None"/> 
     </binding> 
     </wsHttpBinding> 
    <services> 
     <service name="FaultService"> 
     <endpoint address="ws" 
        binding="wsHttpBinding" 
        bindingConfiguration="wsHttpBindingNoSecurity" 
        bindingNamespace="http://namespace.com/fault" 
        contract="IFaultService" 
        name="ws"> 
     </endpoint> 
     </service> 
    </services> 
... 
</system.serviceModel> 

手動生成的SOAP消息

{<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://namespace.com/fault/IFaultService/ThrowFaultExceptionMyFaultFault</a:Action> 
    </s:Header> 
    <s:Body> 
    <s:Fault> 
     <s:Code> 
     <s:Value>s:Receiver</s:Value> 
     <s:Subcode> 
      <s:Value xmlns:a="http://namespace.com/fault">a:FaultCodeName</s:Value> 
     </s:Subcode> 
     </s:Code> 
     <s:Reason> 
     <s:Text xml:lang="en-US">Fault Service Reason</s:Text> 
     </s:Reason> 
     <s:Detail> 
     <MyFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://namespace.com/fault"> 
      <Message>This is from the service</Message> 
     </MyFault> 
     </s:Detail> 
    </s:Fault> 
    </s:Body> 
</s:Envelope>} 

但是,遇到是

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
<a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/soap/fault</a:Action> 
<a:RelatesTo>urn:uuid:a3587103-953a-43f6-9691-951c21de8418</a:RelatesTo> 
<ActivityId CorrelationId="23bf0a82-f4ac-4227-85ab-600f6ffe6a6f" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">a0945fa9-f5a3-4958-8682-097a8315f0dc</ActivityId> 
</s:Header> 
<s:Body> 
<s:Fault> 
<s:Code> 
<s:Value>s:Sender</s:Value> 
</s:Code> 
<s:Reason> 
<s:Text xml:lang="en-US">Fault Service Reason</s:Text> 
</s:Reason> 
</s:Fault> 
</s:Body> 
</s:Envelope> 

提前感謝實際的SOAP。

+0

請嘗試通過在web.config文件中添加System.Diagnostics標記來生成svclog文件。所以你會得到確切的問題。 –

+0

感謝您的迴應 - 我沒有在我的示例中包含診斷標記,但我的確在配置中擁有它,並且我無法發現有關此問題的更多信息。 – grefly

回答

1

好,粉筆這一個體驗...

有正被添加到服務代碼,服務的依賴注入的積累過程中的IErrorHandler的實現。 0123'方法的實現將所有異常和故障轉換爲返回給客戶端的非通用故障。

一旦該實現得到解決並且服務引用被刷新,那麼一切都按預期工作。