2011-02-04 35 views
7

我已經在WCF中編寫了一個簡單的REST API,並且認證機制使用了一個API密鑰。一旦客戶端在請求報頭提交API密鑰,我檢查它在服務器側(在BaseService類中重寫RequestInterceptor類的的ProcessRequest()方法),如下所示:WCF中的HttpContext

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

...

現在我已經在我的REST服務中啓用了aspnet兼容性,但是我仍然無法訪問上面的ProcessRequest覆蓋中的HttpContext對象。 請注意HttpContext可以從服務方法中訪問,但不能在ProcessRequest方法中訪問。

任何想法爲什麼?

回答

1

我已經通過添加以下代碼解決我的問題:

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

這樣做後,我能夠訪問HttpContext對象的ProcessRequest方法。

1

HttpContext可能在WCF頻道堆棧中稍後初始化。請記住,通道攔截器在通道堆棧中運行之前,以及剛收到來自Http通道偵聽器的消息之後。你需要從請求攔截器訪問HttpContext? Http請求作爲與requestContext關聯的消息中的屬性提供。您還可以在消息中的可用屬性包中添加一些存儲值。

謝謝 Pablo。

1

但是,您應該注意到HttpContext.Current不是線程安全的,並且使用一個線程設置的內容可能會被另一個線程修改。

例如兩個請求來到您的服務。您爲第一個請求在RequestInterceptor的HttpContext中添加了一些值。第二個請求等待,直到第一個請求未完成RequestInterceptors。如果第一個請求使用RequestInterceptors完成並傳遞給您的服務,則第二個請求將進入RequestInterceptors,如果第一個請求未完成,則可以訪問由第一個請求設置的HttpContext。這是我遇到的一種問題。