我搜索的地方到处都没有提及该键的定义位置,或者类似的名称,例如HTTP_X_FORWARDED_FOR
,REMOTE_ADDR
等。
multi-output framework notebook没有提及任何有用的内容。我想到的唯一有用的东西是一些堆栈溢出问题(MSDN documentation和this),以及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_ADDR
,HTTP_X_FORWADED_FOR
以及它们的定义位置,因此我可以查看所有其他键,以及它们的实现/正确用法的详细信息。
我知道以下 this ,但是此处未提及此处使用的键。 ( REMOTE_ADDR 除外)
答案 0 :(得分:5)
我想找到文档,其中详细解释了MS_HttpContext的功能/内容
https://referencesource.microsoft.com/上没有描述System.Web.Http。*程序集。
但是,所有这些项目现在都以Open的形式托管在GitHub上了吗?来源https://github.com/aspnet/AspNetWebStack。 到目前为止,我假设在将System.Web-> HttpContext分配给System.Web.Http-> Request的例程中使用了此常数/键。
另一个事件与CORS和测试有关。您可以克隆此存储库,并在寻找详细信息时深入搜索“ 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";
...
}
}