Re-layer the .NET Client into Http and non-Http (#544)

* Re-layer the .NET Client into Http and non-Http
- Moved IConnection to Sockets.Abstractions and removed
HttpConnection and TransportType dependency.
- Renamed Sockets.Client to Sockets.Client.Http
- Renamed Sockets.Common to Sockets.Common.Http
- Renamed Connection to HttpConnection
- Removed HTTP dependency from HubConnection
- Removed tests that were testing connection logic in HubConnection

#518
This commit is contained in:
David Fowler 2017-06-09 08:58:54 -10:00 committed by GitHub
parent bdea0f07ef
commit 12917ef0e9
33 changed files with 389 additions and 590 deletions

View File

@ -16,41 +16,37 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C4BC9889-B49F-41B6-806B-F84941B2549B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C4BC9889-B49F-41B6-806B-F84941B2549B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketsSample", "samples\SocketsSample\SocketsSample.csproj", "{C4AEAB04-F341-4539-B6C0-52368FB4BF9E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocketsSample", "samples\SocketsSample\SocketsSample.csproj", "{C4AEAB04-F341-4539-B6C0-52368FB4BF9E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets", "src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj", "{1715EA8D-8E13-4ACF-8BCA-57D048E55ED8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets", "src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj", "{1715EA8D-8E13-4ACF-8BCA-57D048E55ED8}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6A35B453-52EC-48AF-89CA-D4A69800F131}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6A35B453-52EC-48AF-89CA-D4A69800F131}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Tests", "test\Microsoft.AspNetCore.Sockets.Tests\Microsoft.AspNetCore.Sockets.Tests.csproj", "{AAD719D5-5E31-4ED1-A60F-6EB92EFA66D9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Tests", "test\Microsoft.AspNetCore.Sockets.Tests\Microsoft.AspNetCore.Sockets.Tests.csproj", "{AAD719D5-5E31-4ED1-A60F-6EB92EFA66D9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR", "src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj", "{42E76F87-92B6-45AB-BF07-6B811C0F2CAC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR", "src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj", "{42E76F87-92B6-45AB-BF07-6B811C0F2CAC}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Redis", "src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj", "{59319B72-38BE-4041-8E5C-FF6938874CE8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Redis", "src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj", "{59319B72-38BE-4041-8E5C-FF6938874CE8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatSample", "samples\ChatSample\ChatSample.csproj", "{300979F6-A02E-407A-B8DF-F6200806C18D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatSample", "samples\ChatSample\ChatSample.csproj", "{300979F6-A02E-407A-B8DF-F6200806C18D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Test.Server", "client-ts\Microsoft.AspNetCore.SignalR.Test.Server\Microsoft.AspNetCore.SignalR.Test.Server.csproj", "{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Test.Server", "client-ts\Microsoft.AspNetCore.SignalR.Test.Server\Microsoft.AspNetCore.SignalR.Test.Server.csproj", "{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebSocketSample", "samples\WebSocketSample\WebSocketSample.csproj", "{EE790D50-C632-46B9-A430-06FA2F2FDCD7}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketSample", "samples\WebSocketSample\WebSocketSample.csproj", "{EE790D50-C632-46B9-A430-06FA2F2FDCD7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Client", "src\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj", "{623FD372-36DE-41A9-A564-F6040D570DBD}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.Tests", "test\Microsoft.AspNetCore.SignalR.Client.Tests\Microsoft.AspNetCore.SignalR.Client.Tests.csproj", "{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.Tests", "test\Microsoft.AspNetCore.SignalR.Client.Tests\Microsoft.AspNetCore.SignalR.Client.Tests.csproj", "{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common", "src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj", "{E37324FF-6BAF-4243-BA80-7C024CF5F29D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Common", "src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj", "{E37324FF-6BAF-4243-BA80-7C024CF5F29D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client", "src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj", "{354335AB-CEE9-4434-A641-78058F6EFE56}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client", "src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj", "{354335AB-CEE9-4434-A641-78058F6EFE56}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Common", "src\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj", "{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.TS", "client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj", "{333526A4-633B-491A-AC45-CC62A0012D1C}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.TS", "client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj", "{333526A4-633B-491A-AC45-CC62A0012D1C}"
EndProject EndProject
@ -67,7 +63,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client-ts", "client-ts", "{
client-ts\package.json = client-ts\package.json client-ts\package.json = client-ts\package.json
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "test\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "test\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common.Tests", "test\Microsoft.AspNetCore.SignalR.Common.Tests\Microsoft.AspNetCore.SignalR.Common.Tests.csproj", "{75E342F6-5445-4E7E-9143-6D9AE62C2B1E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common.Tests", "test\Microsoft.AspNetCore.SignalR.Common.Tests\Microsoft.AspNetCore.SignalR.Common.Tests.csproj", "{75E342F6-5445-4E7E-9143-6D9AE62C2B1E}"
EndProject EndProject
@ -77,6 +73,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Signal
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Http", "src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj", "{9E403E93-3284-486F-9A5F-1E15FCE426A5}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Http", "src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj", "{9E403E93-3284-486F-9A5F-1E15FCE426A5}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Client.Http", "src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj", "{B0243F99-2D3F-4CC6-AD71-E3F891B64724}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Common.Http", "src\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj", "{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -127,10 +127,6 @@ Global
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.Build.0 = Release|Any CPU {EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.Build.0 = Release|Any CPU
{623FD372-36DE-41A9-A564-F6040D570DBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{623FD372-36DE-41A9-A564-F6040D570DBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{623FD372-36DE-41A9-A564-F6040D570DBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{623FD372-36DE-41A9-A564-F6040D570DBD}.Release|Any CPU.Build.0 = Release|Any CPU
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -147,10 +143,6 @@ Global
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Release|Any CPU.Build.0 = Release|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU {333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU {333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -175,6 +167,14 @@ Global
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Debug|Any CPU.Build.0 = Debug|Any CPU {9E403E93-3284-486F-9A5F-1E15FCE426A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.Build.0 = Release|Any CPU {9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.Build.0 = Release|Any CPU
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Release|Any CPU.Build.0 = Release|Any CPU
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -191,12 +191,10 @@ Global
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
{EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
{623FD372-36DE-41A9-A564-F6040D570DBD} = {DA69F624-5398-4884-87E4-B816698CDE65}
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {B19C15A5-F5EA-4CA7-936B-1166ABEE35C4} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65} {E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65}
{354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65} {354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65}
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099} = {DA69F624-5398-4884-87E4-B816698CDE65}
{333526A4-633B-491A-AC45-CC62A0012D1C} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B} {333526A4-633B-491A-AC45-CC62A0012D1C} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
{6CEC3DC2-5B01-45A8-8F0D-8531315DA90B} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {6CEC3DC2-5B01-45A8-8F0D-8531315DA90B} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
@ -204,5 +202,7 @@ Global
{F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65} {F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65}
{FD80BB0F-0876-4F11-8D84-6657C8EF84CA} = {DA69F624-5398-4884-87E4-B816698CDE65} {FD80BB0F-0876-4F11-8D84-6657C8EF84CA} = {DA69F624-5398-4884-87E4-B816698CDE65}
{9E403E93-3284-486F-9A5F-1E15FCE426A5} = {DA69F624-5398-4884-87E4-B816698CDE65} {9E403E93-3284-486F-9A5F-1E15FCE426A5} = {DA69F624-5398-4884-87E4-B816698CDE65}
{B0243F99-2D3F-4CC6-AD71-E3F891B64724} = {DA69F624-5398-4884-87E4-B816698CDE65}
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47} = {DA69F624-5398-4884-87E4-B816698CDE65}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -15,6 +15,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -6,6 +6,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -32,7 +33,8 @@ namespace ClientSample
var loggerFactory = new LoggerFactory(); var loggerFactory = new LoggerFactory();
Console.WriteLine("Connecting to {0}", baseUrl); Console.WriteLine("Connecting to {0}", baseUrl);
var connection = new HubConnection(new Uri(baseUrl), loggerFactory); var httpConnection = new HttpConnection(new Uri(baseUrl));
var connection = new HubConnection(httpConnection, loggerFactory);
try try
{ {
await connection.StartAsync(); await connection.StartAsync();

View File

@ -8,7 +8,6 @@ using System.Net.Http;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -37,7 +36,7 @@ namespace ClientSample
var logger = loggerFactory.CreateLogger<Program>(); var logger = loggerFactory.CreateLogger<Program>();
Console.WriteLine($"Connecting to {baseUrl}..."); Console.WriteLine($"Connecting to {baseUrl}...");
var connection = new Connection(new Uri(baseUrl), loggerFactory); var connection = new HttpConnection(new Uri(baseUrl), loggerFactory);
try try
{ {
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();

View File

@ -5,13 +5,11 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Threading.Tasks.Channels; using System.Threading.Tasks.Channels;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
@ -27,8 +25,6 @@ namespace Microsoft.AspNetCore.SignalR.Client
private readonly IHubProtocol _protocol; private readonly IHubProtocol _protocol;
private readonly HubBinder _binder; private readonly HubBinder _binder;
private HttpClient _httpClient;
private readonly object _pendingCallsLock = new object(); private readonly object _pendingCallsLock = new object();
private readonly CancellationTokenSource _connectionActive = new CancellationTokenSource(); private readonly CancellationTokenSource _connectionActive = new CancellationTokenSource();
private readonly Dictionary<string, InvocationRequest> _pendingCalls = new Dictionary<string, InvocationRequest>(); private readonly Dictionary<string, InvocationRequest> _pendingCalls = new Dictionary<string, InvocationRequest>();
@ -48,12 +44,8 @@ namespace Microsoft.AspNetCore.SignalR.Client
remove { _connection.Closed -= value; } remove { _connection.Closed -= value; }
} }
public HubConnection(Uri url) public HubConnection(IConnection connection)
: this(new Connection(url), new JsonHubProtocol(new JsonSerializer()), null) : this(connection, new JsonHubProtocol(new JsonSerializer()), null)
{ }
public HubConnection(Uri url, ILoggerFactory loggerFactory)
: this(new Connection(url), new JsonHubProtocol(new JsonSerializer()), loggerFactory)
{ } { }
// These are only really needed for tests now... // These are only really needed for tests now...
@ -82,31 +74,14 @@ namespace Microsoft.AspNetCore.SignalR.Client
_connection.Closed += Shutdown; _connection.Closed += Shutdown;
} }
public Task StartAsync() => StartAsync(TransportType.All, httpClient: null); public async Task StartAsync()
public Task StartAsync(HttpClient httpClient) => StartAsync(TransportType.All, httpClient: httpClient);
public Task StartAsync(TransportType transportType) => StartAsync(transportType, httpClient: null);
public async Task StartAsync(TransportType transportType, HttpClient httpClient)
{ {
if (httpClient == null) await _connection.StartAsync();
{
// We are creating the client so store it to be able to dispose
_httpClient = httpClient = new HttpClient();
}
await _connection.StartAsync(new DefaultTransportFactory(transportType, _loggerFactory, httpClient), httpClient);
}
public async Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient)
{
await _connection.StartAsync(transportFactory, httpClient);
} }
public async Task DisposeAsync() public async Task DisposeAsync()
{ {
await _connection.DisposeAsync(); await _connection.DisposeAsync();
_httpClient?.Dispose();
} }
// TODO: Client return values/tasks? // TODO: Client return values/tasks?

View File

@ -13,7 +13,8 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(AspNetCoreVersion)" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -21,8 +21,4 @@
<PackageReference Include="System.IO.Pipelines.Text.Primitives" Version="$(CoreFxLabsVersion)" /> <PackageReference Include="System.IO.Pipelines.Text.Primitives" Version="$(CoreFxLabsVersion)" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
</ItemGroup>
</Project> </Project>

View File

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -10,7 +9,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
{ {
public interface IConnection public interface IConnection
{ {
Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient); Task StartAsync();
Task SendAsync(byte[] data, CancellationToken cancellationToken); Task SendAsync(byte[] data, CancellationToken cancellationToken);
Task DisposeAsync(); Task DisposeAsync();

View File

@ -15,18 +15,19 @@ using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Sockets.Client namespace Microsoft.AspNetCore.Sockets.Client
{ {
public class Connection : IConnection public class HttpConnection : IConnection
{ {
private readonly ILoggerFactory _loggerFactory; private readonly ILoggerFactory _loggerFactory;
private readonly ILogger _logger; private readonly ILogger _logger;
private volatile int _connectionState = ConnectionState.Initial; private volatile int _connectionState = ConnectionState.Initial;
private volatile IChannelConnection<byte[], SendMessage> _transportChannel; private volatile IChannelConnection<byte[], SendMessage> _transportChannel;
private HttpClient _httpClient; private readonly HttpClient _httpClient;
private volatile ITransport _transport; private volatile ITransport _transport;
private volatile Task _receiveLoopTask; private volatile Task _receiveLoopTask;
private TaskCompletionSource<object> _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously); private TaskCompletionSource<object> _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
private TaskQueue _eventQueue = new TaskQueue(); private TaskQueue _eventQueue = new TaskQueue();
private readonly ITransportFactory _transportFactory;
private ReadableChannel<byte[]> Input => _transportChannel.Input; private ReadableChannel<byte[]> Input => _transportChannel.Input;
private WritableChannel<SendMessage> Output => _transportChannel.Output; private WritableChannel<SendMessage> Output => _transportChannel.Output;
@ -37,34 +38,45 @@ namespace Microsoft.AspNetCore.Sockets.Client
public event Action<byte[]> Received; public event Action<byte[]> Received;
public event Action<Exception> Closed; public event Action<Exception> Closed;
public Connection(Uri url) public HttpConnection(Uri url)
: this(url, null) : this(url, TransportType.WebSockets)
{ } { }
public Connection(Uri url, ILoggerFactory loggerFactory) public HttpConnection(Uri url, TransportType transportType)
: this(url, transportType, loggerFactory: null)
{
}
public HttpConnection(Uri url, ILoggerFactory loggerFactory)
: this(url, TransportType.WebSockets, loggerFactory, httpMessageHandler: null)
{
}
public HttpConnection(Uri url, TransportType transportType, ILoggerFactory loggerFactory)
: this(url, transportType, loggerFactory, httpMessageHandler: null)
{
}
public HttpConnection(Uri url, TransportType transportType, ILoggerFactory loggerFactory, HttpMessageHandler httpMessageHandler)
{ {
Url = url ?? throw new ArgumentNullException(nameof(url)); Url = url ?? throw new ArgumentNullException(nameof(url));
_loggerFactory = loggerFactory ?? NullLoggerFactory.Instance; _loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
_logger = _loggerFactory.CreateLogger<Connection>(); _logger = _loggerFactory.CreateLogger<HttpConnection>();
_httpClient = httpMessageHandler == null ? new HttpClient() : new HttpClient(httpMessageHandler);
_transportFactory = new DefaultTransportFactory(transportType, _loggerFactory, _httpClient);
} }
public Task StartAsync() => StartAsync(transportFactory: null, httpClient: null); public HttpConnection(Uri url, ITransportFactory transportFactory, ILoggerFactory loggerFactory, HttpMessageHandler httpMessageHandler)
public Task StartAsync(HttpClient httpClient) => StartAsync(transportFactory: null, httpClient: httpClient);
public Task StartAsync(ITransportFactory transportFactory) => StartAsync(transportFactory, httpClient: null);
public Task StartAsync(TransportType transportType) => StartAsync(transportType, httpClient: null);
public Task StartAsync(TransportType transportType, HttpClient httpClient)
{ {
if (httpClient == null) Url = url ?? throw new ArgumentNullException(nameof(url));
{ _loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
// We are creating the client so store it to be able to dispose _logger = _loggerFactory.CreateLogger<HttpConnection>();
_httpClient = httpClient = new HttpClient(); _httpClient = httpMessageHandler == null ? new HttpClient() : new HttpClient(httpMessageHandler);
} _transportFactory = transportFactory ?? throw new ArgumentNullException(nameof(transportFactory));
return StartAsync(new DefaultTransportFactory(transportType, _loggerFactory, httpClient), httpClient);
} }
public Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient) public Task StartAsync()
{ {
if (Interlocked.CompareExchange(ref _connectionState, ConnectionState.Connecting, ConnectionState.Initial) if (Interlocked.CompareExchange(ref _connectionState, ConnectionState.Connecting, ConnectionState.Initial)
!= ConnectionState.Initial) != ConnectionState.Initial)
@ -73,13 +85,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
new InvalidOperationException("Cannot start a connection that is not in the Initial state.")); new InvalidOperationException("Cannot start a connection that is not in the Initial state."));
} }
if (httpClient == null) StartAsyncInternal()
{
// We are creating the client so store it to be able to dispose
_httpClient = httpClient = new HttpClient();
}
StartAsyncInternal(transportFactory ?? new DefaultTransportFactory(TransportType.All, _loggerFactory, httpClient), httpClient)
.ContinueWith(t => .ContinueWith(t =>
{ {
if (t.IsFaulted) if (t.IsFaulted)
@ -99,13 +105,13 @@ namespace Microsoft.AspNetCore.Sockets.Client
return _startTcs.Task; return _startTcs.Task;
} }
private async Task StartAsyncInternal(ITransportFactory transportFactory, HttpClient httpClient) private async Task StartAsyncInternal()
{ {
_logger.LogDebug("Starting connection."); _logger.LogDebug("Starting connection.");
try try
{ {
var negotiationResponse = await Negotiate(Url, httpClient, _logger); var negotiationResponse = await Negotiate(Url, _httpClient, _logger);
// Connection is being stopped while start was in progress // Connection is being stopped while start was in progress
if (_connectionState == ConnectionState.Disconnected) if (_connectionState == ConnectionState.Disconnected)
@ -114,7 +120,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
return; return;
} }
_transport = transportFactory.CreateTransport(GetAvailableServerTransports(negotiationResponse)); _transport = _transportFactory.CreateTransport(GetAvailableServerTransports(negotiationResponse));
var connectUrl = CreateConnectUrl(Url, negotiationResponse); var connectUrl = CreateConnectUrl(Url, negotiationResponse);
_logger.LogDebug("Starting transport '{0}' with Url: {1}", _transport.GetType().Name, connectUrl); _logger.LogDebug("Starting transport '{0}' with Url: {1}", _transport.GetType().Name, connectUrl);
@ -161,7 +167,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
_logger.LogDebug("Draining event queue"); _logger.LogDebug("Draining event queue");
await _eventQueue.Drain(); await _eventQueue.Drain();
_httpClient?.Dispose(); _httpClient.Dispose();
_logger.LogDebug("Raising Closed event"); _logger.LogDebug("Raising Closed event");
@ -387,7 +393,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
await _receiveLoopTask; await _receiveLoopTask;
} }
_httpClient?.Dispose(); _httpClient.Dispose();
} }
private class ConnectionState private class ConnectionState

View File

@ -13,7 +13,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" />
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -17,7 +17,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Routing" Version="$(AspNetCoreVersion)" />

View File

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SignalR.Tests.Common; using Microsoft.AspNetCore.SignalR.Tests.Common;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.AspNetCore.TestHost; using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -51,21 +52,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
{ {
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var result = await connection.Invoke<string>(nameof(TestHub.HelloWorld)); var result = await connection.Invoke<string>(nameof(TestHub.HelloWorld));
Assert.Equal("Hello World!", result); Assert.Equal("Hello World!", result);
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -75,21 +74,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
const string originalMessage = "SignalR"; const string originalMessage = "SignalR";
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var result = await connection.Invoke<string>(nameof(TestHub.Echo), originalMessage); var result = await connection.Invoke<string>(nameof(TestHub.Echo), originalMessage);
Assert.Equal(originalMessage, result); Assert.Equal(originalMessage, result);
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -99,21 +96,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
const string originalMessage = "SignalR"; const string originalMessage = "SignalR";
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var result = await connection.Invoke<string>(nameof(TestHub.Echo).ToLowerInvariant(), originalMessage); var result = await connection.Invoke<string>(nameof(TestHub.Echo).ToLowerInvariant(), originalMessage);
Assert.Equal(originalMessage, result); Assert.Equal(originalMessage, result);
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -123,24 +118,22 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
const string originalMessage = "SignalR"; const string originalMessage = "SignalR";
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var tcs = new TaskCompletionSource<string>(); var tcs = new TaskCompletionSource<string>();
connection.On<string>("Echo", tcs.SetResult); connection.On<string>("Echo", tcs.SetResult);
await connection.Invoke(nameof(TestHub.CallEcho), originalMessage).OrTimeout(); await connection.Invoke(nameof(TestHub.CallEcho), originalMessage).OrTimeout();
Assert.Equal(originalMessage, await tcs.Task.OrTimeout()); Assert.Equal(originalMessage, await tcs.Task.OrTimeout());
} }
finally finally
{ {
await connection.DisposeAsync().OrTimeout(); await connection.DisposeAsync().OrTimeout();
}
} }
} }
@ -149,23 +142,21 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
{ {
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var tcs = new TaskCompletionSource<string>(); var tcs = new TaskCompletionSource<string>();
var results = await connection.Stream<string>(nameof(TestHub.Stream)).ReadAllAsync().OrTimeout(); var results = await connection.Stream<string>(nameof(TestHub.Stream)).ReadAllAsync().OrTimeout();
Assert.Equal(new[] { "a", "b", "c" }, results.ToArray()); Assert.Equal(new[] { "a", "b", "c" }, results.ToArray());
} }
finally finally
{ {
await connection.DisposeAsync().OrTimeout(); await connection.DisposeAsync().OrTimeout();
}
} }
} }
@ -174,22 +165,20 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
{ {
var loggerFactory = CreateLogger(); var loggerFactory = CreateLogger();
using (var httpClient = _testServer.CreateClient()) var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
var connection = new HubConnection(httpConnection, loggerFactory);
try
{ {
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
var ex = await Assert.ThrowsAnyAsync<Exception>( var ex = await Assert.ThrowsAnyAsync<Exception>(
async () => await connection.Invoke("!@#$%")); async () => await connection.Invoke("!@#$%"));
Assert.Equal("Unknown hub method '!@#$%'", ex.Message); Assert.Equal("Unknown hub method '!@#$%'", ex.Message);
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }

View File

@ -15,6 +15,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(AspNetCoreVersion)" />

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
[Fact] [Fact]
public void CannotCreateConnectionWithNullUrl() public void CannotCreateConnectionWithNullUrl()
{ {
var exception = Assert.Throws<ArgumentNullException>(() => new Connection(null)); var exception = Assert.Throws<ArgumentNullException>(() => new HttpConnection(null));
Assert.Equal("url", exception.ParamName); Assert.Equal("url", exception.ParamName);
} }
@ -29,17 +29,16 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
public void ConnectionReturnsUrlUsedToStartTheConnection() public void ConnectionReturnsUrlUsedToStartTheConnection()
{ {
var connectionUrl = new Uri("http://fakeuri.org/"); var connectionUrl = new Uri("http://fakeuri.org/");
Assert.Equal(connectionUrl, new Connection(connectionUrl).Url); Assert.Equal(connectionUrl, new HttpConnection(connectionUrl).Url);
} }
[Theory] [Theory]
[InlineData((TransportType)0)] [InlineData((TransportType)0)]
[InlineData(TransportType.All + 1)] [InlineData(TransportType.All + 1)]
public async Task CannotStartConnectionWithInvalidTransportType(TransportType requestedTransportType) public void CannotStartConnectionWithInvalidTransportType(TransportType requestedTransportType)
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); Assert.Throws<ArgumentOutOfRangeException>(
await Assert.ThrowsAsync<ArgumentOutOfRangeException>( () => new HttpConnection(new Uri("http://fakeuri.org/"), requestedTransportType));
() => connection.StartAsync(requestedTransportType));
} }
[Fact] [Fact]
@ -57,21 +56,18 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); await connection.StartAsync();
try var exception =
{ await Assert.ThrowsAsync<InvalidOperationException>(
await connection.StartAsync(TransportType.LongPolling, httpClient); async () => await connection.StartAsync());
var exception = Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
await Assert.ThrowsAsync<InvalidOperationException>( }
async () => await connection.StartAsync()); finally
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message); {
} await connection.DisposeAsync();
finally
{
await connection.DisposeAsync();
}
} }
} }
@ -89,18 +85,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
await connection.DisposeAsync(); await connection.DisposeAsync();
var exception = var exception =
await Assert.ThrowsAsync<InvalidOperationException>( await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.StartAsync()); async () => await connection.StartAsync());
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message); Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
}
} }
[Fact] [Fact]
@ -108,7 +101,7 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
{ {
using (var httpClient = new HttpClient()) using (var httpClient = new HttpClient())
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
await connection.DisposeAsync(); await connection.DisposeAsync();
var exception = var exception =
await Assert.ThrowsAsync<InvalidOperationException>( await Assert.ThrowsAsync<InvalidOperationException>(
@ -142,31 +135,29 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var transport = new Mock<ITransport>();
transport.Setup(t => t.StopAsync()).Returns(async () => { await releaseDisposeTcs.Task; });
var connection = new Connection(new Uri("http://fakeuri.org/"));
var startTask = connection.StartAsync(new TestTransportFactory(transport.Object), httpClient); var transport = new Mock<ITransport>();
await allowDisposeTcs.Task; transport.Setup(t => t.StopAsync()).Returns(async () => { await releaseDisposeTcs.Task; });
var disposeTask = connection.DisposeAsync(); var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(transport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
// allow StartAsync to continue once DisposeAsync has started
releaseNegotiateTcs.SetResult(null);
// unblock DisposeAsync only after StartAsync completed var startTask = connection.StartAsync();
await startTask.OrTimeout(); await allowDisposeTcs.Task;
releaseDisposeTcs.SetResult(null); var disposeTask = connection.DisposeAsync();
await disposeTask.OrTimeout(); // allow StartAsync to continue once DisposeAsync has started
releaseNegotiateTcs.SetResult(null);
transport.Verify(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()), Times.Never); // unblock DisposeAsync only after StartAsync completed
} await startTask.OrTimeout();
releaseDisposeTcs.SetResult(null);
await disposeTask.OrTimeout();
transport.Verify(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()), Times.Never);
} }
[Fact] [Fact]
public async Task SendThrowsIfConnectionIsNotStarted() public async Task SendThrowsIfConnectionIsNotStarted()
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
var exception = await Assert.ThrowsAsync<InvalidOperationException>( var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.SendAsync(new byte[0])); async () => await connection.SendAsync(new byte[0]));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message); Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
@ -186,17 +177,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
await connection.StartAsync(TransportType.LongPolling, httpClient); var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
await connection.DisposeAsync();
var exception = await Assert.ThrowsAsync<InvalidOperationException>( await connection.StartAsync();
async () => await connection.SendAsync(new byte[0])); await connection.DisposeAsync();
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
} var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.SendAsync(new byte[0]));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
} }
[Fact] [Fact]
@ -213,22 +202,20 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var connectedEventRaisedTcs = new TaskCompletionSource<object>();
try connection.Connected += () => connectedEventRaisedTcs.SetResult(null);
{
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
connection.Connected += () => connectedEventRaisedTcs.SetResult(null);
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
await connectedEventRaisedTcs.Task.OrTimeout(); await connectedEventRaisedTcs.Task.OrTimeout();
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -250,25 +237,23 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
mockTransport.Setup(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>())) mockTransport.Setup(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()))
.Returns(Task.FromException(new InvalidOperationException("Transport failed to start"))); .Returns(Task.FromException(new InvalidOperationException("Transport failed to start")));
using (var httpClient = new HttpClient(mockHttpHandler.Object))
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
var connectedEventRaised = false;
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); connection.Connected += () => connectedEventRaised = true;
var connectedEventRaised = false;
try await Assert.ThrowsAsync<InvalidOperationException>(
{ async () => await connection.StartAsync());
connection.Connected += () => connectedEventRaised = true;
await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient));
}
finally
{
await connection.DisposeAsync();
}
Assert.False(connectedEventRaised);
} }
finally
{
await connection.DisposeAsync();
}
Assert.False(connectedEventRaised);
} }
[Fact] [Fact]
@ -285,19 +270,17 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
var closedEventTcs = new TaskCompletionSource<Exception>(); var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
connection.Closed += e => closedEventTcs.SetResult(e);
await connection.StartAsync(TransportType.LongPolling, httpClient); var closedEventTcs = new TaskCompletionSource<Exception>();
await connection.DisposeAsync(); connection.Closed += e => closedEventTcs.SetResult(e);
// in case of clean disconnect error should be null await connection.StartAsync();
Assert.Null(await closedEventTcs.Task.OrTimeout()); await connection.DisposeAsync();
}
// in case of clean disconnect error should be null
Assert.Null(await closedEventTcs.Task.OrTimeout());
} }
[Fact] [Fact]
@ -317,21 +300,18 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{ var closedEventTcs = new TaskCompletionSource<Exception>();
var connection = new Connection(new Uri("http://fakeuri.org/")); connection.Closed += e => closedEventTcs.TrySetResult(e);
var closedEventTcs = new TaskCompletionSource<Exception>();
connection.Closed += e => closedEventTcs.TrySetResult(e);
try try
{ {
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
Assert.IsType<HttpRequestException>(await closedEventTcs.Task.OrTimeout()); Assert.IsType<HttpRequestException>(await closedEventTcs.Task.OrTimeout());
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -367,16 +347,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
return Task.CompletedTask; return Task.CompletedTask;
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
var receivedInvoked = false;
connection.Received += (m) => receivedInvoked = true;
await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient); var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
await connection.DisposeAsync(); var receivedInvoked = false;
Assert.False(receivedInvoked); connection.Received += (m) => receivedInvoked = true;
}
await connection.StartAsync();
await connection.DisposeAsync();
Assert.False(receivedInvoked);
} }
[Fact] [Fact]
@ -408,39 +386,37 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
return Task.CompletedTask; return Task.CompletedTask;
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var closedTcs = new TaskCompletionSource<object>();
var allowDisposeTcs = new TaskCompletionSource<object>();
int receivedInvocationCount = 0;
var connection = new Connection(new Uri("http://fakeuri.org/")); var closedTcs = new TaskCompletionSource<object>();
connection.Received += var allowDisposeTcs = new TaskCompletionSource<object>();
async (m) => int receivedInvocationCount = 0;
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
connection.Received +=
async (m) =>
{
if (Interlocked.Increment(ref receivedInvocationCount) == 2)
{ {
if (Interlocked.Increment(ref receivedInvocationCount) == 2) allowDisposeTcs.TrySetResult(null);
{ }
allowDisposeTcs.TrySetResult(null); await closedTcs.Task;
} };
await closedTcs.Task; connection.Closed += e => closedTcs.SetResult(null);
};
connection.Closed += e => closedTcs.SetResult(null);
await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient); await connection.StartAsync();
channel.Output.TryWrite(Array.Empty<byte>()); channel.Output.TryWrite(Array.Empty<byte>());
channel.Output.TryWrite(Array.Empty<byte>()); channel.Output.TryWrite(Array.Empty<byte>());
await allowDisposeTcs.Task.OrTimeout(); await allowDisposeTcs.Task.OrTimeout();
await connection.DisposeAsync(); await connection.DisposeAsync();
Assert.Equal(2, receivedInvocationCount); Assert.Equal(2, receivedInvocationCount);
// if the events were running on the main loop they would deadlock // if the events were running on the main loop they would deadlock
await closedTcs.Task.OrTimeout(); await closedTcs.Task.OrTimeout();
}
} }
[Fact] [Fact]
public async Task ClosedEventNotRaisedWhenTheClientIsStoppedButWasNeverStarted() public async Task ClosedEventNotRaisedWhenTheClientIsStoppedButWasNeverStarted()
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
bool closedEventRaised = false; bool closedEventRaised = false;
connection.Closed += e => closedEventRaised = true; connection.Closed += e => closedEventRaised = true;
@ -467,11 +443,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
using (var httpClient = new HttpClient(mockHttpHandler.Object)) using (var httpClient = new HttpClient(mockHttpHandler.Object))
{ {
var longPollingTransport = new LongPollingTransport(httpClient, new LoggerFactory()); var longPollingTransport = new LongPollingTransport(httpClient, new LoggerFactory());
var connection = new Connection(new Uri("http://fakeuri.org/")); var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(longPollingTransport), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try try
{ {
await connection.StartAsync(new TestTransportFactory(longPollingTransport), httpClient); await connection.StartAsync();
Assert.False(longPollingTransport.Running.IsCompleted); Assert.False(longPollingTransport.Running.IsCompleted);
} }
@ -506,28 +482,25 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); await connection.StartAsync();
try
{
await connection.StartAsync(TransportType.LongPolling, httpClient);
await connection.SendAsync(data); await connection.SendAsync(data);
Assert.Equal(data, await sendTcs.Task.OrTimeout()); Assert.Equal(data, await sendTcs.Task.OrTimeout());
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
[Fact] [Fact]
public async Task SendAsyncThrowsIfConnectionIsNotStarted() public async Task SendAsyncThrowsIfConnectionIsNotStarted()
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
var exception = await Assert.ThrowsAsync<InvalidOperationException>( var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.SendAsync(new byte[0])); async () => await connection.SendAsync(new byte[0]));
@ -555,18 +528,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content); : ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
await connection.DisposeAsync(); await connection.DisposeAsync();
var exception = await Assert.ThrowsAsync<InvalidOperationException>( var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.SendAsync(new byte[0])); async () => await connection.SendAsync(new byte[0]));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message); Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
}
} }
[Fact] [Fact]
@ -586,17 +556,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{
var connection = new Connection(new Uri("http://fakeuri.org/"));
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
var exception = await Assert.ThrowsAsync<HttpRequestException>( var exception = await Assert.ThrowsAsync<HttpRequestException>(
async () => await connection.SendAsync(new byte[0])); async () => await connection.SendAsync(new byte[0]));
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
[Fact] [Fact]
@ -621,33 +588,30 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content); : ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var receiveTcs = new TaskCompletionSource<string>();
try connection.Received += (data) => receiveTcs.TrySetResult(Encoding.UTF8.GetString(data));
{ connection.Closed += e =>
var receiveTcs = new TaskCompletionSource<string>(); {
connection.Received += (data) => receiveTcs.TrySetResult(Encoding.UTF8.GetString(data)); if (e != null)
connection.Closed += e =>
{ {
if (e != null) receiveTcs.TrySetException(e);
{ }
receiveTcs.TrySetException(e); else
} {
else receiveTcs.TrySetCanceled();
{ }
receiveTcs.TrySetCanceled(); };
}
};
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
Assert.Equal("42", await receiveTcs.Task.OrTimeout()); Assert.Equal("42", await receiveTcs.Task.OrTimeout());
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -668,28 +632,25 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
: ResponseUtils.CreateResponse(HttpStatusCode.OK); : ResponseUtils.CreateResponse(HttpStatusCode.OK);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
try
{ {
var connection = new Connection(new Uri("http://fakeuri.org/")); var closeTcs = new TaskCompletionSource<Exception>();
try connection.Closed += e => closeTcs.TrySetResult(e);
{
var closeTcs = new TaskCompletionSource<Exception>();
connection.Closed += e => closeTcs.TrySetResult(e);
await connection.StartAsync(TransportType.LongPolling, httpClient); await connection.StartAsync();
// Exception in send should shutdown the connection // Exception in send should shutdown the connection
await closeTcs.Task.OrTimeout(); await closeTcs.Task.OrTimeout();
var exception = await Assert.ThrowsAsync<InvalidOperationException>( var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await connection.SendAsync(new byte[0])); async () => await connection.SendAsync(new byte[0]));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message); Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
} }
finally finally
{ {
await connection.DisposeAsync(); await connection.DisposeAsync();
}
} }
} }
@ -707,14 +668,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
return ResponseUtils.CreateResponse(HttpStatusCode.OK, negotiatePayload); return ResponseUtils.CreateResponse(HttpStatusCode.OK, negotiatePayload);
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{ var exception = await Assert.ThrowsAsync<FormatException>(
var connection = new Connection(new Uri("http://fakeuri.org/")); () => connection.StartAsync());
var exception = await Assert.ThrowsAsync<FormatException>(
() => connection.StartAsync(TransportType.LongPolling, httpClient));
Assert.Equal("Invalid negotiation response received.", exception.Message); Assert.Equal("Invalid negotiation response received.", exception.Message);
}
} }
[Fact] [Fact]
@ -730,14 +688,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
ResponseUtils.CreateNegotiationResponse(connectionId: null)); ResponseUtils.CreateNegotiationResponse(connectionId: null));
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{ var exception = await Assert.ThrowsAsync<FormatException>(
var connection = new Connection(new Uri("http://fakeuri.org/")); () => connection.StartAsync());
var exception = await Assert.ThrowsAsync<FormatException>(
() => connection.StartAsync(TransportType.LongPolling, httpClient));
Assert.Equal("Invalid connection id returned in negotiation response.", exception.Message); Assert.Equal("Invalid connection id returned in negotiation response.", exception.Message);
}
} }
[Fact] [Fact]
@ -753,14 +708,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
ResponseUtils.CreateNegotiationResponse(transportTypes: null)); ResponseUtils.CreateNegotiationResponse(transportTypes: null));
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{ var exception = await Assert.ThrowsAsync<FormatException>(
var connection = new Connection(new Uri("http://fakeuri.org/")); () => connection.StartAsync());
var exception = await Assert.ThrowsAsync<FormatException>(
() => connection.StartAsync(TransportType.LongPolling, httpClient));
Assert.Equal("No transports returned in negotiation response.", exception.Message); Assert.Equal("No transports returned in negotiation response.", exception.Message);
}
} }
[Theory] [Theory]
@ -778,14 +730,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
ResponseUtils.CreateNegotiationResponse(transportTypes: serverTransports)); ResponseUtils.CreateNegotiationResponse(transportTypes: serverTransports));
}); });
using (var httpClient = new HttpClient(mockHttpHandler.Object)) var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
{ var exception = await Assert.ThrowsAsync<InvalidOperationException>(
var connection = new Connection(new Uri("http://fakeuri.org/")); () => connection.StartAsync());
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
() => connection.StartAsync(TransportType.LongPolling, httpClient));
Assert.Equal("No requested transports available on the server.", exception.Message); Assert.Equal("No requested transports available on the server.", exception.Message);
}
} }
} }
} }

