Не удается добавить правила перезаписи в ядро web.config .net

0

Я создал новый веб-проект с ядром.net. Веб-конфигурация по умолчанию выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->

  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

Когда я открываю этот файл конфигурации, я получаю предупреждение:

Элемент 'system.webServer' имеет недопустимый дочерний элемент 'aspNetCore'.

Но это позволило мне создать и запустить мой проект. Мой проект - угловое приложение, поэтому я хочу добавить html5mode. Чтобы сделать это, я должен был бы добавить свои правила перезаписи:

<rewrite>
  <rules>
    <!-- AngularJS Html5model -->
    <rule name="AngularJS Html5model" stopProcessing="true">
      <match url=".*" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      </conditions>
      <action type="Rewrite" url="/index.html" />
    </rule>
  </rules>
</rewrite>

Проблема в том, что, как только я добавлю свои правила в свой файл web.config, вот так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->

  <system.webServer>
    <rewrite>
      <rules>
        <!-- AngularJS Html5model -->
        <rule name="AngularJS Html5model" stopProcessing="true">
          <match url=".*" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          </conditions>
          <action type="Rewrite" url="/index.html" />
        </rule>
      </rules>
    </rewrite>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

Мое приложение перестает работать. Это похоже на то, что он не может понять, что такое статический файл или нет. Любой статический файл не может быть найден сейчас. Глядя на правило, оно статично, что любой файл должен быть перенаправлен на "/". Кто-нибудь знает, как решить эту проблему?

Теги:
asp.net-core

1 ответ

1
Лучший ответ

Похоже, что это известная ошибка и не будет исправлена до конца этого года. Однако есть обходной путь. Мне нужно добавить RouteBuilder в мой класс Startup:

var routeBuilder = new RouteBuilder(app);

routeBuilder.MapGet("{*anything}", context =>
{
    context.Response.Redirect("/index.html");
    return Task.FromResult(0);
});

var routes = routeBuilder.Build();
app.UseRouter(routes);

Это не сработает само по себе, вам нужно добавить:

services.AddRouting();

к методу ConfigureServices. вот мой класс Startup полностью:

public class Startup
{

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRouting();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseDefaultFiles();
        app.UseStaticFiles();

        // Set up our images
        app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"images")),
            RequestPath = new PathString("/images")
        });

        var routeBuilder = new RouteBuilder(app);

        routeBuilder.MapGet("{*anything}", context =>
        {
            context.Response.Redirect("/index.html");
            return Task.FromResult(0);
        });

        var routes = routeBuilder.Build();
        app.UseRouter(routes);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню