c# - 为 HttpRequestMessage.Properties 定义的字典键 "MS_HttpContext"在哪里?

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

我到处搜索都没有提到这个键是在哪里定义的,或者类似的,比如 HTTP_X_FORWARDED_FOR, REMOTE_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 除外)

最佳答案

I'd like to find the documentation, which explains what MS_HttpContext does/holds in detail

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

但是,所有这些项目现在都以 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 和测试有关。您可以克隆此存储库并在您正在寻找详细信息的深度中搜索“MS_HttpContext”事件。但是,我不确定它的文档。

where this key is defined, or similar ones such as HTTP_X_FORWARDED_FOR, REMOTE_ADDR etc.

from where does all these dictionary keys come from?

这些请求的属性(又名服务器变量)是根据客户端在此处发送的相应 header 创建的(几乎是复制的)(适用于 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 中不再有这样的属性(仅 header )。

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

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

如果您需要在 ApiController 中检索它,可能会更容易(不要忘记必需的空引用检查和自托管 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";
        ...
    }
}

关于c# - 为 HttpRequestMessage.Properties 定义的字典键 "MS_HttpContext"在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57607314/

相关文章:

c# - Resharper - Go To Implementation list 引用两次

c# - 如何让用户创建任务并设置任务运行的时间?

c# - 重定向到错误页面并显示用户友好错误

c# - C# 中的 FontFamily 问题

c# - 为这个聊天应用程序使用 Ajax(可能与 Web 服务一起使用)

c# - 保护 WCF 服务

c# - 不支持每种类型的多个对象集。对象集 IdentityUsers' 和 Users 都可以包含类型的实例

c# - 没有元数据操作的 Odata 不起作用

c# - 在 Web API 中传递枚举参数的最佳实践

asp.net-web-api - asp.net web api 是否有类似 [Bind(Exclude ="Property")] 的东西?