gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:37:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com