这对我来说正在成为一个令人头疼的问题,并希望也许有人可以帮助对此有所了解。
我有一个使用SignalR的MVC应用程序,并托管在Azure上。
在客户端我有这个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应用程序具有相同的客户端脚本,其中一个配置不同,我保留生成的hub.js的静态版本,因为它无法自动生成。
问题是PhoneGap版本的消息在调用relayThis()时不会到达指定的用户名,即调用proxy.invoke(" relayThis"," userA@test.com" ;,"你好")。但是,如果我这样做并且用户在托管网站上,则消息到达。 此外,并不是信号器显然没有在应用程序上工作。当应用程序启动连接时,应用程序会收到消息" userA@test.com"已加入。
查看PhoneGap应用程序上的日志会显示" joinedSession"被叫,但没有活动,以及#34; relaythis"。
最好我能想到的是,由于某种原因,PhoneGap用户没有被添加到集线器客户端,但我还没有找到一种方法来断言。
另外,我使用OAuth进行授权,但我并不怀疑它会导致任何问题,如我所提到的,PhoneGap应用程序将收到joinSession并且它可以发出自己的请求,因此它正在通过Auth。
答案 0 :(得分:1)
SignalR userId字符串区分大小写!!!
这就是它。该应用程序没有发送给特定用户的原因是因为我的手机很有可能想要利用电子邮件地址。因此,应用程序会使用身份名称UserA@test.com旋转一个不错的OAuth令牌 当我打电话给signalR时,我按照注册userA@test.com的方式输入了用户名。对于SignalR,它们不是同一个东西,只知道OAuth数据中的内容。