У меня есть приложение .net core web api, которое я недавно пытался отладить (в VS2017) на новом компьютере (после долгого перерыва в работе над приложением). Я также обновил ядро .net с 1.1 до 2.2. Однако кажется, что он больше не направляет вообще , даже в ValuesController, который я оставил для тестирования, или просто с использованием localhost (я проверял его с помощью своего локального IP-адреса). Я создал еще один проект веб-API (который прекрасно работает) в том же решении и сравнил код, файлы конфигурации и т. Д .; Я упростил свой собственный код до крайнего соответствия с рабочим кодом веб-API:

public class Program {

    public static void Main(string[] args) {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

И я убрал все, кроме голых костей Startup.cs

public partial class Startup {
    public IConfiguration Configuration { get; }

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


    public void ConfigureServices(IServiceCollection services) {

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {

        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        } else {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseMvc();
    }
}
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
...

И удостоверился, что мой мой launchSettings.json также соответствует моему тестовому веб-интерфейсу (пробовал запускать как с сервисом напрямую, так и через IISExpress). Немного бит для прямого запуска:

"profiles": {
    "MyWebApiService": {
        "commandName": "Project",
        "launchBrowser": true,
        "launchUrl": "api/values",
        "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "applicationUrl": "http://localhost:8080;https://localhost:44385"
    }
}

Но когда он запускается, хотя сначала он вызывает http: // localhost: 8080 / api / values, и Перенаправление на https: // localhost: 44385 / api / values работает нормально, вызов https: // localhost: 44385 / api / values возвращает код http 404.

Есть ли способ увидеть, что происходит в маршрутизации? Что он ищет и где?

0
monty 22 Ноя 2019 в 04:01

2 ответа

Лучший ответ

Аналогичная проблема с WebApi, выдающим 404 во время отладки; работает при публикации, но опубликованную версию я не проверял. Кроме того, мой Sdk, установленный в узле в файле .csproj, был:

  • Microsoft.NET.Sdk.Web

Как этому следовало быть. Тем не менее, у меня там был и явно установлено значение false, что, по-видимому, работало до версии 2.1. Установка этого в true была решением здесь:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp2.2</TargetFramework>
        <PreserveCompilationContext>true</PreserveCompilationContext>
        ...

«MVC 2.1.0 требует наличия контекста компиляции. Контекст компиляции сообщает ему, ссылается ли библиотека на MVC, который используется в качестве фильтра для пропуска сборок, которые, как считается, не имеют контроллеров». См. ASP.NET Core 2.1.0 ломает конечные точки с атрибутом в приложениях, ориентированных на Microsoft.NET.Sdk # 8388

Обратите внимание, что эта проблема существует во всех Microsoft.AspNetCore.App и Microsoft.AspNetCore.All версий 2.1.0, 2.1.1, 2.1.2 и 2.1.3.

0
monty 27 Ноя 2019 в 03:45

В предоставленном вами коде я не вижу AddHttpsRedirection в ConfigureServices. Пожалуйста, добавьте:

services.AddHttpsRedirection(options =>
{
    options.HttpsPort = 443;
});

См.: Принудительное использование HTTPS в ASP.NET Core

0
KrishnaDhungana 22 Ноя 2019 в 01:29