【问题标题】:Where is the dictionary key "MS_HttpContext" defined for HttpRequestMessage.Properties?为 HttpRequestMessage.Properties 定义的字典键“MS_HttpContext”在哪里?
【发布时间】:2019-08-22 10:30:33
【问题描述】:

我到处搜索,但没有提到此键的定义位置,或类似的键,例如 HTTP_X_FORWARDED_FORREMOTE_ADDR 等。

MSDN documentation 没有提到任何有用的东西。我发现的唯一接近有用的是一些堆栈溢出问题(thisthis),以及 this 简短的博文。

可悲的是,这些都没有解决我当前的问题 - 所有这些字典键来自哪里?它们的规范在哪里,以便人们通过查看它们所包含的内容来知道它们的存在并学会利用它们?

编辑:我使用的是 .NET Framework 4.6.0,其中 System.Net.Http 的版本是 4.0.0.0。 要获取客户端 IP,我正在执行以下操作:

public string GetSomeIp(HttpRequestMessage request)
{
    HttpContextWrapper context = 
       request.Properties["MS_HttpContext"] as HttpContextWrapper;

    return (context == null) ? 
       string.Empty : (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
       ?? context.Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();
}

我想查找文档,其中详细解释了 MS_HttpContext 所做/持有的内容,以及 REMOTE_ADDRHTTP_X_FORWADED_FOR 以及它们的定义位置,因此我可以查看所有其他键和更详细地了解它们的实现/正确使用。

我知道以下 server variables,但此处未提及此处使用的密钥。 (REMOTE_ADDR除外)

【问题讨论】:

  • 搜索参考来源:referencesource.microsoft.com
  • @jdweng 当我搜索“MS_HttpContext”时没有弹出任何有用的信息。
  • 试试:_httpcontext
  • @jdweng 我得到了一些结果,但我仍然看不到这些键可能在哪里定义或解释。他们是 Owin 的一部分吗?
  • MS_HttpContext 是人们用来在 WebAPI 应用程序中获取 HttpContext 的 hack。这似乎是一个实现细节,我不相信它会被记录在案。正如@Mikhail 已经回答的那样,其他所有内容都是 IIS 服务器变量,它们在您提供的链接中进行了描述。

标签: c# asp.net asp.net-web-api


【解决方案1】:

我想查找文档,其中详细解释了 MS_HttpContext 所做/持有的内容

https://referencesource.microsoft.com/ 上似乎没有描述 System.Web.Http.* 程序集。

但是,所有这些项目现在都以 Open 形式托管在 GitHub 上?来源https://github.com/aspnet/AspNetWebStack。 到目前为止,我假设这个常量/键在将 System.Web -> HttpContext 分配给 System.Web.Http -> Request 的例程中使用。

https://github.com/aspnet/AspNetWebStack/blob/master/src/System.Web.Http.WebHost/HttpRequestMessageExtensions.cs#L11-L44

另一个事件与 CORS 和测试有关。您可以克隆此 repo 并在您正在寻找详细信息时深入搜索“MS_HttpContext”的出现。但是,我不确定它的文档。

定义此键的位置,或类似的键,例如 HTTP_X_FORWARDED_FOR、REMOTE_ADDR 等。

所有这些字典键是从哪里来的?

这些请求的属性(又名服务器变量)是从客户端发送的相应标头创建的(几乎是重复的)(适用于 HttpContext - ASP.NET WebForms/MVC):

https://referencesource.microsoft.com/#System.Web/HttpRequest.cs,dc76880a3cfd0009

https://referencesource.microsoft.com/#System.Web/HttpRequest.cs,639

顺便说一句,ASP.NET Core 的 HttpRequest 中不再有此类属性(仅限标头)。

如果您需要获取客户端 IP 信息,请使用上述(您的或建议的)链接中的任何方法。

如果您需要检索熟悉的 HttpContext 实例(例如,在 ApiController 之外,例如 DelegatingHandler/aka 中间件),请使用this 中说明的任何方法(也已提及)。

如果您需要在 ApiController 中检索它,它可能会更容易(不要忘记必需的 null ref 检查和自托管 WebAPI 解决方案):

public class YourApiController : ApiController {
    public HttpResponseMessage YourActionName() {
        var request = new HttpContextWrapper(CurrentContext).Request;
        ...
    }
}


public class YourAuditHandler : DelegatingHandler {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        string ipAddress = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "0.0.0.0";
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多