websocket Azure Web应用程序HTTP

plupiseo  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

我创建了一个简单的C#控制台应用程序(net7.0)作为多人纸牌游戏的服务器,它使用 * HttpRequest * 接收连接请求,然后升级到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笔记本电脑,当运行应用程序作为管理员或使用netsh add urlacl url=http://+:80/cardgame user=DOMAIN\user在CMD事先.
我想使用“免费”设置将此作为Web应用托管在Azure Cloud中。部署已成功,但启动Web应用时,由于HTTP错误,它会引发拒绝访问异常。确切情况:Image

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


我还尝试了listener.Prefixes.Add("http://+:80/");和网络应用程序的公共IP在'+'符号的地方,但无济于事。
Azure Kudu环境不会在管理模式下运行应用程序,但它也不允许配置netsh命令,所以我觉得这是不可能的.

如果有人能帮我解决这个问题,我会非常感激

  • 有没有一种方法可以使用C#控制台应用程序在Azure Webapp环境中配置WebSocket连接?
  • 还有什么其他的解决方案可以让我以这种方式在云中托管我的服务器(最好是免费的)?
o4tp2gmn

o4tp2gmn1#

不可以,无法使用C#控制台应用程序在Azure Web App环境中配置WebSocket连接。
我们可以将ASP.NETASP.NET Core Web API、ASP.NET Core Blazor和ASP.NET MVC Web应用部署到Azure App Service。

  • 使用Azure Web PubSub服务和Azure SignalR作为Azure中的WebSockets。
  • 下面的代码创建一个WebSocket连接,并允许用户发送和接收消息。
    在Blazor中使用Azure Web PubSub服务:
@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);
    }
}

字符串

本地:


的数据


  • 我遵循了MSDOC的参考,用于使用Visual Studio将ASP.NET Core应用程序发布到Azure。
    Azure:

对于Azure SignalR和Blazor:

我在Blazor中遵循了Azure SignalR的configuration参考

  • 安装软件包dotnet add package Microsoft.Azure.SignalR
  • 下面的代码是针对Azure SignalR与Blazor的configuration
    Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddServerSideBlazor();
    services.AddSignalR().AddAzureSignalR();
    ...
}

appsetting.json:

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

本地:



Azure:


相关问题