Грешка в .NET Core 2.0 BasePath

Току-що стартирах ново приложение .NET Core 2.0, но получавам странно внезапно поведение, изглежда не мога да намеря нищо.

Следната грешка се появява при натискане на .Run() на моя BuildWebHost().:

System.InvalidOperationException: A path base can only be configured using IApplicationBuilder.UsePathBase().
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.<BindAddressAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.<BindAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.<BindAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<StartAsync>d__21`1.MoveNext()
'dotnet.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.0\System.Diagnostics.Tools.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Exception","time":"2017-09-25T13:26:29.6923656Z","tags":{"ai.application.ver":"1.0.0.0","ai.internal.sdkVersion":"aspnet5c:2.1.1"},"data":{"baseType":"ExceptionData","baseData":{"ver":2,"properties":{"{OriginalFormat}":"Unable to start Kestrel.","CategoryName":"Microsoft.AspNetCore.Server.Kestrel","Exception":"System.InvalidOperationException: A path base can only be configured using IApplicationBuilder.UsePathBase().\r\n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.<BindAddressAsync>d__7.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.<BindAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.<BindAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<StartAsync>d__21`1.MoveNext()","AspNetCoreEnvironment":"Development","DeveloperMode":"true"},"exceptions":[{"id":47609378,"typeName":"System.InvalidOperationException","message":"Unable to start Kestrel.","hasFullStack":true,"parsedStack":[{"level":0,"method":"Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+<BindAddressAsync>d__7.MoveNext","assembly":"Microsoft.AspNetCore.Server.Kestrel.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"},{"level":1,"method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":2,"method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":3,"method":"Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+AddressesStrategy+<BindAsync>d__2.MoveNext","assembly":"Microsoft.AspNetCore.Server.Kestrel.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"},{"level":4,"method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":5,"method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":6,"method":"Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder+<BindAsync>d__0.MoveNext","assembly":"Microsoft.AspNetCore.Server.Kestrel.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"},{"level":7,"method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":8,"method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification","assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"},{"level":9,"method":"Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer+<StartAsync>d__21`1.MoveNext","assembly":"Microsoft.AspNetCore.Server.Kestrel.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"}]}],"severityLevel":"Critical"}}}
The thread 0x1d7c has exited with code 0 (0x0).
The thread 0x25c0 has exited with code 0 (0x0).
Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.dll
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll
A path base can only be configured using IApplicationBuilder.UsePathBase().

Ето моя Program.cs

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 class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; set; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        //Swagger
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info
            {
                Title = "2Commit Blogpost API",
                Version = "v1"
            });
        });

        //Mediatr
        services.AddScoped<IMediator, Mediator>();
        services.AddTransient<SingleInstanceFactory>(sp => sp.GetService);
        services.AddTransient<MultiInstanceFactory>(sp => sp.GetServices);
        services.AddMediatorHandlers(typeof(Startup).Assembly);

        //MongoDB
        services.Configure<MongoSettings>(s =>
        {
            s.Database = Configuration.GetSection("MongoConnection:Database").Value;
        });
        services.AddSingleton<IMongoClient, MongoClient>(client => new MongoClient(Configuration.GetSection("MongoConnection:ConnectionString").Value));

        //BL
        services.AddTransient<IUserService, UserService>();

        //DAL
        services.AddTransient<IRepository, MongoRepository>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //Swagger
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "BlogPost API");
        });

        app.UseMvc();
    }
}

Изглежда не мога да разбера това!

АКТУАЛИЗАЦИЯ 1:

Грешката се появява само при стартиране на проекта ми от командния ред, при стартиране през IIS Express, без грешки.

Ето моите настройки за стартиране

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:51592/swagger",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "API": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/swagger"
    }
  }
}

person TanguyB    schedule 25.09.2017    source източник
comment
Въпреки че не са свързани. Трябва да имате еквивалентни услуги за конфигуриране във вашия BL и да преместите препратката към DAL там. С текущата ви настройка имате директен достъп до DAL от горния си слой и това отваря потенциала за отричане на BL слоя. В идеалния случай най-горният слой не трябва да знае нищо за DAL.   -  person bilpor    schedule 25.09.2017
comment
Това всъщност е нещо, което ме притесняваше известно време, но не отделих време да го обмисля. Имате конкретен пример за това как трябва да преместя моите BL ‹-› DAL неща в m BL?   -  person TanguyB    schedule 25.09.2017
comment
Да, ще се опитам да го изровя.....Нямам го в сайта, в който съм в момента. но ще ви покажа как го направих при актуализация на този въпрос.   -  person bilpor    schedule 25.09.2017
comment
Имаш ли имейл? Не мога да намеря никъде в този сайт за изпращане на лично писмо. Имам примерен код за вас, както обещах, който ви показва как да прокарате препратката към вашия DAL надолу в стека.   -  person bilpor    schedule 26.09.2017
comment
Вече го разбрах, благодаря!   -  person TanguyB    schedule 26.09.2017
comment
Добре. Така че сте използвали Microsoft.Extensions.DependencyInjection и сте създали разширени класове във вашите BAL и DAL. Без притеснения, радвам се, че си го разбрал.   -  person bilpor    schedule 26.09.2017


Отговори (3)


Добре, в 1.X можете просто да добавите основен път към вашето приложение Url във вашите launchOptions, докато работите от командния ред, сега работи само когато използвате IIS.

в моите настройки за стартиране, променяйки моя CLI профил от използване

"applicationUrl": "http://localhost:5000/swagger"

to

"applicationUrl": "http://localhost:5000"

направи трика.

person TanguyB    schedule 25.09.2017
comment
Можете също така да продължите да имате достъп до това от localhost:5000/swagger, като направите промяната по-горе и след това добавите следното към секцията Конфигуриране на Startup.cs: app.UsePathBase(/swagger).UseMvc(); - person Daniel Vest; 30.09.2017

Както каза @TanguyB, трябва да промените applicationUrl, но след това можете да зададете

"launchUrl": "http://localhost:5000/swagger"

за да стартирате приложението си на страницата Swagger

person Renat Shaymardanov    schedule 14.08.2018

Използвам Core 3.0: Премахнах https url и запазих само http url

person Mahendra Shoor    schedule 20.07.2020
comment
Това е добре, но заглавието е за Core 2.0, така че това е съмнителен отговор - person xKobalt; 20.07.2020