我知道它位于
HttpContext.Request.PathBase
,但是在我有任何HttpContext
(在Startup.cs
)之前我需要它来配置我的cookie。
我的问题:
当 devops 配置应用程序时,他们必须设置路径两次。一旦进入 IIS 应用程序(这样托管就知道应该提供什么)和我的 appsettings.json(这样应用程序就知道在哪里设置 cookie - 多个实例可以在服务器上工作)。我想在 IIS 中配置一次,并将配置传递给我的应用程序。
这里有点混乱,应该澄清一下。
您想在应用程序启动时知道应用程序虚拟路径。但是应用程序虚拟路径是一个托管和特定请求的概念,而不是底层应用程序。托管服务使用此虚拟路径将传入 url 映射到应用程序根目录。在 IIS 中,您可以将多个虚拟路径映射到同一物理目录,例如/myApp1 和 /myApp2 将指向同一个应用程序。您希望在应用程序启动时获得这些路径中的哪一个?
这实际上就是
IHostingEnvironment
接口不提供任何获取应用程序虚拟路径的属性的原因。应用程序处理请求时的另一件事。在这种情况下,请求特定的 URL,ASP.NET 可以在 HttpContext.Request.PathBase
. 中提供请求的虚拟路径
您应该重新考虑您的用例并检查您是否真的需要应用程序虚拟路径来配置 cookie。这可能是XY问题。如果您仍然对 cookie 配置有疑问,请将其制定为一个新问题,并针对您的场景提供具体细节。
可以查看环境变量ASPNETCORE_APPL_PATH。这是 AspNetCoreModule 提供的变量,以便可以正确设置 PathBase。请参阅https://github.com/aspnet/IISIntegration/blob/df88e322cc5e52db3dbce4060d5bc7db88edb8e4/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs#L19
我在自己寻找答案时遇到了这个问题,目前的答案都不适合我(使用环境变量 ASPNETCORE_APPL_PATH 看起来很有希望,但也失败了。)
我的解决方案丑陋但有效:
public static string? GetIISVirtualPath(this WebApplication app)
{
object iServer = app.Services.GetRequiredService<IServer>();
PropertyInfo? pi = iServer.GetType().GetProperty("VirtualPath");
return (pi?.GetValue(iServer) as string)?.ToLower();
}
在源代码中翻找 IIS 下的 IServer 实现具有“VirtualPath”路径属性。所以我在启动时抓住它。
邪恶,因为如果他们愿意,MS 可以改变它,打破这个解决方案,但我暂时接受它。
只需添加,您可以在 Javascript 中使用
@Url.Content("")
来获取虚拟目录基本路径。
<script src="@Url.Content("~/app/myapp.js")" type="text/javascript"></script>