不直接。
您看,问题是,当您有一个 .NET-Core 应用程序时,该应用程序在 Kestrell 中运行,而不是 IIS(对于 .NET Core
现在,为了在 IIS 中托管您的 .NET-Core 应用程序,AspNetCoreModule 在 127.0.0.1 端口 X 上使用 Kestrell 启动您的 .NET-Core 应用程序,然后反向代理来自 iis-domain+virtual 目录的流量到 127.0.0.1 上的端口 X(它可能使用 TCP 以外的其他东西)。
问题 1 是,Kestrell 的功能非常有限,这意味着没有虚拟目录。
问题 2 是,与 nginx 不同,IIS 并没有真正正确地进行反向代理,或者我们应该说“完全”。
IIS 可以将 domainxy:80 转发到 127.0.0.1:random 好吧。
但它没有正确执行的是将 domainxy:80/foo 重写为 127.0.0.1:random (图像、标题、json-ajax-results、url、return-url、cookie 等,反之亦然)。
相反,它将 domain:80/foo 重写为 127.0.0.1:random/foo,如果 127.0.0.1:random (Kestrell) 上的服务器不支持虚拟目录,则会出现问题。
因此,如果您想在虚拟目录中运行您的应用程序,您有两个选择(都涉及修改“您的”应用程序 - 如果可以的话):
-
如果您的应用程序仅部署一次,请将所有内容放入目录“foo”(包括 MVC 控制器路由)。
-
正如https://github.com/aspnet/Hosting/issues/416#issuecomment-149046552 中的建议,您可以让应用程序框架为您模拟该文件夹,有点像在 RoR 中:
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
string virtual_directory = "/Virt_DIR";
// virtual_directory = "/";
if (virtual_directory.EndsWith("/"))
virtual_directory = virtual_directory.Substring(0, virtual_directory.Length - 1);
if (string.IsNullOrWhiteSpace(virtual_directory))
Configure1(app, env, loggerFactory); // Don't map if you don't have to
// (wonder what the framework does or does not do for that case)
else
app.Map(virtual_directory, delegate(IApplicationBuilder mappedApp)
{
Configure1(mappedApp, env, loggerFactory);
}
);
}
// Configure is called after ConfigureServices is called.
public void Configure1(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
// [...] (here comes what used to be in your old Configure method)
}
您必须在某处配置虚拟目录的名称。
当您在 JavaScript/ajax-requests 中有/返回 URL 时要小心,它们不会被自动映射。您必须自己执行此操作,但以前使用旧 ASP.NET 也是如此。
真的,就像 RoR:
映射 Rails.application.config.relative_url_root || “/”做
运行 RedmineApp::Application
结束
关于应用程序中的虚拟目录:
不,这不是那么简单。
IIS 是一个完整的网络服务器,它将提供映射目录的内容,就像它在那里一样(如果它可以读取内容)。
如果您将整个父目录转发给 Kestrell,则 IIS 无法为子目录提供服务,而您的应用程序将不得不这样做。这意味着您必须为该特定目录设置一个静态文件服务器,并告诉它文件在哪里,就像您所做的那样。
您可以做的是告诉 IIS 不要代理该特定虚拟子目录(就像您可以在 nginx 中定义静态文件位置一样 - 除非 IIS 可能不支持该功能)。
但是,您可以在应用程序目录中创建指向网络文件夹的符号链接(或挂载/连接),前提是 Windows 能够这样做(mklink)。然后 .NET Core 应该能够静态地为它服务。但实际上,这听起来像是一个 hack。
如果你不能配置 IIS,你真的应该使用 app.UseFileServer() 并定义文档在数据库中的位置。这样您就可以稍后删除并重新插入应用程序。