SignalR Hub connectivity from Windows Phone 8

2019-06-01 18:14发布

问题:

What I'm trying should be basic; but must be missing something. Have couple of SignalR Hubs defined inside an MVC3 app running locally. Same solution has a Windows Phone 8 & a Windows Store app, both talking to the SignalR hubs for real-time communication. SignalR server uses latest bits & clients use latest .NET nuget.

On the client side, this is what I'm used to writing:

        IHubProxy SignalRChatHub;
        HubConnection chatConnection = new HubConnection("http://localhost:53478/");
        SignalRChatHub = chatConnection.CreateHubProxy("ChatHub");

        await chatConnection.Start();
        if (chatConnection.State == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
        {
           // Stuff here.
        }

This works perfectly fine with a Windows 8 app client & we have easy connectivity with the SignalR hub running locally on IIS. However, the same code does not work for a Windows Phone client. The connection.start() bombs out with a 404 exception.

After a little research, it looks like the WP Emulator VM is treated as a different machine and uses the host machine's network virtually. So, IIS may be blocking calls from outside not allowing reach into the SignalR hub from Windows Phone 8 app. Accordingly, I tweak applicationhost.config for the SignalR server app to allow connectivity from outside localhost. So now, the SignalR hub is functional from both localhost and also off the local IP. Also, the routing has been changed to allow cross-domain SignalR connectivity in Global.asax.cs:

RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true });

The Windows Phone client code is changed to:

HubConnection chatConnection = new HubConnection("http://<LocalIP>:53478/");

But this continues to fail the connection.start() with a "Remote server returned an error: Not Found" exception. I have Fiddler sniffing network traffic from the phone emulator and shows absolutely nothing in response to the connection.start() call.

What am I missing? Any pointers would be helpful .. thanks!

回答1:

Figured it out myself. Turns out the SignalR connectivity issue from the WPDev emulator was actually due to IIS/Windows security. Little more IIS config & opening local ports through Windows Firewall fixed the problem. Will blog about it; but these two posts helped:

  • http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj684580.aspx
  • https://blogs.iis.net/robert_mcmurray/archive/2013/08/20/connecting-the-windows-phone-8-emulator-to-web-api-applications-on-a-local-computer.aspx