簡體   English   中英

是否有使用屬性修改 WCF 操作行為的標准方法?

[英]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 服務本身使用屬性,只需檢查以下類:

  • ServiceContractAttributeOperationContractAttribute合同屬性
  • MessageContractAttriubte , MessageHeaderAttriubte , MessageBodyMemberAttribute
  • WebGetAttribute , WebInvokeAttribute
  • ServiceBehaviorAttributeOperationBehaviorAttribute行為屬性、 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 種方法。

  1. 應用調度行為()
  2. 添加綁定參數()
  3. 應用客戶端行為()
  4. 證實()

您將完全控制通信的每個部分。 您可以使用參數和消息檢查器進行更精確的控制。

更多信息請參考: IOOperationBehavior 接口

在每次服務操作之前,您都需要檢查安全或授權類型的東西,那么您可能需要實現自定義System.ServiceModel.ServiceAuthorizationManager

對於一般行為的事情,您可以添加自定義IEndpointBehaviorIOperationBehavior擴展。

如果你真的想控制一切,你可以實現一個自定義的IServiceInvokerExtension ,你可以在其中檢查為自定義屬性調用的方法,並在實際服務方法調用之前/之后調用自定義方法(如假 AOP)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM