Как можно настроить отображение маршрутов в нижнем регистре (lowercase) в ASP.NET Core Razor Pages (MVC)?

У меня есть проект на <code>asp.net core razor pages</code>, в котором я прописал маршруты для страниц, например: <br/><br/> 
public const string Product1 = "/products/product-1"; <br/> 
<pre><code class="cs">public const string Product2 = "/products/product-2";
public const string Product3 = "/products/product-3";</code></pre> <br/><br/> 
При переходе на одну из страниц адресная строка отображается следующим образом: <br/><br/> 
<code class="cs">https://localhost:5001/Products/Product-1</code> <br/><br/> 
Интересно, что даже если я попробую открыть адрес <b>ниже</b>, он все равно будет заменен на тот, что <b>выше</b>: <br/><br/> 
<code class="cs">https://localhost:5001/PRODUCTS/PRODUCTS-1</code> <br/><br/> 
Возникает вопрос: откуда может происходить это поведение с маршрутизацией? Я уже предпринял несколько попыток его исправить. Вот как я настроил параметры маршрутизации: <br/><br/> 
<pre><code class="cs">services.Configure&lt;RouteOptions&gt;(options =&gt;
{
    options.LowercaseQueryStrings = true;
    options.LowercaseUrls = true;
});</code></pre> <br/><br/> 
А также добавил правила маршрутизации: <br/><br/> 
<code class="cs">services.AddRouting(x =&gt; x.LowercaseUrls = true);</code> <br/><br/> 
Конфигурация маршрутизации на уровне <code>middlewares</code>: <br/><br/> 
<pre><code class="cs">app.UseEnpoints(endpoints =&gt;
{
    endpoints.EnableInnerRoutes();
});</code></pre> <br/><br/> 
<pre><code class="cs">public static void EnableInnerRoutes(this IEndpointRouteBuilder endpoints)
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=home}/{action=index}/{id?}",
        defaults: new { controller = "home", action = "index" }
    )
    .WithMetadata(new ...
  • 11 марта 2025 г. 8:44
Ответы на вопрос 1
В ASP.NET Core, чтобы добиться отображения маршрутов только в нижнем регистре (lowercase), необходимо установить соответствующие настройки маршрутизации. Судя по вашему коду и описанию проблемы, вы уже сделали несколько шагов в этом направлении, но есть несколько моментов, которые нужно проверить и уточнить.

1. **Конфигурация маршрутизации**:
   Убедитесь, что вы вызываете метод `AddRouting` с правильными параметрами, и это происходит в правильном месте. Обычно это делается в методе `ConfigureServices` в файле `Startup.cs`. Ваш код должен выглядеть примерно так:

   ```csharp
   public void ConfigureServices(IServiceCollection services)
   {
       services.Configure<RouteOptions>(options =>
       {
           options.LowercaseUrls = true;
           options.LowercaseQueryStrings = true;
       });

       services.AddRouting(options => options.LowercaseUrls = true);

       services.AddRazorPages(); // Если вы используете Razor Pages
       // или
       services.AddControllersWithViews(); // Если вы используете MVC
   }
   ```

2. **Правила маршрутизации**:
   Убедитесь, что в ваших правилах маршрутизации тоже используется нижний регистр в определениях маршрутов. Например:

   ```csharp
   app.UseEndpoints(endpoints =>
   {
       endpoints.MapRazorPages(); // для Razor Pages
       endpoints.MapControllerRoute(
           name: "default",
           pattern: "products/{productId?}",
           defaults: new { controller = "Products", action = "Index" }
       );
   });
   ```

3. **Обработка запросов с верхним регистром**:
   Обратите внимание, что если вы используете контроллеры и у вас есть маршруты, которые ссылаются на верхний регистр, они могут не обрабатываться как новой маршрутизацией. Вам нужно убедиться, что все маршруты прописаны в нижнем регистре.

4. **Проверка Middleware**:
   Убедитесь, что у вас не установлен какой-либо middleware, который может вмешиваться в обработку вышеупомянутых маршрутов и преобразовывать их обратно в верхний регистр.

5. **Кэширование**:
   Если у вас включено кэширование, убедитесь, что не устаревшие данные не остаются в кэше вашего браузера или сервере.

6. **Добавление дополнительной проверки**:
   Вы можете также добавить промежуточное ПО (middleware) для перенаправления всех запросов с верхним регистром к соответствующей версии с нижним регистром:

   ```csharp
   public class LowercaseMiddleware
   {
       private readonly RequestDelegate _next;

       public LowercaseMiddleware(RequestDelegate next)
       {
           _next = next;
       }

       public async Task Invoke(HttpContext context)
       {
           var path = context.Request.Path.Value;

           if (path != null && path != path.ToLowerInvariant())
           {
               context.Response.Redirect(path.ToLowerInvariant());
               return;
           }

           await _next(context);
       }
   }
   ```

   Затем добавьте это middleware в конвейер обработки запросов в `Startup.cs`:

   ```csharp
   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
       app.UseMiddleware<LowercaseMiddleware>();

       // Остальная конфигурация
   }
   ```

Эти шаги должны помочь вам настроить маршруты для отображения в нижнем регистре в вашем проекте ASP.NET Core.
Похожие вопросы