SignalR .Net客户端无法连接(upd:如何设置auth.cookie?)

时间:2012-10-23 01:37:30

标签: asp.net-mvc-3 .net-4.0 signalr signalr-hub signalr.client

这件事让我疯狂。

我有一个.net 4.0控制台应用程序,我有一个MVC网络应用程序。

javascript客户端可以连接并与服务器通信 - 这里没有问题......

但我的.net客户端抛出System.AggregateException,其中包含InnerException =“解析值时遇到意外的字符:&lt ;.Path ...

所以我创建了一个空的MVC3应用程序,添加了SignalR库,并且.net客户端令人惊讶地连接到它。但由于某种原因,它不适用于另一个。我已经检查了一切,两个MVC3应用程序,都使用相同的SignalR库,相同的NewtonsoftJson ...我认为它必须是路由的东西,我想没有 - js客户端工作。

var connection = new HubConnection("http://localhost:58746");
var hubProxy = connection.CreateProxy("myProxy");
connection.Start().Wait() // it fails here on Wait

它可能是什么?

UPD:我认为......这是因为服务器上的FormsAuthentication。现在有没有办法将.ASPXAUTH cookie提供给SignalR,以便它可以连接到服务器?

3 个答案:

答案 0 :(得分:3)

好的......愚蠢的我...... SignalR无法连接,因为它无法破坏服务器的Forms身份验证。所以需要做的是获取身份验证cookie并将其粘贴到HubConnection.CookieContainer ...

所以我写了这个方法方法用户名登录并获取cookie:

private Cookie GetAuthCookie(string user, string pass)
{
    var http = WebRequest.Create(_baseUrl+"Users/Login") as HttpWebRequest;
    http.AllowAutoRedirect = false;
    http.Method = "POST";
    http.ContentType = "application/x-www-form-urlencoded";
    http.CookieContainer = new CookieContainer();
    var postData = "UserName=" + user + "&Password=" + pass + "&RememberMe=true&RememberMe=false&ReturnUrl=www.google.com";
    byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
    http.ContentLength = dataBytes.Length;
    using (var postStream = http.GetRequestStream())
    {
        postStream.Write(dataBytes, 0, dataBytes.Length);
    }
    var httpResponse = http.GetResponse() as HttpWebResponse;
    var cookie = httpResponse.Cookies[FormsAuthentication.FormsCookieName];
    httpResponse.Close();
    return cookie;
}

并像这样使用它:

var connection = new HubConnection(_baseUrl)
                {
                    CookieContainer = new CookieContainer()
                };
                connection.CookieContainer.Add(GetAuthCookie(_user, _pass));

完美无缺!

答案 1 :(得分:3)

Agzam的解决方案非常有用,但如果其他人使用发布的代码,那么在退出GetAuthCookie之前关闭HttpWebResponse至关重要。如果不这样做,您会发现无论何时使用SignalR调用服务器上的方法,请求(在大多数情况下)将无限期地在客户端上排队,既不会成功也不会失败。

请注意。当一切都在我的PC上时,原始代码在测试环境中工作,但是当网站托管在远程服务器上时,原始代码一直失败。

这是我最终使用

修改的代码
private Cookie GetAuthCookie(string user, string pass)
{
    var http = WebRequest.Create(_baseUrl+"Users/Login") as HttpWebRequest;
    http.AllowAutoRedirect = false;
    http.Method = "POST";
    http.ContentType = "application/x-www-form-urlencoded";
    http.CookieContainer = new CookieContainer();
    var postData = "UserName=" + user + "&Password=" + pass + "&RememberMe=true&RememberMe=false&ReturnUrl=www.google.com";
    byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
    http.ContentLength = dataBytes.Length;
    using (var postStream = http.GetRequestStream())
    {
        postStream.Write(dataBytes, 0, dataBytes.Length);
    }
    var httpResponse = http.GetResponse() as HttpWebResponse;
    var cookie = httpResponse.Cookies[FormsAuthentication.FormsCookieName];
    httpResponse.Close();
    return cookie;
}

这是一个非常小的改动,但它会为你节省大量的调试时间。

答案 2 :(得分:0)

只需用它来阅读cookies:

var cookie = response.Cookies[".AspNet.ApplicationCookie"];