Web Api与Web托管和自托管

时间:2013-01-31 10:27:33

标签: asp.net-web-api web-hosting self-hosting

是否有支持自助和网络托管(同时)的最佳做法?

我必须解决许多问题。在自托管autofac下无法正常工作,因为未设置HttpContext.Current并且无法在自托管中访问GlobalConfiguration。

还有其他问题需要注意吗?

3 个答案:

答案 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不是一个好主意。