【问题标题】:Web Api with Web-Hosting and Self-Hosting具有 Web 托管和自托管的 Web Api
【发布时间】:2013-01-31 10:27:33
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Autofac 在自主机上工作得很好,不确定 OP 的建议是什么
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 2015-01-09
        • 2017-11-17
        • 1970-01-01
        相关资源
        最近更新 更多