如何从 Xamarin 客户端连接到 SignalR 服务器?

Ish*_*mas 2 c# asp.net xamarin.android signalr xamarin

(**) 我创建了一个 ASP.NET Web 服务器,托管 SignalR 集线器。我跟着这个 教程。有用。然后我创建了一个 Xamarin.Android 客户端(*)。问题是我无法连接到服务器。我想,由于主机地址中的“localhost”,我无法连接。例外是相当大的。

如果我的怀疑是正确的,我该如何解决?如何使本地主机看起来像普通服务器?

(*) - 我也尝试过使用 Xamarin.Forms。

(**) - 请看问题底部的“编辑”。

这是我的方法:

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += async delegate 
        {
            button.Text = string.Format("{0} clicks!", count++);
            var hubConnection = new HubConnection("http://localhost:64642");
            var chatHubProxy = hubConnection.CreateHubProxy("ChatHub");
            try
            {
                // Start the connection
                await hubConnection.Start();

                // Invoke the 'UpdateNick' method on the server
                await chatHubProxy.Invoke("Send", new object[] { "TheMessage", "JohnDoe" });
            }
            catch(Exception ex)
            {

            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

{System.Net.WebException:错误:ConnectFailure(连接被拒绝)---> System.Net.Sockets.SocketException:在System.Net.Sockets.Socket.Connect(System.Net.EndPoint remoteEP)[0x000cb]中拒绝连接/Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net.Sockets/Socket.cs:1313 在 System.Net.WebConnection.Connect(System.Net.HttpWebRequest 请求) [0x0019b] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/WebConnection.cs:195 ---内部异常堆栈跟踪结束---在系统.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x0005e] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1023 在系统.Threading.Tasks.TaskFactory1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func2[T,TResult] endFunction, System.Action 1[T] endAction, System.Threading.Tasks.Task1[TResult] promise, System.Boolean requiresSynchronization) [0x00014] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib /system/threading/Tasks/FutureFactory.cs:550

--- 从之前抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3511/77cb8568/source/mono/ mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务)[0x00047] 在 /Users/builder/data/ Lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务)[ 0x0002e] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task 任务)[0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/ system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono /mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 在 System.Net.Http.HttpClientHandler+c__async0.MoveNext () [0x003ce] 在 /Users/builder/data/lanes/3511/77cb8568 /source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:379任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult()[0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs :535 在 System.Net.Http.HttpClientHandler+c__async0.MoveNext () [0x003ce] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net .Http/HttpClientHandler.cs:379任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult()[0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs :535 在 System.Net.Http.HttpClientHandler+c__async0.MoveNext () [0x003ce] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net .Http/HttpClientHandler.cs:379GetResult () [0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 在 System.Net.Http。 HttpClientHandler+c__async0.MoveNext() [0x003ce] 在/Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:379GetResult () [0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 在 System.Net.Http。 HttpClientHandler+c__async0.MoveNext() [0x003ce] 在/Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:379

--- 从之前抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3511/77cb8568/source/mono/ mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务)[0x00047] 在 /Users/builder/data/ Lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务)[ 0x0002e] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task 任务)[0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/ system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono /mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 在 System.Net.Http.HttpClient+c__async0.MoveNext () [0x000a9] 在 /Users/builder/data/lanes/3511/77cb8568 /source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:276任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult()[0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs :535 在 System.Net.Http.HttpClient+c__async0.MoveNext () [0x000a9] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net .Http/HttpClient.cs:276任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult()[0x00000] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs :535 在 System.Net.Http.HttpClient+c__async0.MoveNext () [0x000a9] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net .Http/HttpClient.cs:276GetResult () [0x00000] 在 System.Net.Http 的 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 中。 HttpClient+c__async0.MoveNext() [0x000a9] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:276GetResult () [0x00000] 在 System.Net.Http 的 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 中。 HttpClient+c__async0.MoveNext() [0x000a9] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:276

--- 从之前抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3511/77cb8568/source/mono/ mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务)[0x00047] 在 /Users/builder/data/ Lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务)[ 0x0002e] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task 任务)[0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/ system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/ mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 在 AndroidApp.MainActivity+<>c__DisplayClass1_0+<b__0>d.MoveNext () [0x000a5] 在 C:\Data\Projects\SinglaRSamples\AndroidApp\AndroidApp\MainActivity.cs:36 }任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 at AndroidApp.MainActivity+< >c__DisplayClass1_0+<b__0>d.MoveNext () [0x000a5] 在 C:\Data\Projects\SinglaRSamples\AndroidApp\AndroidApp\MainActivity.cs:36 }任务 task) [0x0000b] 在 /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 在 System.Runtime.CompilerServices。 TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3511/77cb8568/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 at AndroidApp.MainActivity+< >c__DisplayClass1_0+<b__0>d.MoveNext () [0x000a5] 在 C:\Data\Projects\SinglaRSamples\AndroidApp\AndroidApp\MainActivity.cs:36 }c__DisplayClass1_0+<b__0>d.MoveNext () [0x000a5] 在 C:\Data\Projects\SinglaRSamples\AndroidApp\AndroidApp\MainActivity.cs:36 }c__DisplayClass1_0+<b__0>d.MoveNext () [0x000a5] 在 C:\Data\Projects\SinglaRSamples\AndroidApp\AndroidApp\MainActivity.cs:36 }

编辑:

正如梅森杰森建议的那样,我可能必须使用正确的 IP 而不是“本地主机”。Android Emulator 看到的实际 localhost 的 IP。我正在努力寻找那个 IP,它在 Android 设置中的某个地方。任何帮助都会很棒!

Tre*_*com 6

您可以使用http://10.0.2.2:64642从 Google SDK 模拟器访问在您的 PC 主机上运行的 ASP.NET 站点。如果它无法到达服务器,那么您可能需要配置 Windows 防火墙以允许传入的 HTTP/HTTPS 连接。