C# 获取ASP.NET核心中的所有服务器变量
我想获取ASP.NET核心中所有服务器变量的列表。回到ASP.NET时代,您可以简单地使用C# 获取ASP.NET核心中的所有服务器变量,c#,asp.net-core,C#,Asp.net Core,我想获取ASP.NET核心中所有服务器变量的列表。回到ASP.NET时代,您可以简单地使用Request.ServerVariables上的列表。据我所知,ASP.NET核心没有类似的结构。您可以这样做: var serverVariables=httpContext.Features.Get(); var value=serverVariables[“AUTH_USER”]; 获取单个用户变量。我还了解从HTTP上下文获取单个变量的扩展方法。但似乎没有一种方法可以在不明确名称的情况下获取所有
Request.ServerVariables
上的列表。据我所知,ASP.NET核心没有类似的结构。您可以这样做:
var serverVariables=httpContext.Features.Get();
var value=serverVariables[“AUTH_USER”];
获取单个用户变量。我还了解从HTTP上下文获取单个变量的扩展方法。但似乎没有一种方法可以在不明确名称的情况下获取所有变量,如下所示:
private const string ServerVariableNames=“应用物理路径、身份验证用户、身份验证类型,…”;
var serverVariables=ServerVariableNames.Split(new[]{',}).Select(name=>new{name,value=serverVariablesFeature[name]);
使用此解决方案,我需要手动列出所有服务器变量
有ALL\uhttp
变量,但该变量只包括请求头,而不包括服务器变量,如server\u NAME
和server\u SOFTWARE
关于如何做到这一点,有什么想法吗?似乎不可能用
IServariablesFeature
获取所有变量。在引擎盖下实现了此接口,检索服务器变量的逻辑如下
string? IServerVariablesFeature.this[string variableName]
{
get
{
if (string.IsNullOrEmpty(variableName))
{
throw new ArgumentException($"{nameof(variableName)} should be non-empty string");
}
// Synchronize access to native methods that might run in parallel with IO loops
lock (_contextLock)
{
return NativeMethods.HttpTryGetServerVariable(_requestNativeHandle, variableName, out var value) ? value : null;
}
}
//... setter
}
:
因此,我认为aspnetcorev2\u inprocess.dll
可能包含一个获取所有变量的函数,但在检查其导出的函数后,我发现只有两种方法可以处理变量http\u get\u server\u variable
和http\u set\u server\u variable
这听起来像是XY问题。为什么需要所有服务器变量?或者任何服务器变量?您将如何处理您一无所知的变量?您使用的变量名特定于IIS,但许多ASP.NET核心应用程序是自托管的,通常在Linux上运行在容器中。其中一些变量,如authenticati在变量方面,在身份验证页面之外甚至都不可用,并且在使用现代身份验证方法时没有任何意义。我只想在失败的请求上记录所有服务器变量。您关于在IIS外部托管的评论就是一个很好的例子,说明了为什么我不想硬编码名称列表。这是一个非常不同的问题真正的问题是如何记录请求和服务器设置,而不是检索服务器变量。您发布的变量不仅特定于IIS,而且特定于某些版本的IIS。IIS Express没有相同的变量。其他主机不会有任何变量。决不应记录密码。您仍然在询问Y,即假定的解决方案,而不是X,如何向日志中添加详细信息。假设的解决方案是错误的,如果服务器没有服务器变量,该解决方案甚至无法工作。这就是为什么称为ServerVariablesFeature。要解决实际问题,请检查例如。包含所需信息。HttpContext中的属性包含任何添加的不常见服务器或请求功能通过服务器或中间件。我必须重复这一点:
服务器变量
仅是IIS特有的功能。它在其他服务器中甚至在调试时都不可用。如果从命令行运行web应用,它将不可用
//...
internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";
[DllImport(AspNetCoreModuleDll)]
private static extern int http_get_server_variable(
NativeSafeHandle pInProcessHandler,
[MarshalAs(UnmanagedType.LPStr)] string variableName,
[MarshalAs(UnmanagedType.BStr)] out string value);
public static bool HttpTryGetServerVariable(NativeSafeHandle pInProcessHandler, string variableName, out string value)
{
return http_get_server_variable(pInProcessHandler, variableName, out value) == 0;
}
//...