1

以下将引发端点已被使用的异常:

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 http://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)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World 1");
        });
    }
}

public class Startup1
{
    // 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 http://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)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}
public class Program
{
    public static void Main(string[] args)
    {

        string serverUrl = $"http://localhost:4000/test1/";

        var _webHost = new WebHostBuilder().UseKestrel()
                                        .UseContentRoot(Directory.GetCurrentDirectory())
                                        .UseStartup<Startup>()
                                        .UseUrls(serverUrl)
                                         .UseIISIntegration()
                                        .Build();

        _webHost.Start();

        string serverUrl1 = $"http://localhost:4000/test2/";
        var _webHost1 = new WebHostBuilder().UseKestrel()
                                       .UseContentRoot(Directory.GetCurrentDirectory())
                                       .UseStartup<Startup1>()
                                       .UseIISIntegration()
                                       .UseUrls(serverUrl1)
                                       .Build();

        _webHost1.Start();

        Console.ReadLine();
    }
}

未处理的异常:System.AggregateException:发生一个或多个错误。(错误 -4091 EADDRINUSE 地址已在使用中)---> Microsoft.AspNetCore.Server.Kestrel.Networking.UvException:错误 -4091 EADDRINUSE 地址已在 Microsoft.AspNetCore.Server.Kestrel.Networking.Libuv.Check(Int32 statusCode) 在 Microsoft.AspNetCore.Server.Kestrel.Networking.UvStreamHandle.Listen(Int32 backlog, Action 4 callback, Object state) at Microsoft.AspNetCore.Server.Kestrel.Http.TcpListenerPrimary.CreateListenSocket() at Microsoft.AspNetCore.Server.Kestrel.Http.Listener.<>c.<StartAsync>b__6_0(Object state) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Server.Kestrel.Http.ListenerPrimary.<StartAsync>d__9.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at Microsoft.AspNetCore.Server.Kestrel.KestrelEngine.CreateServer(ServerAddress address) at Microsoft.AspNetCore.Server.Kestrel.KestrelServer.Start[TContext](IHttpApplication1 application) 在 Microsoft.AspNetCore.Hosting.Internal.WebHost.Start() 在 ConsoleApp1.Program.Main(String[] args)按任意键继续 。. .

有没有办法像使用 owin 和 httplistener 一样使用不同的虚拟路径在同一个端口上拥有两个侦听器?

4

2 回答 2

2

不,Kestrel 不支持这一点。WebListener 和 IIS 可以。

于 2016-06-16T21:12:39.067 回答
1

我知道这在使用主机和不同的应用程序时曾经与 dnx 一起工作,所以它应该仍然可以正常工作。另一种选择是.UseWhen(context => ... )Startup.Configure方法内使用,如本文所述

public void Configure(IAppBuilder app)
{
    app.UseWhen(context => context.Request.Path.ToString().StartsWith("/test1"), testApp1 =>
    {
        app.UseMvc();
    });

    app.UseWhen(context => context.Request.Path.ToString().StartsWith("/test2"), testApp1 =>
    {
        app.UseMvc();
    });
}


public static class AppExtensions {
    public static IApplicationBuilder UseWhen(this IApplicationBuilder app
        , Func<Microsoft.AspNetCore.Http.HttpContext, bool> condition
        , Action<IApplicationBuilder> configuration)
    {
        if (app == null)
        {
            throw new ArgumentNullException(nameof(app));
        }

        if (condition == null)
        {
            throw new ArgumentNullException(nameof(condition));
        }

        if (configuration == null)
        {
            throw new ArgumentNullException(nameof(configuration));
        }

        var builder = app.New();
        configuration(builder);

        return app.Use(next => {
            builder.Run(next);

            var branch = builder.Build();

            return context => {
                if (condition(context))
                {
                    return branch(context);
                }

                return next(context);
            };
        });
    }
}
于 2016-06-16T17:07:37.000 回答