是否有支持自托管和网络托管(同时)的最佳实践?
有很多问题我必须解决。在自托管下 autofac 无法正常工作,因为未设置 HttpContext.Current 并且在自托管中无法访问 GlobalConfiguration。
还有其他需要注意的问题吗?
是否有支持自托管和网络托管(同时)的最佳实践?
有很多问题我必须解决。在自托管下 autofac 无法正常工作,因为未设置 HttpContext.Current 并且在自托管中无法访问 GlobalConfiguration。
还有其他需要注意的问题吗?
看看这个答案: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 项目,它以托管以后不可知的方式构建。可以给你一个提示。
您不应在任何 Web API 项目中使用 HttpContext.Current。您需要的一切都应该在 HttpRequestMessage.Properties 中。我不知道 Self-host 有任何 DI 问题,我知道您可以在 Self-host 中使用 Unity 没有任何问题。
WebAPI 有不同的管道,它们使用 HTTPHandler。这是一个较低的水平。因此,使用 HTTPContext.Current 不是一个好主意。