【问题标题】:.Net framework Owin Test Server does not work with WebSocket.Net 框架 Owin 测试服务器不适用于 WebSocket
【发布时间】:2020-12-14 21:20:59
【问题描述】:

我的项目是 Owin 自托管的,它提供 Web API 端点和 Web 套接字端点。 这是项目启动类中的相关配置代码 此处使用Owin WebSocket

using Owin;
using Owin.WebSocket.Extensions;
public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
           name: "api",
           routeTemplate: "api/{version}/{controller}"
       );
        config.EnsureInitialized();
        app.MapWebSocketRoute<WebSocket>("/api/v1/socket/test");
        app.UseWebApi(config);
    }

运行顺利,当应用程序启动时,我可以通过“http://{host}/api/v1/test”使用 web api 并通过以下方式使用 websocket:“ws://{host}/api/ v1/socket/test"

然后我决定添加一些集成测试。我在这里使用Owin Test Server。 TestServer.Create 中的配置是相同的:

        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
           name: "api",
           routeTemplate: "api/{version}/{controller}"
       );
        config.EnsureInitialized();
        app.MapWebSocketRoute<WebSocket>("/api/v1/socket/test");
        app.UseWebApi(config);

api的测试方法

        var url = new UriBuilder()
        {
            Scheme = "http",
            Path = "/api/v1/test"
        }.Uri;;
        var result = client.GetAsync(url).Result;

效果很好。但不适用于网络套接字:

       var wsUri = new UriBuilder()
        {
            Scheme = "ws",
            Path = "/api/v1/socket/test"
        }.Uri;

        //create websocket client, connect it and to server 
        var wsc = new ClientWebSocket();

        Task.Run(async () =>
        {
            await wsc.ConnectAsync(wsUri, CancellationToken.None);
            var a = wsc.State; // Here error thrown: No connection could be made because the target machine actively refused it 127.0.0.1:80
        }).GetAwaiter().GetResult();

为什么No connection could be made 在这里?似乎测试服务器只能支持常规的http请求而不是websocket。但在使用相同设置和框架的主应用程序中,情况并非如此。我在这里想念什么?我一直在摆弄这个几个小时无济于事......

【问题讨论】:

    标签: asp.net websocket integration-testing owin


    【解决方案1】:

    找到答案。 TestServer.Create&lt;Startup&gt;() 仅启动 url 不可用的内存中实例。然而,Web 套接字客户端依赖于 url 才能工作。所以解决方案是使用重载WebApp.Start&lt;Startup&gt;(Settings.WebApiUrl)(它在您提供的网址上启动一个网络应用程序)

           WebApp.Start(new StartOptions("http://localhost:8989"), startup =>
            {
                startup.MapWebSocketRoute<TestConnection>();
                startup.MapWebSocketRoute<TestConnection>("/ws", sResolver);
                startup.MapWebSocketPattern<TestConnection>("/captures/(?<capture1>.+)/(?<capture2>.+)", sResolver);
            });
    

    Ref

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 2016-09-05
      • 2023-03-17
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多