Принудительное преобразование http в https в .net core: метод контроллера Api не вызывается

#asp.net-core #ssl #redirect #iis #.net-core

#asp.net-core #ssl #перенаправление #iis #.net-core

Вопрос:

Мое приложение .net Core 2.1 работает отлично. Теперь я хочу перенаправить http на https в рабочей среде. Итак, в IIS 8.5 я создал правила.

 <rewrite>
     <rules>
          <rule name="HTTPS force" enabled="true" stopProcessing="true">
               <match url="(.*)" />
               <conditions>
                   <add input="{HTTPS}" pattern="^OFF$" />
                   <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
               </conditions>
               <action type="Redirect" url="https://{C:1}:5001/{R:0}" redirectType="Permanent" />
          </rule>
     </rules>
</rewrite>
  

Одним из методов является

 [HttpGet]
[Route("user")]
public async Task<IActionResult> GetUser(string name)
{
    var result = await _database.UserTable.Where(u => u.Name == name).FirstOrDefaultAsync();
    return Json(result);
}
  

Дело в том, что метод вообще не вызывается. Однако, если я удалю правила в web.config и использую чистый C #-код .net core для перенаправления http на https, например,

 services.AddHttpsRedirection(options =>
{
   options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
   options.HttpsPort = 5001;
});
  

Тогда метод может быть достигнут. Я не знаю, почему?

В моем Startup.cs файле

 public void ConfigureServices(IServiceCollection services)
{
      services.TryAddTransient<IHttpContextAccessor, HttpContextAccessor>();
}
  

Означает ли это, что если мы хотим перенаправить http на https, то мы не можем установить конфигурацию в IIS? Мы ДОЛЖНЫ сделать это в коде?

Комментарии:

1. При обычных обстоятельствах вы можете использовать перезапись URL для перенаправления http на https. Должна быть проблема с вашим правилом URL. Вы можете использовать трассировку неудачных запросов для проверки проблемы.

2. Журнал отслеживания не создан, поэтому я все еще сомневаюсь, что существует возможный конфликт между правилом маршрутизации и .net core. Возможно, команды Microsoft этого не знают.

3. Я имею в виду, что вы используете отслеживание неудачных запросов для получения журнала, а затем обнаруживаете проблему на основе содержимого журнала.

4. @samwu, я имел в виду, что папка отслеживания неудачных запросов пуста. Итак, нет подсказки.

5. Пожалуйста, убедитесь, что вы включили отслеживание неудачных запросов, а затем протестируйте свое правило URL. наконец, проверьте сообщение об ошибке в журнале.

Ответ №1:

Я пробую это правило в iis:

 <rule name="Redirect to HTTPS" stopProcessing="true">
    <match url="(.*)" />
      <conditions>
      <add input="{HTTPS}" pattern="^OFF$" />
      </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
  

введите описание изображения здесь

 public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGet("/", async context =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        });
    }
}
  

Комментарии:

1. Спасибо, можете ли вы также показать свой код .net Core? Весь код Startup.cs

2. Я только создал пустой проект .net Core и опубликовал его в iis. Я не добавлял никакого кода, код в Startup.cs используется по умолчанию.

3. Хорошо, но не могли бы вы вставить код по умолчанию? Спасибо.

4. Я опубликовал код запуска класса в своем ответе выше.

5. Я предполагаю, что я пропустил app.UseRouting(); в своем коде, и я предполагаю, что это для перенаправления.