提问人:Bence Fabo 提问时间:11/16/2023 更新时间:11/23/2023 访问量:72
Azure Webapp HttpListener
Azure Webapp HttpListener
问:
我创建了一个简单的 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# 控制台应用程序在 Azure Web 应用环境中配置 WebSocket 连接。
我们可以将 ASP.NET、ASP.NET Core Web API、ASP.NET Core Blazor 和 ASP.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);
}
}
当地:
- 我遵循了使用 Visual Studio 将 ASP .NET Core 应用发布到 Azure 的参考 MSDOC。
天蓝色:
对于使用 Blazor 的 Azure SignalR:For Azure SignalR with Blazor:
- 安装包
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>
}
}
当地:
天蓝色:
评论
Azure signal
Azure Web PubSub Service