在一个应用程序中合并两个Asp.Net Core API

我有两个Restful API项目正在尝试合并到一个应用程序项目(新的.net核心)中,我修改了在同一应用程序中并排运行多个独立的ASP.NET Core管道中的代码,以按照扩展方法接受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);
    }
奥古赞大豆

我已经查看了您得到的解决方案,但是它对我没有用。因此,我们为此创建了一个解决方案,该解决方案完全可以完成您想要的工作,并且可以长时间无缝地工作。

https://github.com/damianh/lab/tree/master/dotnet/AspNetCoreNestedApps/AspNetCoreNestedApps

如果我用代码总结;

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
     app.IsolatedMap<NestedStartup>("/nested");
     app.IsolatedMap<XApp>("/xroute");
     app.Run(async context => await context.Response.WriteAsync("Hello World!"));
 }

您可以基于应用程序Startup和路由轻松地分离您的应用程序但是,请记住,某些事情可能不适用于管道,因为您是在构建主容器之后进行分支的。我们介绍了分支机构的托管服务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在控制台应用程序中注入ILoggerFactory与在ASP.NET Core 1.1中实例化一个ILoggerFactory

Asp.net Core中的Web应用程序与Web Api项目类型

如何最好地在两个ASP.NET Core服务器应用程序之间通信?

引用另一个Git存储库中的项目的ASP.NET Core应用程序

在ASP.NET Core API应用程序中处理JSON漂亮打印参数

在两个ASP.NET Core应用程序之间共享Cookie

ASP.NET Core Web API与ASP.NET Core应用程序

使用控制台应用程序.NET Core在并行C#中运行两个dotnet进程

如何在ASP.NET Web API应用程序中从另一个方法调用一个异步方法

可以在Windows服务定位中托管ASP.NET Core 2 Web API NET Core 2应用程序

如何在.Net Core中将两个wave文件合并为一个文件?

重定向到另一个Web应用程序ASP.NET Core中的控制器

一个按钮,两个不同的操作asp.net core mvc

将单独的ReactJS客户端前端应用程序与ASP.NET Core后端API合并?

获取.Net Core应用程序中通过PostAsJsonAsync发送的.Net Core Api中的值

Internet连接可用时,通过API在两个ASP.NET MVC 5应用程序之间共享数据

一个Web应用程序中可以有2个ASP.NET Core网站吗?

在Windows Forms应用程序中托管ASP.NET Core API

从另一个.NET Core应用程序运行.NET Core dll

从自己的.NET Core API中的另一个API消费JSON

部署两个asp.net核心应用程序,在一个解决方案中对nginx

ASP .Net Core Web 应用程序调用 Web API

从另一个程序集启动 asp net core 应用程序

.Net Core Vs .Net 框架来创建一个新的 mvc web 应用程序

我有一个托管在 AWS 中的 ASP.NET Core MVC 应用程序。在此用户将加载文件。在哪里保存这些文件

在一个 ASP.NET Core Razor 页面中为两个模型创建一个列表

如果另一个 API 调用当前正在 ASP.NET Core 中运行,则拒绝 API 调用

如何在 ASP.NET Core Web 应用程序中添加 API

在单个 ASP.NET Core 3.1 Web API 中管理两个 SPA;一个在 root 中,另一个在“admin”路由中