Asp.Net与Xamarin Form下Hub SignalR卡在Connecting无法连接怎么解决
修复方案
- Android 明文网络权限配置
Xamarin.Android 从API 28(Android 9)开始默认禁止HTTP明文请求,你当前用的是http://10.0.2.2:36518的本地HTTP地址,需要先开启明文权限:
在Android项目的AndroidManifest.xml的<application>节点添加属性:
android:usesCleartextTraffic="true"
- 避免异步死锁
UI线程下的异步调用默认会捕获同步上下文,容易触发死锁,修改StartAsync调用方式,禁止捕获上下文:
await hubConnection.StartAsync().ConfigureAwait(false);
如果后续需要操作UI控件,再用Device.BeginInvokeOnMainThread切回UI线程。
- 服务端添加CORS配置
跨域请求默认会被ASP.NET Core拦截,你需要在服务端Startup中添加CORS规则:
在ConfigureServices方法中添加:
services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() .SetIsOriginAllowed(_ => true); }); });
然后在Configure方法中,UseRouting之后、UseAuthorization之前添加:
app.UseCors("AllowAll");
- 修改服务端监听地址
本地调试时服务端默认只监听127.0.0.1,模拟器无法访问,需要修改服务端启动配置,将监听地址改为http://0.0.0.0:36518,允许所有IP访问。 - 添加异常捕获排查具体错误
给StartAsync添加try-catch块,打印详细异常信息,方便定位具体问题:
try { await hubConnection.StartAsync().ConfigureAwait(false); } catch (Exception ex) { // 打印ex.Message、ex.StackTrace等信息排查 Console.WriteLine(ex.ToString()); }
- 修复Hub方法的异步写法
服务端Hub的SendData方法不能用async void,需改为async Task,避免未捕获的异常导致服务端崩溃:
public async Task SendData(string b) { Debug.WriteLine("Hello world"); await Clients.All.SendAsync("Get", b); }
内容的提问来源于stack exchange,提问作者Steven-Carrot
相关产品推荐
相关产品推荐

