2011-01-20 38 views
5


在我的WCF項目中,我需要在響應中使用自定義標頭,所以我實現了IDispatchMessageInspector。老實說,所有的作品都很好,但我對一件小事感到不安。
事情是,即使當我打開我的.svc頁面或將服務加載到WCF Test Client時,BeforeSendReply和AfterReceiveRequest都會觸發。
所以,第一個問題:這種行爲是否正常?有沒有一些方法來處理聲明(也許一些web.config技巧)?
目前我使用下面的代碼:IDispatchMessageInspector:提高BeforeSendReply功能

public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if (reply.Properties.Any(x => x.Key == "httpResponse")) 
      return; 

     MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
     reply.Headers.Add(header);   
    } 

所以現在我處理這不是通過使用服務呼叫轉接:

if (reply.Properties.Any(x => x.Key == "httpResponse")) 
    return; 

但我敢肯定有其他更好的辦法來解決這個問題。 所以我的主要問題:請建議我一個更好的方式來處理描述的情況。
在此先感謝!

更新1
我system.serviceModel部分

<system.serviceModel>  
    <services>   
     <service behaviorConfiguration="someBehavior" name="serviceName"> 
      <endpoint address="" binding="basicHttpBinding" contract="my contract" /> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services>  
    <behaviors> 
     <serviceBehaviors>    
      <behavior name="someBehavior"> 
       <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>     
       <serviceDebug includeExceptionDetailInFaults="false"/> 
       <exceptionInspector/>     
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <extensions> 
     <behaviorExtensions> 
      <add name="exceptionInspector" type="class which implements BehaviorExtensionElement" /> 
     </behaviorExtensions> 
    </extensions> 

</system.serviceModel> 

更新2(接受的解決方案)
我花的問題了一段時間的調查來源,最後我發現,我接受的解決方案。
那麼我發現了什麼:
首先Message是一個抽象類。所以BeforeSendReply每次都會收到不同類型的具體消息。
最常用的是:
1)System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.MetadataOnHelpPageMessage - 意味着客戶端打開svc頁面。結果=衆所周知的HTML格式頁面,包含有關svc服務的常用信息。對於這種類型reply.Version.EnvelopeEnvelopeVersion.None
2)獲取元數據請求。這有點棘手,它取決於我們是否使用MEX。 因此,如果我們使用MEX,則請求將執行到.svc/mex端點,其消息類型將爲System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessagereply.Version.Envelope等於EnvelopeVersion.Soap12
如果我們不使用MEX,客戶端會執行很少的獲取wsdl數據的請求。消息類型將是XMLSchemaMessage
3)執行web方法請求。這隻對我有用。它是System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage並且有reply.Version.Envelope等於EnvelopeVersion.Soap11

我正在使用basicHttpBinding,所以SOAP版本是1.1。所以我的最終代碼應該檢查是答覆有SOAP信封並檢查它的版本。在情況下,如果信封存在,並且有1.1版本那麼我們可以相當肯定,我們有Web方法調用和自定義標題可能會增加:

 public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if(reply.Version.Envelope == EnvelopeVersion.Soap11) 
     {    
      MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
      reply.Headers.Add(header);   
     } 
    } 

回答

2

我似乎記得一個IDispatchMessageInspector將爲所有郵件運行,包括HTTP請求元數據(WSDL),暴露在相同的端點。你沒有提到你如何註冊你的檢查員,所以也可能是相關的。

除了檢查,您是否嘗試檢查消息包含什麼?例如,包含服務HTML頁面的消息可能具有MessageVersion == MessageVersion.None。同樣,與消息相關的操作也可能有用。

+1

我已經使用serviceModel節的內容升級了我的問題。 – 2011-01-21 10:40:49