是否有支持自助和网络托管(同时)的最佳做法?
我必须解决许多问题。在自托管autofac下无法正常工作,因为未设置HttpContext.Current并且无法在自托管中访问GlobalConfiguration。
还有其他问题需要注意吗?
答案 0 :(得分:6)
看一下这个答案:https://stackoverflow.com/a/13285693/463785这将向您展示如何以托管层不可知的方式构建解决方案。
基本上,将您的ASP.NET Web API逻辑放入一个单独的项目中,正如@DarrelMiller建议的那样,不要在该项目中使用任何托管特定的上下文。甚至不要在此项目中引用不必要的程序集(例如:System.Web
)。但是,您将具有一些托管层特定需求,例如获取使用者的IP地址(这不能通过ASP.NET Web API为您提供)。在这种情况下,请在核心API和托管层之间使用某种合同。
例如,下面一个是消息处理程序,它将为每个请求设置使用者的IP地址,并通过我的WebHost项目注册了此消息处理程序:
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地址,我可以随时通过Properties[ApiCommonRequestKeys.UserHostAddressKey]
实例的HttpRequestMessage
到达它。
看看这个项目:https://github.com/tugberkugurlu/PingYourPackage这是一个很好的ASP.NET Web API项目,它以托管后来的不可知方式构建。可以给你一个提示。
答案 1 :(得分:4)
您不应在任何Web API项目中使用HttpContext.Current。您需要的一切都应该在HttpRequestMessage.Properties中。我不知道自主机有任何DI问题,我知道你可以在没有任何问题的情况下在自主机中使用Unity。
答案 2 :(得分:0)
WebAPI有一个不同的管道,他们使用HTTPHandler。这是一个较低的水平。因此,使用HTTPContext.Current不是一个好主意。