.Net framework Owin Test Server ไม่ทำงานกับ WebSocket

Aug 26 2020

โครงการของฉันเป็นโฮสต์ด้วยตัวเองของ Owin โดยมีจุดสิ้นสุด Web API และจุดสิ้นสุดเว็บซ็อกเก็ต นี่คือรหัสกำหนดค่าที่เกี่ยวข้องในคลาสเริ่มต้นของโครงการ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);
    }

ทำงานได้อย่างราบรื่นเมื่อเปิดแอปฉันสามารถใช้เว็บ API ผ่าน "http: // {host} / api / v1 / test" และใช้ websockets โดย: "ws: // {host} / api / v1 / socket /ทดสอบ"

จากนั้นฉันจึงตัดสินใจเพิ่มการทดสอบการผสานรวม ฉันใช้Owin Test Serverที่นี่ ในTestServer.Createconfig เหมือนกัน:

        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 แต่นี่ไม่ใช่กรณีในแอปหลักที่ใช้การตั้งค่าและกรอบงานเหมือนกัน ฉันขาดอะไรไปที่นี่? ฉันเล่นซอกับเรื่องนี้มาหลายชั่วโมงแล้วโดยไม่มีประโยชน์ ...

คำตอบ

Frostless Aug 26 2020 at 11:24

พบคำตอบ TestServer.Create<Startup>()เริ่มต้นเพียงอินสแตนซ์ในหน่วยความจำตำแหน่งที่ url ไม่สามารถใช้ได้ อย่างไรก็ตามไคลเอนต์เว็บซ็อกเก็ตต้องอาศัย url ในการทำงาน ดังนั้นวิธีแก้ปัญหาคือให้ผู้ใช้โอเวอร์โหลดWebApp.Start<Startup>(Settings.WebApiUrl)(เริ่มเว็บแอปใน url ที่คุณระบุ)

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

อ้างอิง