Azure和SignalR:System.Net.Sockets.SocketException:尝试以其访问权限禁止的方式访问套接字

时间:2017-03-06 23:26:49

标签: c# .net azure websocket signalr

我目前正在高频率地遇到这个问题:

  

System.Net.Sockets.SocketException:尝试访问a   套接字以其访问权限禁止的方式

有时在从我的网络应用程序(下面的代码)连接到Azure存储时会发生这种情况,但大部分时间都发生在SignalR上。

基于debug diag,我看到以下内容:

  

w3p.dmp中的394个客户端连接已执行超过90秒的请求。

根据内存转储,与/signalr/connect/signalr/reconnect建立了大量关联。

看起来我正在使用AspNet.SignalR.WebSockets.WebSocketHandler从代码中进行SignalR连接。在这一点上,我不知道该寻找什么 - 可能是罪魁祸首?我们有一个生活在Azure中的Web服务,其中Web应用程序和移动应用程序连接到SignalR背板(redis)。

调试诊断屏幕

enter image description here

Azure存储代码

    public void EnqueueRequest(int requestId)
    {
        // Retrieve storage account from connection string.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings.Get("AzureStorageConnectionString"));

        // Create the queue client.
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

        // Retrieve a reference to a queue.
        CloudQueue queue = queueClient.GetQueueReference(ConfigurationManager.AppSettings.Get("requestQueueName"));

        // Create a message and add it to the queue.
        CloudQueueMessage message = new CloudQueueMessage(castingCallId.ToString(CultureInfo.InvariantCulture));

        queue.AddMessage(message);
    }

中心代理服务器代码

var baseUrl = _dbContext.CurrentTenant.BaseUrl;
_hubConnection = new HubConnection(baseUrl);
_hubProxy = _hubConnection.CreateHubProxy("appHub");
await _hubConnection.Start();
string serialized = null;
try
{
   serialized = JsonSerializerExtensions.SerializeObject(data).SanitizeData();
   await _hubProxy.Invoke((isTypingNotification ? "SendTypingNotification" : "SendClientNotification"), serialized, username);
}
catch (Exception exception)
{
    LogError("1: " + exception);
}

1 个答案:

答案 0 :(得分:1)

SB2055和我一起研究并做了以下修改以消除这个问题:

  1. 不要为要发送的每封邮件创建HubConnection。 HubConnection是一个重量级对象,应该创建一次并重用。如果需要,您可以多次重新创建IHubProxy。您可以通过将HubConnection设置为类静态成员变量来完成此操作。

  2. 我们将连接类型从Web套接字更改为长轮询。