2015-09-07 63 views
0

如何可以創建以下在resfull WCF服務模型創建WCF操作調用

動作行爲將調用,其基於在HTTP請求的報頭傳遞的輸入/值驗證所述自定義動作調用。驗證成功後,用戶將被重定向到實際操作。否則會拋出自定義異常,用戶將被重定向到「訪問被拒絕」頁面。

+0

你必須這樣做嗎? (即通過操作行爲)?你不能使用裝飾器嗎?或者也許是AOP方面? –

+0

我不知道3種方式中的任何一種。請給我一個鏈接來閱讀。 –

回答

0

實現自定義驗證的一種方法是通過服務decorator。考慮下面的代碼:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

public class Service : IService 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

public class ServiceValidationDecorator : IService 
{ 
    private readonly IService m_DecoreatedService; 

    public ServiceValidationDecorator(IService decoreated_service) 
    { 
     m_DecoreatedService = decoreated_service; 
    } 

    public string GetData(int value) 
    { 

     IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest; 

     WebHeaderCollection headers = request.Headers; 

     //Here use the headers to do you custom validation 
     bool valid = ... 

     if(!valid) 
      throw new SecurityException("Access Denied"); 

     return m_DecoreatedService.GetData(value); 
    } 
} 

這裏,WCF合同是IService,原始服務實現是Service類。

ServiceValidationDecorator類是一個裝飾器,它執行自定義驗證,然後將請求傳遞給另一個服務。

現在不需要託管服務類,您需要託管ServiceValidationDecorator類。

WCF將會抱怨ServiceValidationDecorator沒有無參數的構造函數。解決這個問題的正確方法是創建一個自定義實例提供(看看this),然後構建ServiceValidationDecorator對象(例如供應商中)是這樣的:

new ServiceValidationDecorator(new Service()) 

如果你想快速的解決方法只是爲了快速測試這個,簡單地在ServiceValidationDecorator構造函數中構造Service類(這實際上是一個糟糕的設計實踐)。

如果您有很多服務,並且您不想爲每個服務創建裝飾器,請參閱面向方面編程(AOP)。搜索PostSharp或DynamicProxy。