2010-05-10 75 views
6

我正在實現一個WCF Web服務,它與客戶端的代碼不受控制。 WSDL由客戶端提供。WSDL第一個客戶端不發送SOAPAction的WCF服務器

我使用SvcUtil從WSDL生成C#文件,並且除了討論的錯誤here我沒有問題。

在啓用了SSL的IIS 7.0中託管服務(客戶端要求)後,我試圖讓客戶端向服務發出請求。

在這一點上,我得到了以下錯誤:

The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). 

我覈實,我可以使用該服務發佈的元數據SOAPUI一起提出同樣的要求。這工作得很好。

然後我試圖使用SOAPUI使用客戶端提供的WSDL。這失敗了上面相同的空行爲錯誤。

然後,我連接Wireshark(啓用SSL解密)並驗證從客戶端發送的消息的確沒有SOAPAction,所以看起來這肯定是問題。

因爲我不能改變客戶端是否有辦法讓WCF Web服務與這樣的客戶端進行交互?我猜它需要接受沒有SOAPAction的請求,而是從SOAP信封中的請求對象的類型派生出所需的請求?

回答

18

以下爲我工作(基於this線程):

  1. 下載微軟WCF的例子。
  2. 將下列文件添加到您的項目從WF_WCF_Samples \ WCF \擴展\互操作\ RouteByBody \ CS \服務
    • DispatchByBodyOperationSelector.cs
    • DispatchByBodyBehaviorAttribute.cs
  3. 添加以下屬性到您的接口(在您的ServiceContract旁邊)
    • XmlSerializerFormat
    • DispatchByBodyBehavior
  4. 以下添加到您的服務接口

    [OperationContract(Action = "")] 
    public void DoNothing() 
    { 
    } 
    
  5. 爲我服務的WrapperName和Wrappernamespace是null的所有郵件。我不得不進入DispatchByBodyBehaviorAttribute和編輯ApplyDispatchBehavior()添加以下行來檢查這一點:

    if (qname.IsEmpty) { 
        qname = new XmlQualifiedName(operationDescription.Messages[0].Body.Parts[0].Name, operationDescription.Messages[0].Body.Parts[0].Namespace); 
    } 
    
+0

SPOT ON!我剛花了幾個小時來研究這個問題。我試圖讓我的新WCF Web服務看起來完全相同(從客戶端角度來看)到一個較早的Web服務,並且真的停留在這個上面。我必須指定多個空行爲才能使wsdl與舊版本匹配,但是這打破了WCF。也就是說,直到我找到完美的答案。如果我可以不止一次地讚揚你,我會! – 2010-07-20 18:00:27

+0

很高興我能幫到你。 – 2010-07-20 19:20:02

+0

如果有人實現此解決方案,並且在調試時開始出現錯誤「此消息無法支持操作,因爲它已被讀取」,請參閱我的回覆,這可能有所幫助: http://stackoverflow.com/a/11170390/ 1373170 – 2012-06-23 14:52:40

相關問題