[英]Is there a standard way to use attributes to modify how WCF operations behave?
我現在正在編寫一些時髦的代碼,我一直在想是否可以使用attributes
來修改 WCF 操作的行為方式,比如讓它執行額外的檢查或讓它跳過一些邏輯。
例如,如果我們有以下請求信封:
[MessageContract]
public class UserRequest
{
[MessageBodyMember]
public string SessionKey { get; set; }
[MessageBodyMember]
public UserModel User { get; set; }
}
以及以下服務操作:
[ForceSession]
void AddUser ( UserRequest request )
{
}
void EditUser ( UserRequest request )
{
}
我們可以在AddUser
操作上有一些自動功能,檢查請求的 session 鍵是否存在於當前HttpContext
中。 可能相當於檢查HttpContext.Current.Session[request.SessionKey] != null
,為此它要么拒絕呼叫(發送一個空的響應信封)或處理它。
當然,我可以在每個重要的操作開始時添加檢查代碼,但這可能會很快重復,尤其是在我處理大量操作的情況下。
我應該如何 go 來實現類似的東西?
WCF 服務本身使用屬性,只需檢查以下類:
ServiceContractAttribute
、 OperationContractAttribute
合同屬性MessageContractAttriubte
, MessageHeaderAttriubte
, MessageBodyMemberAttribute
WebGetAttribute
, WebInvokeAttribute
ServiceBehaviorAttribute
、 OperationBehaviorAttribute
行為屬性、 CallbackBehaviorAttriubte
行為屬性ServiceKnownTypeAttribute
, FaultContractAttriubte
DataContractFormatAttribute
, XmlSerializerFormatAttribute
TransactionFlowAttribute
, DeliveryRequirementsAttribute
AspNetCompatibilityRequirementsAttribute
這些屬性會影響 WCF 處理,但 WCF 還提供較大的可擴展性 model 具有多個注入點,您可以通過在自定義屬性中實現這些接口中的任何一個來添加自己的處理:
IServiceBehavior
- 影響整個服務IEndpointBehavior
- 影響單個端點IOperationBehavior
- 影響單個操作IContractBehavior
- 影響單個服務或數據合同這些行為可以包含一些邏輯或添加一些其他更高級的自定義功能,例如:
IParameterInspector
- 例如操作的自定義參數驗證IDispatchMessageFormater
- 處理服務器端的序列化和反序列化IClientMessageFormater
- 在客戶端處理序列化和反序列化IDispatchMessageInspector
- 服務器端的消息修改或驗證IClientMessageInspector
- 客戶端的消息修改或驗證IDispatchOperationSelector
- 選擇在服務器端處理傳入消息的操作IClientOperationSelector
- 基於代理方法調用可以 select 從客戶端調用不同的操作IOperationInvoker
- 調用操作 - 允許使用操作參數,例如添加未在消息中傳遞但存儲在本地的其他參數IErrorHandler
- 全局錯誤處理IInstanceContextProvider
- 自定義實例上下文處理 - 如果要在 WCF 中實現自定義 session 處理的基礎IInstanceProvider
- 自定義服務實例生命周期處理如您所見,WCF 的可擴展性非常大 - 恕我直言,ASP.NET MVC 是整個 .NET 框架中最好的(至少在我經常使用的部分中)。 此外,自定義行為只是 WCF 可擴展性的一部分。 第二部分處理自定義綁定和通道。
如果您想了解更多關於 WCF 擴展性檢查
但這是你需要的嗎? 首先檢查現有屬性是否已經為您提供了您正在尋找的功能。 接下來想想 session - ASP.NET session 是不正常提供給 ZFB608636129CB469B63E521 服務的。 您必須打開 AspNetCompatibility,然后您將 WCF 服務降級為 ASMX 服務。 Even after that you can have problems with ASP.NET session because the information about session is transferred in cookie and WCF by default doesn't use them.
最后,如果您只需要一些自定義屬性來為選定的方法添加邏輯,它更像是 AoP(面向方面編程)的場景,可以通過幾個 IoC(控制反轉)容器(如 MS Unity、Windsor Castle 或春天.NET。 另一種選擇是純 AoP 框架 - PostSharp。
對於 Unity 的 AoP,您可以查看 MSDN 雜志上 Dino Esposito 的幾篇文章:
對於 Spring.NET,只需查看其出色的文檔即可。 我沒有在 Windsor 中使用 AoP,但您會在 Internet 上找到很多文章。 PostSharp 是唯一提到的商業工具。 它有一個功能集較小的免費版本,但您會發現您需要的功能僅在商業版本中。
是的。 您需要創建一個實現 IOperationBehavior 和 Attribute 的自定義操作行為。
IOperationBehavior 要求您實現 4 種方法。
您將完全控制通信的每個部分。 您可以使用參數和消息檢查器進行更精確的控制。
更多信息請參考: IOOperationBehavior 接口。
在每次服務操作之前,您都需要檢查安全或授權類型的東西,那么您可能需要實現自定義System.ServiceModel.ServiceAuthorizationManager
對於一般行為的事情,您可以添加自定義IEndpointBehavior或IOperationBehavior擴展。
如果你真的想控制一切,你可以實現一個自定義的IServiceInvokerExtension
,你可以在其中檢查為自定義屬性調用的方法,並在實際服務方法調用之前/之后調用自定義方法(如假 AOP)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.