c# - 将两个 Asp.Net Core API 合并到一个应用程序中

标签 c# asp.net-core .net-core

我有两个 Restful API 项目,正在尝试合并到一个应用程序项目(新的 .net core 项目)中,我修改了 Running multiple independent ASP.NET Core pipelines side by side in the same application 中的代码接受 WebSockets 的扩展方法如下:

public static IApplicationBuilder UseBranchWithServices(
            this IApplicationBuilder app,
            PathString path,
            Type requiredStartup) {
            var webHost =  WebHost.CreateDefaultBuilder()
                .UseStartup(requiredStartup).Build();
            var serviceProvider = webHost.Services;
            var serverFeatures = webHost.ServerFeatures;


            var appBuilderFactory =
                serviceProvider.GetRequiredService<IApplicationBuilderFactory>();
            var branchBuilder = appBuilderFactory.CreateBuilder(serverFeatures);
            var factory = serviceProvider.GetRequiredService<IServiceScopeFactory>();


            if (path.Value.Contains("/project2")) {

                branchBuilder.Map(
                    "/project2/ws",
                    x =>
                        x.UseMiddleware<project2MicroService.WebSockets.WebSocketMiddleWare>(
                            serviceProvider.GetService<SceneWebSocketHandler>()));

            } else if (path.Value.Contains("/project1")) {

                branchBuilder.Map(
                    "/project1/ws",
                    x => x.UseMiddleware<project1Service.WebSockets.WebSocketMiddleWare>(
                        serviceProvider.GetService<project1WebSocketHandler>()));
            }


            var branchDelegate = branchBuilder.Build();



            return app.Map(
                path,
                builder => {
                    builder.Use(
                        async (context, next) => {
                            if (!context.WebSockets.IsWebSocketRequest) {
                                await branchDelegate(context).ConfigureAwait(false);
                            } else {
                                 await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
                                 await branchDelegate(context).ConfigureAwait(false);

                            }
                        });
                });
        }

我在我的新应用程序中调用它,例如

app.UseBranchWithServices("/project2", typeof(project2MicroService.Startup));

在运行单元测试时,WebSocket 连接被接受,但中间件从未被命中 知道如何解决这个问题,请,我的单元测试

[ClassInitialize]

        public static void TestOneTimeSetUp(TestContext context) {

            var webHostBuilder = WebHost.CreateDefaultBuilder();
            webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
            webHostBuilder.UseStartup<Startup>();
            server = new TestServer(webHostBuilder);
            client = server.CreateWebSocketClient();
        }

        /// <summary>
        /// OneTimeTearDown
        /// </summary>
        [ClassCleanup]
        public static void TestOneTimeTeardown() {
            server.Dispose();
        }

        /// <summary>
    /// TestWebsocketCanBeCreated
    /// </summary>
    [TestMethod]
    public void TestWebsocketCanBeCreated() {

        var TEST1wsUri = new UriBuilder(server.BaseAddress + "project1/ws") { Scheme = "ws" }.Uri;
        var TEST1websocket = client.ConnectAsync(TEST1wsUri, CancellationToken.None).Result;

        var TEST2wsUri = new UriBuilder(server.BaseAddress + "project2/ws") { Scheme = "ws" }.Uri;
        var TEST2websocket = client.ConnectAsync(TEST2wsUri, CancellationToken.None).Result; 

        Assert.AreEqual(WebSocketState.Open, TEST2websocket.State);
        Assert.AreEqual(WebSocketState.Open, TEST1websocket.State);



        Task.WaitAll(
            TEST1websocket.CloseAsync(
                WebSocketCloseStatus.NormalClosure,
                "",
                CancellationToken.None));

        Task.WaitAll(
            TEST2websocket.CloseAsync(
                WebSocketCloseStatus.NormalClosure,
                "",
                CancellationToken.None));

        Assert.AreEqual(WebSocketState.Closed, TEST2websocket.State);
        Assert.AreEqual(WebSocketState.Closed, TEST1websocket.State);
    }

最佳答案

你做错了几件事:

1) 您尝试使用 if/else 逻辑定义路由行为。不要那样做。 2)你实际上并没有声明你想要达到的目标是你的管道的一部分。考虑以下因素:

            // https://stackoverflow.com/questions/48216929/how-to-configure-asp-net-core-server-routing-for-multiple-spas-hosted-with-spase
            app.Map("/rx", rx => {
                rx.UseSpa(rxApp => {
                     rxApp.Options.SourcePath = "../RX";
                    if (envIsDevelopment) rxApp.UseProxyToSpaDevelopmentServer("http://localhost:3000");
                });
            });
            app.Map("/V2", ng => {
                // https://learn.microsoft.com/en-us/aspnet/core/client-side/spa/angular?view=aspnetcore-2.2
                app.UseSpa(angularApp =>
                {
                    angularApp.Options.SourcePath = "../UI";

                    if (envIsDevelopment) angularApp.UseProxyToSpaDevelopmentServer("http://localhost:4200");
                });
            });

source

请注意那里的链接:Filip W.'s blog

这是一个不同的用例,但它是如何将两条不同的路线映射到不同目的地的示例。您尝试打开 URL,但这不是管道的工作方式。这是一个声明式管道;您必须根据.NET Core的内置插件定义路由(或添加包含其他中间件插件的依赖项)。

看这里:

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.mapextensions.map?view=aspnetcore-3.1

...并且不要重新发明轮子。

关于c# - 将两个 Asp.Net Core API 合并到一个应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505803/

相关文章:

c# - asp.net中如何使用Session List<T>存储值

c# - 在C#编译的exe中修改Emdeded String

c# - 区域共享布局_ViewStart.cthml

asp.net-mvc - Identity Server 4 将参数添加到登录页面

asp.net-core - 使用 Github 操作进行部署

c# - 转换或简化具有已知值的表达式

.net-core - SignalR Core 如何获取服务器端的连接参数

c# - CAML 查询仅检索来自 SharePoint 2007 的已发布页面?

c# - ASP.NET Core 在所有日志条目中包含时间戳

c# - 您将在 .NET Core Web/api 应用程序中的何处实现缓存?