Skip to content

In .Net client race condition causes ArgumentNullException #3211

@Xiaohongt

Description

@Xiaohongt

In one of stress test AbortOrStop for WebSocketTransport run results, it catch below exception, looks like when call Connection.Stop() race condition causes reconnect and ArgumentNullException, I will provide client trace when repro again.

ArgumentNullException:
System.ArgumentNullException: Value cannot be null.
Parameter name: stringToEscape
   at System.Uri.EscapeDataString(String stringToEscape)
   at Microsoft.AspNet.SignalR.Client.Infrastructure.UrlBuilder.AppendMessageId(StringBuilder urlStringBuilder, IConnection connection) in d:\dd\SignalR_Dev_Stress\SignalR\src\Microsoft.AspNet.SignalR.Client\Infrastructure\UrlBuilder.cs:line 203
   at Microsoft.AspNet.SignalR.Client.Infrastructure.UrlBuilder.AppendReceiveParameters(StringBuilder urlStringBuilder, IConnection connection) in d:\dd\SignalR_Dev_Stress\SignalR\src\Microsoft.AspNet.SignalR.Client\Infrastructure\UrlBuilder.cs:line 153
   at Microsoft.AspNet.SignalR.Client.Infrastructure.UrlBuilder.BuildReconnect(IConnection connection, String transport, String connectionData) in d:\dd\SignalR_Dev_Stress\SignalR\src\Microsoft.AspNet.SignalR.Client\Infrastructure\UrlBuilder.cs:line 73
   at Microsoft.AspNet.SignalR.Client.Transports.WebSocketTransport.<DoReconnect>d__8.MoveNext() in d:\dd\SignalR_Dev_Stress\SignalR\src\Microsoft.AspNet.SignalR.Client45\Transports\WebSocketTransport.cs:line 176

Here is source code of AppendMessageId method:

        private static void AppendMessageId(StringBuilder urlStringBuilder, IConnection connection)
        {
            if (connection.MessageId != null)
            {
                urlStringBuilder
                    .Append("messageId=")
                    .Append(Uri.EscapeDataString(connection.MessageId))
                    .Append("&");                
            }
        }

Note:

Potentially AppendGroupsToken method should have same race issue when call Connection.Stop() , because in call stack AppendReceiveParameters method also call AppendGroupsToken and in Disconnect method GroupsToken also set to null as well as MessageId set to null.

Source code of AppendGroupsToken method:

        private static void AppendGroupsToken(StringBuilder urlStringBuilder, IConnection connection)
        {
            if (connection.GroupsToken != null)
            {
                urlStringBuilder
                    .Append("groupsToken=")
                    .Append(Uri.EscapeDataString(connection.GroupsToken))
                    .Append("&");
            }
        }

Source code of AppendReceiveParameters method:

        private static void AppendReceiveParameters(StringBuilder urlStringBuilder, IConnection connection)
        {
            AppendMessageId(urlStringBuilder, connection);
            AppendGroupsToken(urlStringBuilder, connection);
#if PORTABLE
            AppendNoCacheUrlParam(urlStringBuilder);
#endif
        }

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions