如何使用 websockets 在我的 Azure 应用服务 Web 应用和本地控制台应用之间建立连接?

Posted

技术标签:

【中文标题】如何使用 websockets 在我的 Azure 应用服务 Web 应用和本地控制台应用之间建立连接?【英文标题】:How do I establish a connection between my Azure App Service Web App and local console app using websockets? 【发布时间】:2020-08-19 17:03:05 【问题描述】:

我有一个作为应用服务部署在 Azure 中的 REST API Web 应用,我可以成功地从我设备上的控制台应用程序发出请求。我的目标是从通过控制台端的 HttpClient 来回传递 JSON 转换为通过 Web 套接字在两者之间建立连接。

目前,我的应用服务中有以下函数在启动时被调用。

public static void StartListening()

    try
    
        TcpListener listener = new TcpListener(IPAddress.Any, 80);

        listener.Start();

        using (TcpClient client = listener.AcceptTcpClient())
        
            using (Stream stream = client.GetStream())
            
                byte[] requestBuffer = new byte[100];
                int size = stream.Read(requestBuffer, 0, requestBuffer.Length);
                string msg = Encoding.ASCII.GetString(requestBuffer, 0, size);
            
        
     catch (Exception ex)  /* handle exception here */ 

在我的控制台应用程序中:

static void StartConnection(string msg)

    try
    
        Console.WriteLine("Accessing tcp");
        byte[] buffer = Encoding.ASCII.GetBytes(msg);

        using (TcpClient client = new TcpClient("hostname here", 80))
        
            using (Stream stream = client.GetStream())
            
                stream.Write(buffer, 0, buffer.Length);
            
        
     catch (Exception ex)  Console.WriteLine(ex.Message + ex.StackTrace); 

供参考,I used the format found here as my guide.

我已确保在我的应用服务配置中将 Web 套接字设置为“开启”。除此之外,到目前为止,我不知道我需要进行任何更改。

我的问题是在实际尝试调用服务器端的函数时出现的。在我的侦听器参数中使用 IpAddress.Any 时,我收到 10013 错误(权限被拒绝)。更改端口有时会将错误更改为 10048(已在使用中)。当我用入站 IP 替换 IpAddress.Any 时,我的错误变为 10049(无法分配请求的地址。请求的地址在其上下文中无效)。 Error code references here

如果我理解正确,Azure App Service 只能接受端口 80 和 443 上的入站流量,这两种情况都不适用于我的情况。我没有太多使用这些技术的经验,因此欢迎提供任何见解。

此外,我只能在代码中的 listener.Start() 行之前进行调试,因为我当前的执行在那里停止。因此,如果后面的代码中有明显的跳出,请随时指出。

【问题讨论】:

Appservices 不是为基于长期运行(websocket)的任务而设计的,它们是为“网站”设计的。您应该将 WebJobs 用于您想做的事情(可以为长时间运行的任务进行配置)。实际上,这听起来更像是您需要使用一些“移动”技术(加引号是因为它不仅适用于移动设备,还适用于云之外的任何东西,例如您的客户端应用程序)。 【参考方案1】:

请在中间使用一些东西,当使用网络套接字时,推荐的方法是使用 SignalR。 Azure SignalR 是一种平台服务,您可以使用 Web 套接字或 REST 或其他协议来执行此操作,它具有可扩展性,并且不会因不使用太多请求而降低您的应用服务。

【讨论】:

【参考方案2】:

您最好使用像 ngrok 这样的工具,它会充当代理并将数据发送到您的本地开发站。

例如:

发送数据到 ngrok / 它会路由到你的本地主机

【讨论】:

以上是关于如何使用 websockets 在我的 Azure 应用服务 Web 应用和本地控制台应用之间建立连接?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 认知服务 - 使用 python 和 websockets 自定义语音

Azure 服务总线通知中心是不是与 websockets 和 javascript 一起使用?

如何在 Windows Azure 上设置 Websocket 连接?

Alchemy Websockets:无法在 Azure 上托管服务器

如何在我的 Azure 应用服务实例上获取 .NetCore 3.0+?

我如何在我的 websocket 龙卷风中获得动态网址?