NetCore 3.1 ApiController направляет 404 на сервер IIS, но не во время локальной отладки - PullRequest
1 голос
/ 30 мая 2020

У меня очень простое приложение, в котором есть как MVC, так и контроллеры API. Оба работают локально с использованием VS 2019 и отладчика IIS. Однако, когда я развертываю этот проект на сервере Windows Server 2016 с IIS 10, контроллер API маршрутизирует все 404. Маршруты MVC работают без проблем.

Вот мой код для контроллера API

[ApiController]
public class LeadController : ControllerBase
{
  [Route( "api/lead/submit" )]
  [HttpPost]
  public async Task<ActionResult<object>> Post( )
  {
     IFormCollection form = await HttpContext.Request.ReadFormAsync();
     IFormFileCollection files = form?.Files;

     var form_fields = form.Select( f => new KeyValuePair<String, String>( f.Key, f.Value ) );
     return ( new { recieved_payload = form_fields } );
  }
}

Program.cs

public class Program
{
   public static void Main( string[] args )
   {
      CreateHostBuilder( args ).Build().Run();
   }

   public static IHostBuilder CreateHostBuilder( string[] args ) =>
       Host.CreateDefaultBuilder( args )
           .ConfigureWebHostDefaults( webBuilder =>
            {
              webBuilder.UseStartup<Startup>();
            } );
 }

Startup.cs

public class Startup
   {
      public Startup( IConfiguration configuration )
      {
         Configuration = configuration;
      }

      public IConfiguration Configuration { get; }

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

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

         app.UseStaticFiles();

         app.UseRouting();

         app.UseAuthorization();

         app.UseEndpoints( endpoints =>
          {
             endpoints.MapControllerRoute(
                   name: "default",
                   pattern: "{controller=Home}/{action=Index}/{id?}" );
          } );
      }
   }

Я пробовал публикация проекта как автономного и зависимого от платформы, x86, x64 и переносимого. Ничего из этого не имеет значения.

Я также внес изменения в настройки AppPool:. Net 4.0 на «Нет управляемого кода». Это также не меняет поведения приложения.

Похоже, проблема только c для контроллеров, использующих [ApiController] - возврат json и HttpPost нормально работает MVC Контроллеры

[HttpPost]
public async Task<ActionResult<object>> Test()
{
   return Json( new { worked = true } );
}

Рабочий запрос localhost: enter image description here

Производственный запрос 404ing: enter image description here

Изменить: добавлен web.config и конфигурация IIS

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\Etna.Api.Luxury.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

enter image description here

enter image description here

...