我创建了一个简单的 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 的原因,它会抛出“访问被拒绝”异常。具体场景:
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 连接?
我们可以将
ASP.NET、ASP.NET Core Web API、ASP.NET Core Blazor 和 ASP.NET MVC Web 应用程序部署到 Azure 应用服务。
@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);
}
}
我遵循参考 蔚蓝:
对于带有 Blazor 的 Azure SignalR:
我遵循了
Blazor安装包 Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddServerSideBlazor();
services.AddSignalR().AddAzureSignalR();
...
}
"Azure": {
"SignalR": {
"Enabled": true,
"ConnectionString": <your-connection-string>
}
}
蔚蓝: