2013-01-31 170 views
3

是否有支持自我和網絡託管(同時)的最佳做法?網絡API與網絡託管和自我託管

我必須解決很多問題。在自託管autofac下無法正常工作,因爲未設置HttpContext.Current,並且GlobalConfiguration無法在自託管中訪問。

是否還有其他問題需要注意?

回答

4

您不應該在任何Web API項目中使用HttpContext.Current。你需要的一切應該在HttpRequestMessage.Properties中。我沒有意識到自主服務器有任何DI問題,我知道你可以在沒有任何問題的情況下在自主服務器中使用Unity。

+0

Autofac對自己的主機工作得很好,不知道OP的建議是什麼 –

6

看一看這個答案:https://stackoverflow.com/a/13285693/463785這將向您展示如何以託管層不可知的方式構建您的解決方案。

基本上,把你的ASP.NET Web API邏輯放到一個單獨的項目中,就像@DarrelMiller建議的那樣,不要在該項目中使用任何託管特定的上下文。甚至不要在本項目中引用不必要的程序集(例如:System.Web)。但是,您將擁有一些託管層特定需求,例如獲取消費者的IP地址(這不能通過ASP.NET Web API提供給您)。在這種情況下,在覈心API和託管層之間採用某種合約。

例如,下面一個是消息處理程序將設置消費者的IP地址爲每個請求,我註冊了這個消息處理程序通過我的虛擬主機提供商的項目:

public class UserHostAddressSetterHandler : DelegatingHandler { 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { 

     request.Properties[ApiCommonRequestKeys.UserHostAddressKey] = request.GetUserHostAddress(); 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

internal static class HttpRequestMessageExtensions { 

    internal static HttpContextBase GetHttpContext(this HttpRequestMessage request) { 

     return (HttpContextBase)request.Properties[Constants.MS_HttpContextKey]; 
    } 

    internal static string GetUserHostAddress(this HttpRequestMessage request) { 

     return request.GetHttpContext().Request.UserHostAddress; 
    } 
} 

然後,在API核心層,我知道託管層已經設置了IP地址,我可以隨時通過HttpRequestMessage實例的Properties[ApiCommonRequestKeys.UserHostAddressKey]達到它。

看看這個項目:https://github.com/tugberkugurlu/PingYourPackage這是一個不錯的ASP.NET Web API項目,它已經被託管在以後不可知的方式中。可能會給你一個提示。

0

WebAPI有一個不同的管道,他們使用HTTPHandler。這是一個較低的水平。因此,使用HTTPContext.Current不是一個好主意。