【发布时间】:2013-01-31 10:27:33
【问题描述】:
是否有支持(同时)自托管和网络托管的最佳做法?
我必须解决许多问题。自托管下 autofac 无法正常工作,因为 HttpContext.Current 未设置,并且自托管中无法访问 GlobalConfiguration。
还有其他需要注意的问题吗?
【问题讨论】:
标签: asp.net-web-api web-hosting self-hosting
是否有支持(同时)自托管和网络托管的最佳做法?
我必须解决许多问题。自托管下 autofac 无法正常工作,因为 HttpContext.Current 未设置,并且自托管中无法访问 GlobalConfiguration。
还有其他需要注意的问题吗?
【问题讨论】:
标签: asp.net-web-api web-hosting self-hosting
看看这个答案: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地址,我可以随时通过HttpRequestMessage实例的Properties[ApiCommonRequestKeys.UserHostAddressKey]到达。
看看这个项目:https://github.com/tugberkugurlu/PingYourPackage 这是一个很好的 ASP.NET Web API 项目,它以托管以后不可知的方式构建。可能会给你一个提示。
【讨论】:
您不应在任何 Web API 项目中使用 HttpContext.Current。您需要的一切都应该在 HttpRequestMessage.Properties 中。我不知道 Self-host 有任何 DI 问题,我知道您可以在 Self-host 中使用 Unity 没有任何问题。
【讨论】:
WebAPI 有不同的管道,它们使用 HTTPHandler。这是一个较低的水平。因此,使用 HTTPContext.Current 不是一个好主意。
【讨论】: