Azure Webapp HttpListener

Azure Webapp HttpListener

提问人:Bence Fabo 提问时间:11/16/2023 更新时间:11/23/2023 访问量:72

问:

我创建了一个简单的 C# 控制台应用程序 (net7.0) 作为我的多人纸牌游戏的服务器。 它使用 HttpListener 接收连接请求,然后升级到 websocket 连接。

// Start listening for websocket requests
public async void Start()
{
    HttpListener listener = new();
    listener.Prefixes.Add("http://+:80/cardgame/");
    listener.Start();

    #if DEBUG
        Console.WriteLine("Listening...");
    #endif

    while (true)
    {
        HttpListenerContext listenerContext = await listener.GetContextAsync();
        if (listenerContext.Request.IsWebSocketRequest)
        {
            ProcessRequest(listenerContext);
        }
        else
        {
            listenerContext.Response.StatusCode = 400;
            listenerContext.Response.Close();
        }
    }
}

这适用于我的 Windows 笔记本电脑,当以管理员身份运行应用程序或事先使用 CMD 时。netsh add urlacl url=http://+:80/cardgame user=DOMAIN\user

我想使用“免费”设置将其作为 Web 应用托管在 Azure 云中。部署成功,但在启动 Web 应用时,由于 HttpListener,它会引发拒绝访问异常。确切场景:图像

Unhandled exception. System.Net.HttpListenerException (5): Access is denied.
   at System.Net.HttpListener.SetupV2Config()
   at System.Net.HttpListener.Start()

我还尝试在“+”符号的位置使用网络应用程序的公共 IP 进行操作,但无济于事。listener.Prefixes.Add("http://+:80/");

Azure Kudu 环境不会在管理员模式下运行应用程序,但它也不允许配置命令,所以我说感觉这是不可能的......但是,如果您甚至无法收听端口,那么这个 Web 应用程序环境有什么用呢?(我想 ASP.NET......netsh

如果有人能帮助我解决这个问题,我将不胜感激:

  • 有没有办法使用 C# 控制台应用程序在 Azure Webapp 环境中配置 websocket 连接?
  • 还有什么其他解决方案可以让我以这种方式(最好是免费的)在云中托管我的服务器?
c# 天蓝色 网络插座 httplistener 捻角獻

评论

0赞 Chris Schaller 11/16/2023
可以在云服务 - 扩展支持运行时上执行此操作。我不确定是否有免费套餐,但您可以在最少的资源上以相当低的成本运行它。
0赞 Bence Fabo 11/18/2023
谢谢你的提示!我会调查的。
0赞 Sampath 11/23/2023
@Bence Fabo 你试过和Azure signalAzure Web PubSub Service

答:

0赞 Sampath 11/23/2023 #1

否,无法使用 C# 控制台应用程序在 Azure Web 应用环境中配置 WebSocket 连接。

我们可以将 ASP.NETASP.NET Core Web APIASP.NET Core BlazorASP.NET MVC Web 应用部署到 Azure 应用服务。

  • 在 Azure 中使用 Azure Web PubSub 服务和 Azure SignalR 作为 WebSocket。

  • 以下代码创建 WebSocket 连接,并允许用户发送和接收消息。

在 Blazor 中使用 Azure Web PubSub 服务:Using Azure Web PubSub Service in Blazor:


@page "/websocket"

<h1>Echo test</h1>
<h3>State: @webSocket.State</h3>

@if(webSocket.State == WebSocketState.Open) {
    <form @onsubmit="SendMessageAsync">
        Message: <input @bind="@message" />
        <button type="submit">Send</button>
    </form>
    <pre>@log</pre>
}

@code {

    
    private CancellationTokenSource disposalTokenSource = new CancellationTokenSource();
    private ClientWebSocket webSocket = new ClientWebSocket();
    private string message = "Hello, websocket!";
    private string log = "";


    protected override async Task OnInitializedAsync() {
        await ConnectWebSocketAsync();
        _ = ReceiveLoop();
    }

    private async Task ConnectWebSocketAsync() {
        // Update the URI with your actual WebSocket endpoint and access token
        var uri = new Uri("wss://your-websocket-endpoint?access_token=your-access-token");
        await webSocket.ConnectAsync(uri, disposalTokenSource.Token);
    }

    private async Task SendMessageAsync() {
        log += $"Sending: {message}\n";
        var dataToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message));
        await webSocket.SendAsync(dataToSend, WebSocketMessageType.Text, true, disposalTokenSource.Token);
    }

    private async Task ReceiveLoop() {
        var buffer = new ArraySegment<byte>(new byte[1024]);
        while(!disposalTokenSource.Token.IsCancellationRequested) {
            var received = await webSocket.ReceiveAsync(buffer, disposalTokenSource.Token);
            if (received.MessageType == WebSocketMessageType.Text) {
                var receivedAsText = Encoding.UTF8.GetString(buffer.Array, 0, received.Count);
                log += $"Received: {receivedAsText}\n";
                StateHasChanged();
            }
        }
    }

    public void Dispose() {
        disposalTokenSource.Cancel();
        _ = webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Bye", CancellationToken.None);
    }
}

当地:

enter image description here

enter image description here

  • 我遵循了使用 Visual Studio 将 ASP .NET Core 应用发布到 Azure 的参考 MSDOC

天蓝色: enter image description here

对于使用 Blazor 的 Azure SignalR:For Azure SignalR with Blazor:

我遵循了 Blazor 中 Azure SignalR 配置的参考

  • 安装包dotnet add package Microsoft.Azure.SignalR
  • 以下代码用于使用 Blazor 配置 Azure SignalR

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddServerSideBlazor();
    services.AddSignalR().AddAzureSignalR();
    ...
}


appsetting.json:

  "Azure": {
    "SignalR": {
      "Enabled": true,
      "ConnectionString": <your-connection-string>
    }
  }


当地: enter image description here

enter image description here

enter image description here 天蓝色:

enter image description here