这对我来说是一个令人头疼的问题,希望也许有人可以帮助解决这个问题。
我有一个使用 SignalR 并托管在 Azure 上的 MVC 应用。
在客户端上我有这个 js
window.connection = $.hubConnection('https://giveabuck.azurewebsites.net', { qs: "access_token=" + sessionStorage.getItem("accessToken") });
$.signalR.ajaxDefaults.headers = { Authorization: "Bearer " + sessionStorage.getItem("accessToken") };
window.proxy = connection.createHubProxy('signalRHub');
proxy.on("relaythis", function (callOut) { alert(callOut) });
proxy.on("joinedSession", function (data) { alert(data)});
connection.logging = true;
connection.start({transport: 'longPolling'});
在服务器上,这
[Authorize]
public class SignalRHub : Hub
{
private readonly Broadcaster _Broadcaster;
public SignalRHub()
: this(Broadcaster.Instance) { }
public SignalRHub(Broadcaster broadcaster)
{
_Broadcaster = broadcaster;
}
public override Task OnConnected()
{
this.connectedCallback(this.Context.User.Identity.Name);
return base.OnConnected();
}
public void relayThis(string userName, string message)
{
Clients.User(userName).relaythis(message);
}
public void connectedCallback(string connectedClient){
Clients.All.joinedSession(connectedClient + " has joined!");
}
}
PhoneGap 应用程序具有相同的客户端脚本,但有一个配置差异,我保留生成的中心的静态版本.js因为它无法自动生成。
问题是,在调用 relayThis() 即调用 proxy.invoke("relayThis"、"userA@test.com"、"Hello")时,消息不会到达指定的用户名。但是,如果我执行相同的操作并且用户在托管网站上,则消息会到达。此外,并不是说信号器显然不在应用程序上运行。当应用启动连接时,应用会收到"userA@test.com"已加入的消息。
在 PhoneGap 应用程序上查看日志会显示调用"joinedSession"时的活动,但没有"relaythis"的活动。
我能想到的最好的是,由于某种原因,PhoneGap用户没有被添加到中心客户端,但我还没有找到断言的方法。
另外,我使用OAuth进行授权,但我不怀疑它会导致我提到的任何问题,PhoneGap应用程序将收到joinedSession,并且可以发出自己的请求,因此它正在传递身份验证。
SignalR userId 字符串区分大小写!!
好吧,就是这样。该应用程序没有发送给特定用户的原因是因为我的手机有这种很好的倾向,甚至想要大写电子邮件地址。因此,该应用程序启动了一个漂亮的OAuth令牌,其标识名称为 UserA@test.com当我调用 signalR 时,我以注册 userA@test.com 的方式输入用户名。对于 SignalR,它们不是一回事,只知道在 OAuth 数据中找到了什么。