View File

@ -4,19 +4,13 @@
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Client.Tests;
using Microsoft.AspNetCore.SignalR.Internal; using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.SignalR.Internal.Protocol; using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.AspNetCore.SignalR.Tests.Common; using Microsoft.AspNetCore.SignalR.Tests.Common;
using Microsoft.AspNetCore.Sockets;
using Microsoft.AspNetCore.Sockets.Client; using Microsoft.AspNetCore.Sockets.Client;
using Microsoft.AspNetCore.Sockets.Client.Tests;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Moq; using Moq;
using Moq.Protected;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.SignalR.Client.Tests namespace Microsoft.AspNetCore.SignalR.Client.Tests
@ -24,110 +18,34 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
public class HubConnectionTests public class HubConnectionTests
{ {
[Fact] [Fact]
public void CannotCreateHubConnectionWithNullUrl() public async Task StartAsyncCallsConnectionStart()
{ {
var exception = Assert.Throws<ArgumentNullException>( var connection = new Mock<IConnection>();
() => new HubConnection((Uri)null, Mock.Of<ILoggerFactory>())); connection.Setup(m => m.StartAsync()).Returns(Task.CompletedTask).Verifiable();
Assert.Equal("url", exception.ParamName); var hubConnection = new HubConnection(connection.Object);
await hubConnection.StartAsync();
connection.Verify(c => c.StartAsync(), Times.Once());
} }
[Fact] [Fact]
public async Task CanDisposeNotStartedHubConnection() public async Task DisposeAsyncCallsConnectionStart()
{ {
await new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory()) var connection = new Mock<IConnection>();
.DisposeAsync(); connection.Setup(m => m.StartAsync()).Verifiable();
} var hubConnection = new HubConnection(connection.Object);
[Fact]
public async Task CannotStartRunningHubConnection()
{
var mockHttpHandler = new Mock<HttpMessageHandler>();
mockHttpHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
{
await Task.Yield();
return request.Method == HttpMethod.Options
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
});
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var hubConnection = new HubConnection(new Uri("http://fakeuri.org/"), new LoggerFactory());
try
{
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
var exception =
await Assert.ThrowsAsync<InvalidOperationException>(
async () => await hubConnection.StartAsync());
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
}
finally
{
await hubConnection.DisposeAsync();
}
}
}
[Fact]
public async Task CannotStartStoppedHubConnection()
{
var mockHttpHandler = new Mock<HttpMessageHandler>();
mockHttpHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
{
await Task.Yield();
return request.Method == HttpMethod.Options
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
});
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{
var hubConnection = new HubConnection(new Uri("http://fakeuri.org/"), new LoggerFactory());
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
await hubConnection.DisposeAsync();
var exception =
await Assert.ThrowsAsync<InvalidOperationException>(
async () => await hubConnection.StartAsync());
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
}
}
[Fact]
public async Task InvokeThrowsIfHubConnectionNotStarted()
{
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"));
var exception =
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
}
[Fact]
public async Task InvokeThrowsIfHubConnectionDisposed()
{
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"));
await hubConnection.DisposeAsync(); await hubConnection.DisposeAsync();
var exception = connection.Verify(c => c.DisposeAsync(), Times.Once());
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
} }
[Fact] [Fact]
public async Task InvokeThrowsIfSerializingMessageFails() public async Task InvokeThrowsIfSerializingMessageFails()
{ {
var mockConnection = new Mock<IConnection>();
var exception = new InvalidOperationException(); var exception = new InvalidOperationException();
var mockProtocol = MockHubProtocol.Throw(exception); var mockProtocol = MockHubProtocol.Throw(exception);
var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null); var hubConnection = new HubConnection(new TestConnection(), mockProtocol, null);
await hubConnection.StartAsync(TransportType.All, httpClient: null); await hubConnection.StartAsync();
var actualException = var actualException =
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test")); await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
@ -137,75 +55,43 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
[Fact] [Fact]
public async Task HubConnectionConnectedEventRaisedWhenTheClientIsConnected() public async Task HubConnectionConnectedEventRaisedWhenTheClientIsConnected()
{ {
var mockHttpHandler = new Mock<HttpMessageHandler>(); var connection = new TestConnection();
mockHttpHandler.Protected() var hubConnection = new HubConnection(connection);
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>()) try
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
{
await Task.Yield();
return request.Method == HttpMethod.Options
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
});
using (var httpClient = new HttpClient(mockHttpHandler.Object))
{ {
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory()); var connectedEventRaisedTcs = new TaskCompletionSource<object>();
try hubConnection.Connected += () => connectedEventRaisedTcs.SetResult(null);
{
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
hubConnection.Connected += () => connectedEventRaisedTcs.SetResult(null);
await hubConnection.StartAsync(TransportType.LongPolling, httpClient); await hubConnection.StartAsync();
await connectedEventRaisedTcs.Task.OrTimeout(); await connectedEventRaisedTcs.Task.OrTimeout();
} }
finally finally
{ {
await hubConnection.DisposeAsync(); await hubConnection.DisposeAsync();
}
} }
} }
[Fact] [Fact]
public async Task ClosedEventRaisedWhenTheClientIsStopped() public async Task ClosedEventRaisedWhenTheClientIsStopped()
{ {
var mockHttpHandler = new Mock<HttpMessageHandler>(); var hubConnection = new HubConnection(new TestConnection());
mockHttpHandler.Protected() var closedEventTcs = new TaskCompletionSource<Exception>();
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>()) hubConnection.Closed += e => closedEventTcs.SetResult(e);
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
{
await Task.Yield();
return request.Method == HttpMethod.Options
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
});
using (var httpClient = new HttpClient(mockHttpHandler.Object)) await hubConnection.StartAsync();
{ await hubConnection.DisposeAsync();
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory());
var closedEventTcs = new TaskCompletionSource<Exception>();
hubConnection.Closed += e => closedEventTcs.SetResult(e);
await hubConnection.StartAsync(TransportType.LongPolling, httpClient); Assert.Null(await closedEventTcs.Task.OrTimeout());
await hubConnection.DisposeAsync();
Assert.Null(await closedEventTcs.Task.OrTimeout());
}
} }
[Fact] [Fact]
public async Task CannotCallInvokeOnClosedHubConnection() public async Task CannotCallInvokeOnClosedHubConnection()
{ {
var mockConnection = new Mock<IConnection>(); var connection = new TestConnection();
mockConnection var hubConnection = new HubConnection(connection, new LoggerFactory());
.Setup(m => m.DisposeAsync())
.Callback(() => mockConnection.Raise(c => c.Closed += null, (Exception)null))
.Returns(Task.FromResult<object>(null));
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory()); await hubConnection.StartAsync();
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
await hubConnection.DisposeAsync(); await hubConnection.DisposeAsync();
var exception = await Assert.ThrowsAsync<InvalidOperationException>( var exception = await Assert.ThrowsAsync<InvalidOperationException>(
async () => await hubConnection.Invoke<int>("test")); async () => await hubConnection.Invoke<int>("test"));
@ -216,15 +102,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
[Fact] [Fact]
public async Task PendingInvocationsAreCancelledWhenConnectionClosesCleanly() public async Task PendingInvocationsAreCancelledWhenConnectionClosesCleanly()
{ {
var mockConnection = new Mock<IConnection>(); var connection = new TestConnection();
mockConnection var hubConnection = new HubConnection(connection, new LoggerFactory());
.Setup(m => m.DisposeAsync())
.Callback(() => mockConnection.Raise(c => c.Closed += null, (Exception)null))
.Returns(Task.FromResult<object>(null));
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory()); await hubConnection.StartAsync();
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
var invokeTask = hubConnection.Invoke<int>("testMethod"); var invokeTask = hubConnection.Invoke<int>("testMethod");
await hubConnection.DisposeAsync(); await hubConnection.DisposeAsync();
@ -243,7 +124,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory()); var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory());
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null); await hubConnection.StartAsync();
var invokeTask = hubConnection.Invoke<int>("testMethod"); var invokeTask = hubConnection.Invoke<int>("testMethod");
await hubConnection.DisposeAsync(); await hubConnection.DisposeAsync();
@ -261,7 +142,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
var mockProtocol = MockHubProtocol.ReturnOnParse(invocation); var mockProtocol = MockHubProtocol.ReturnOnParse(invocation);
var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null); var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null);
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null); await hubConnection.StartAsync();
mockConnection.Raise(c => c.Received += null, new object[] { new byte[] { } }); mockConnection.Raise(c => c.Received += null, new object[] { new byte[] { } });
Assert.Equal(1, mockProtocol.ParseCalls); Assert.Equal(1, mockProtocol.ParseCalls);

