Azure Web 应用程序 HttpListener

问题描述 投票:0回答:1

我创建了一个简单的 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 Cloud 中。部署成功,但在启动 Web 应用程序时,由于 HttpListener 的原因,它会抛出“访问被拒绝”异常。具体场景: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/");

以及“+”号处的 web 应用程序的公共 IP 进行了尝试,但没有成功。

Azure Kudu 环境不会在管理模式下运行应用程序,但它也不允许配置 

netsh

命令,所以我觉得这是不可能做到的......但是然后呢如果您甚至无法监听端口,那么这个 webapp 环境是否适合? (我想对于 ASP.NET...)

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

有没有办法使用 C# 控制台应用程序在 Azure Webapp 环境上配置 Websocket 连接?
  • 还有什么其他解决方案可以让我以这种方式在云中托管我的服务器(最好是免费的)?
c# azure websocket azure-web-app-service httplistener
1个回答
0
投票

我们可以将
ASP.NET

ASP.NET Core Web APIASP.NET Core BlazorASP.NET MVC Web 应用程序部署到 Azure 应用服务。

    在 Azure 中使用 Azure Web PubSub 服务和 Azure SignalR 作为 WebSocket。
  • 以下代码创建 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); } }

本地:

enter image description here

enter image description here

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

enter image description here

对于带有 Blazor 的 Azure SignalR:

我遵循了
Blazor

中Azure SignalR的配置的参考

安装包
    dotnet add package Microsoft.Azure.SignalR
  • 以下代码适用于 Azure SignalR 与 Blazor 的
  • 配置
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

© www.soinside.com 2019 - 2024. All rights reserved.