在我的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.Envelope
是EnvelopeVersion.None
。
2)獲取元數據請求。這有點棘手,它取決於我們是否使用MEX。 因此,如果我們使用MEX,則請求將執行到.svc/mex端點,其消息類型將爲System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage
,reply.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);
}
}
我已經使用serviceModel節的內容升級了我的問題。 – 2011-01-21 10:40:49