View File

@ -15,7 +15,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(AspNetCoreVersion)" /> <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(AspNetCoreVersion)" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" />

View File

@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
throw new ObjectDisposedException("Unable to send message, underlying channel was closed"); throw new ObjectDisposedException("Unable to send message, underlying channel was closed");
} }
public Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient) public Task StartAsync()
{ {
_started.TrySetResult(null); _started.TrySetResult(null);
Connected?.Invoke(); Connected?.Invoke();

View File

@ -14,7 +14,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
<PackageReference Include="BenchmarkDotNet" Version="0.10.3" /> <PackageReference Include="BenchmarkDotNet" Version="0.10.3" />
</ItemGroup> </ItemGroup>

View File

@ -17,7 +17,6 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
using Xunit; using Xunit;
using Xunit.Abstractions; using Xunit.Abstractions;
using ClientConnection = Microsoft.AspNetCore.Sockets.Client.Connection;
namespace Microsoft.AspNetCore.SignalR.Tests namespace Microsoft.AspNetCore.SignalR.Tests
{ {
@ -88,7 +87,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
const string message = "Major Key"; const string message = "Major Key";
var url = _serverFixture.BaseUrl + "/echo"; var url = _serverFixture.BaseUrl + "/echo";
var connection = new ClientConnection(new Uri(url), loggerFactory); var connection = new HttpConnection(new Uri(url), transportType, loggerFactory);
try try
{ {
var receiveTcs = new TaskCompletionSource<string>(); var receiveTcs = new TaskCompletionSource<string>();
@ -114,7 +113,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}; };
logger.LogInformation("Starting connection to {url}", url); logger.LogInformation("Starting connection to {url}", url);
await connection.StartAsync(transportType).OrTimeout(); await connection.StartAsync().OrTimeout();
logger.LogInformation("Started connection to {url}", url); logger.LogInformation("Started connection to {url}", url);
var bytes = Encoding.UTF8.GetBytes(message); var bytes = Encoding.UTF8.GetBytes(message);
@ -156,7 +155,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
var logger = loggerFactory.CreateLogger<EndToEndTests>(); var logger = loggerFactory.CreateLogger<EndToEndTests>();
var url = _serverFixture.BaseUrl + "/echo"; var url = _serverFixture.BaseUrl + "/echo";
var connection = new ClientConnection(new Uri(url), loggerFactory); var connection = new HttpConnection(new Uri(url), loggerFactory);
try try
{ {
var receiveTcs = new TaskCompletionSource<byte[]>(); var receiveTcs = new TaskCompletionSource<byte[]>();
@ -167,7 +166,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}; };
logger.LogInformation("Starting connection to {url}", url); logger.LogInformation("Starting connection to {url}", url);
await connection.StartAsync(TransportType.WebSockets).OrTimeout(); await connection.StartAsync().OrTimeout();
logger.LogInformation("Started connection to {url}", url); logger.LogInformation("Started connection to {url}", url);
var bytes = Encoding.UTF8.GetBytes(message); var bytes = Encoding.UTF8.GetBytes(message);
@ -213,7 +212,8 @@ namespace Microsoft.AspNetCore.SignalR.Tests
var logger = loggerFactory.CreateLogger<EndToEndTests>(); var logger = loggerFactory.CreateLogger<EndToEndTests>();
var url = _serverFixture.BaseUrl + "/uncreatable"; var url = _serverFixture.BaseUrl + "/uncreatable";
var connection = new HubConnection(new Uri(url), loggerFactory);
var connection = new HubConnection(new HttpConnection(new Uri(url), transportType, loggerFactory), loggerFactory);
try try
{ {
var closeTcs = new TaskCompletionSource<object>(); var closeTcs = new TaskCompletionSource<object>();
@ -232,7 +232,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}; };
logger.LogInformation("Starting connection to {url}", url); logger.LogInformation("Starting connection to {url}", url);
await connection.StartAsync(transportType).OrTimeout(); await connection.StartAsync().OrTimeout();
await closeTcs.Task.OrTimeout(); await closeTcs.Task.OrTimeout();
} }

View File

@ -21,6 +21,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />