将旧的 c 项目迁移asp net core 2.2到asp net core 3.1. 用作前端Angular。.net core 2.2这是连接IIS 的 UrlRewrite 规则的工作代码。类代码Startup:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseAuthentication();
ConfigureUrlRewriting(app, env);
ConfigureRouting(app);
}
private static void ConfigureUrlRewriting(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() && File.Exists("IISUrlRewrite.xml"))
{
using (var reader = File.OpenText("IISUrlRewrite.xml"))
{
var options = new RewriteOptions().AddIISUrlRewrite(reader);
app.UseRewriter(options);
}
}
}
private static void ConfigureRouting(IApplicationBuilder app)
{
app.UseDefaultFiles(new DefaultFilesOptions
{
DefaultFileNames = new List<string> { "index.html" }
});
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "api/{controller}/{id}");
});
}
从微软迁移到.net core 3.1指南后,代码并没有太大变化:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseAuthentication();
ConfigureUrlRewriting(app, env);
ConfigureRouting(app);
}
private static void ConfigureUrlRewriting(IApplicationBuilder app, IHostEnvironment env)
{
if (env.IsDevelopment() && File.Exists("IISUrlRewrite.xml"))
{
using (var reader = File.OpenText("IISUrlRewrite.xml"))
{
var options = new RewriteOptions().AddIISUrlRewrite(reader);
app.UseRewriter(options);
}
}
}
private static void ConfigureRouting(IApplicationBuilder app)
{
app.UseDefaultFiles(new DefaultFilesOptions
{
DefaultFileNames = new List<string> { "index.html" }
});
app.UseStaticFiles();
// Изменилось только то, что ниже
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "default", pattern: "api/{controller}/{id}");
});
}
浏览器返回文件index.html,但由于某种原因未找到所有静态文件。而是返回index.html。这是证明:
从微软的 UrlRewrite 文档中可以清楚地看出,中间件AddRewriter(rewriter)必须在之前添加AddStaticFiles()。我不明白 .net 核心中可能发生了什么变化,这样一系列添加中间件可能会停止按预期工作。有什么问题?我已经坐了两天了,一直在努力解决这个问题。也许其他 IIS 模块用于 .net core 3.1 并且 xml 语法发生了变化?
以防万一,我将添加文件的内容IISUrlRewrite.xml:
<rewrite>
<rules>
<rule name="AngularJS Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)/" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>

为什么你需要 UrlRewrite?尝试使用手头的普通编程语言在 XML 文件中编写逻辑看起来很奇怪。这是在没有 UrlRewrite 的情况下如何完成的:
此外,您可以简单地转移所有处理而不是 MapWhen(这看起来更简单,但在添加授权时会中断):
阅读Microsoft 文档中的“何时使用 URL 重写中间件
UrlRewrite Middleware”部分令人不快。事实证明,它也不UrlRewrite Middleware支持限制。引用:IsFileIsDirectory因此,就我而言,这些条件不起作用。
因为什么,而不是静态文件,我得到
index.html. 最有趣的是,ASP.NET Core 2.2这些静态文件和目录规则适用于已经过时的版本。事实证明,当切换到通用主机时,情况发生了很大变化,因此微软决定放弃支持IsFile并IsDirectory结果,我决定放弃这个中间件,将
UrlRewrite其配置在服务器本身