.Net framework Owin Test Server không hoạt động với WebSocket

Aug 26 2020

Dự án của tôi là Owin tự lưu trữ, nó cung cấp điểm cuối API Web và điểm cuối ổ cắm web. Đây là mã cấu hình có liên quan trong lớp khởi động của dự án Owin WebSocket được sử dụng ở đây

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);
    }

Hoạt động trơn tru, khi ứng dụng được khởi chạy, tôi có thể sử dụng api web qua "http: // {host} / api / v1 / test" và sử dụng websockets bằng: "ws: // {host} / api / v1 / socket /kiểm tra"

Sau đó, tôi quyết định thêm một số thử nghiệm tích hợp. Tôi sử dụng Máy chủ kiểm tra Owin ở đây. Trong TestServer.Createcấu hình giống hệt nhau:

        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);

Phương pháp kiểm tra api

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

Hoạt động tốt. Nhưng không hoạt động cho ổ cắm web:

       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();

Tại sao No connection could be madeở đây? Có vẻ như máy chủ thử nghiệm chỉ có thể hỗ trợ yêu cầu http thông thường chứ không phải websocket. Nhưng đây không phải là trường hợp trong ứng dụng chính, nơi sử dụng khung và cài đặt giống hệt nhau. Tôi còn thiếu gì ở đây? Tôi đã loay hoay với điều này hàng giờ liền nhưng vô ích ...

Trả lời

Frostless Aug 26 2020 at 11:24

Đã tìm ra câu trả lời. Các TestServer.Create<Startup>()chỉ bắt đầu chỉ là ví dụ trong bộ nhớ nơi mà các url là không có sẵn. Tuy nhiên, ứng dụng web socket dựa vào url để hoạt động. Vì vậy, giải pháp là sử dụng quá tải WebApp.Start<Startup>(Settings.WebApiUrl)(nó khởi động ứng dụng web trên url mà bạn cung cấp)

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

Tham khảo