Web Api与Web托管和自托管

use*_*899 3 web-hosting self-hosting asp.net-web-api

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

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

是否还有其他问题需要注意?

tug*_*erk 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在API核心层,我知道,托管层已设置IP地址,我可以通过它达到Properties[ApiCommonRequestKeys.UserHostAddressKey]HttpRequestMessage情况下随时随地.

看看这个项目:https://github.com/tugberkugurlu/PingYourPackage这是一个很好的ASP.NET Web API项目,它以托管后来的不可知方式构建.可能会给你一个提示.