.Net framework Owin Test Server non funziona con WebSocket

Aug 26 2020

Il mio progetto è Owin self-hosted, fornisce endpoint API Web ed endpoint Web socket. Ecco il codice di configurazione pertinente nella classe di avvio del progetto Owin WebSocket viene utilizzato qui

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

Funziona senza problemi, quando l'app viene avviata posso utilizzare l'API web tramite "http: // {host} / api / v1 / test" e utilizzare i websocket con: "ws: // {host} / api / v1 / socket /test"

Quindi ho deciso di aggiungere alcuni test di integrazione. Uso Owin Test Server qui. Nella TestServer.Createconfigurazione è identico:

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

Metodo di prova per api

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

Funziona bene. Ma non funziona per socket 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();

Perché No connection could be madequi? Sembra che il server di test possa supportare solo richieste http regolari e non websocket. Ma questo non è il caso dell'app principale in cui vengono utilizzati l'impostazione e il framework identici. Cosa mi manca qui? Sto giocherellando con questo per ore inutilmente ...

Risposte

Frostless Aug 26 2020 at 11:24

Ho trovato la risposta. L' TestServer.Create<Startup>()unico avvia solo l'istanza in memoria in cui l'URL non è disponibile. Il client web socket tuttavia si basa sull'URL per funzionare. Quindi la soluzione è utilizzare il sovraccarico WebApp.Start<Startup>(Settings.WebApiUrl)(avvia un'app Web sull'URL fornito)

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

Rif