3

是否有支持自托管和网络托管(同时)的最佳实践?

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

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

4

3 回答 3

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 项目,它以托管以后不可知的方式构建。可以给你一个提示。

于 2013-02-01T14:07:11.973 回答
4

您不应在任何 Web API 项目中使用 HttpContext.Current。您需要的一切都应该在 HttpRequestMessage.Properties 中。我不知道 Self-host 有任何 DI 问题,我知道您可以在 Self-host 中使用 Unity 没有任何问题。

于 2013-01-31T16:23:09.410 回答
0

WebAPI 有不同的管道,它们使用 HTTPHandler。这是一个较低的水平。因此,使用 HTTPContext.Current 不是一个好主意。

于 2014-10-14T12:57:31.903 回答