RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1232192
Accepted
Andrei Khotko
Andrei Khotko
Asked:2022-01-16 20:26:04 +0000 UTC2022-01-16 20:26:04 +0000 UTC 2022-01-16 20:26:04 +0000 UTC

为 ASP.NET Core 3.1 设置 IIS UrlRewrite 时出现问题

  • 772

将旧的 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。这是证明:

静态文件作为索引 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>
c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Pavel Mayorov
    2022-01-20T01:45:46Z2022-01-20T01:45:46Z

    为什么你需要 UrlRewrite?尝试使用手头的普通编程语言在 XML 文件中编写逻辑看起来很奇怪。这是在没有 UrlRewrite 的情况下如何完成的:

    app.UseStaticFiles();
    
    // Если мы дошли до сюда - значит, запрос уже не соответствует ни одному реальному файлу
    
    app.UseRouting();
    
    app.MapWhen(
        ctx => ctx.GetEndpoint() == null, // Если для запроса не найден маршрут…
        app2 => app2.Use((ctx, next) =>
        {
            ctx.Request.Path = "/index.html"; // …то переписываем URL запроса…
            return next();
        })
        .UseStaticFiles() // …и даём ещё один шанс UseStaticFiles
    );
    
    app.UseEndpoints(…);
    

    此外,您可以简单地转移所有处理而不是 MapWhen(这看起来更简单,但在添加授权时会中断):

    app.UseStaticFiles();
    
    // Если мы дошли до сюда - значит, запрос уже не соответствует ни одному реальному файлу
    
    app.UseRouting();
    app.UseEndpoints(…);
    
    // Если мы дошли до сюда - значит, для запроса не найден маршрут
    
    app.Use((ctx, next) =>
    {
        ctx.Request.Path = "/index.html";
        return next();
    })
    app.UseStaticFiles();
    
    • 2
  2. Best Answer
    Andrei Khotko
    2022-01-19T22:03:52Z2022-01-19T22:03:52Z

    阅读Microsoft 文档中的“何时使用 URL 重写中间件UrlRewrite Middleware”部分令人不快。事实证明,它也不UrlRewrite Middleware支持限制。引用:IsFileIsDirectory

    在 IIS、Apache 和 Nginx 中使用基于服务器的 URL 重写技术的主要原因是:

    中间件不支持这些模块的全部功能。

    服务器模块的某些功能不适用于 ASP.NET Core 项目,例如 IIS 重写模块的IsFile和IsDirectory约束。在这些情况下,请改用中间件。

    因此,就我而言,这些条件不起作用。

    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    

    因为什么,而不是静态文件,我得到index.html. 最有趣的是,ASP.NET Core 2.2这些静态文件和目录规则适用于已经过时的版本。事实证明,当切换到通用主机时,情况发生了很大变化,因此微软决定放弃支持IsFile并IsDirectory

    结果,我决定放弃这个中间件,将UrlRewrite其配置在服务器本身

    • 1

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5