2013-01-31 121 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不是一个好主意。