ASP.NET Core Web API работает локально, но не в службе приложений Azure.

Я точно перешел по этой ссылке ( https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.2&tabs=visual-studio), чтобы создать свой веб-интерфейс,

** Локально работает нормально. Протестировал ссылки и вернул данные JSON

Однако после развертывания моего веб-API до службы приложений Azure все мои API-ссылки возвращают мне ошибку 404. Есть ли что-то, что я мог упустить из-за маршрутизации?

В моем контроллере я добавил это в мою голову.

[Route("api/xxx")]
[ApiController]

В каждой функции я добавил это

[HttpPut("xxx/{Id}")]

Что касается моей программы / запуска, она полностью совпадает с руководством

  1. Программный класс

    public class Program
    {
       public static void Main(string[] args)
       {
            CreateWebHostBuilder(args).Build().Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
    
  2. Startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
        app.UseMvc();
    }
    

    Дайте мне знать, если вам нужна дополнительная информация. Действительно ценю любую помощь, спасибо!

1 ответ

Решение

Настройка web.config как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
  <remove name="aspNetCore"/>
  <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
  <aspNetCore processPath="dotnet" arguments=".\Somerandomname.WebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>

Для более подробной информации, вы можете обратиться к этой статье. А вот публикация основного веб-API ASP.NET в веб-приложении служб приложений Azure, которому вы можете следовать.

Я знаю, что ответ помог вам решить вашу проблему. Но я столкнулся с похожей ситуацией. В моем случае мой api запущен и работает, но страница Swagger, которую я ожидал увидеть, когда я перехожу на https://api.mydomain.com/, показывает мне ошибку 404 not found, что заставило меня предположить, что приложение не работает.

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

Поэтому я вернулся, чтобы проверить свой код.

И вот примерно то, что я сделал, заставило меня предположить, что служба приложения не работает. Что на самом деле работало очень хорошо.

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, UserManager<AppUser> userManager,
           RoleManager<IdentityRole> roleManager)
      {
           //Stripped Down for readability purpose

           app.UseSwagger();
           if (!env.IsProduction())
           {
                app.UseSwaggerUI(c =>
                {
                     c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sample API V1");
                     c.RoutePrefix = string.Empty;
                });
           }

           if (!env.IsProduction())
           {
                app.UseHangfireDashboard();
           }
           else
           {
                app.UseHangfireDashboard("/hangfire", new DashboardOptions
                {
                     Authorization = new[] { new HangfireAuthorizationFilter() }
                });
           }
           app.UseHangfireServer();
      }

Итак, в моем случае именно эта строка заставила службу приложения вернуть ошибку 404.

app.UseSwagger();
           if (!env.IsProduction())
           {
                app.UseSwaggerUI(c =>
                {
                     c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sample API V1");
                     c.RoutePrefix = string.Empty;
                });
           }

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

Я надеюсь, что это поможет и всем, кто находится в моей ситуации.

Я предполагаю, что ваша маршрутизация не выполнена. Попробуйте использовать свой URL + / api / xxx.

Пример: https://xxxx.azurewebsites.net/api/xxx

Здесь https://xxxx.azurewebsites.net/ - это ваш лазерный URL-адрес, а api / xxx - это ваш URL-адрес запуска, определенный в файле launchSettings.json, например "launchUrl": "api / xxx /",

[Route("api / [controller]")] должен быть в вашем классе контроллера.

Он должен работать.

Другие вопросы по тегам