SignalR .Net客户端无法连接(UPD:如何设置身份验证cookie的?)(SignalR

2019-10-17 07:56发布

这件事情是拖我坚果。

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

JavaScript客户端可以连接,跟我们的服务器 - 在这里没有任何问题......

但我的.NET客户端抛出System.AggregateException用在分析价值时遇到的InnerException =“意外的字符:<路径...

所以我创建一个空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饼干喂SignalR因此它可以连接到服务器?

Answer 1:

通过Agzam的解决方案是真正有用的,但如果其他人使用贴码,关键是你退出GetAuthCookie之前关闭HttpWebResponse。 如果你不这样做,你会发现,每当你使用SignalR调用服务器上的方法,请求(在大多数情况下)将无限期地排队在客户端上,并没有成功,也没有失败。

注意。 原始代码在测试环境中工作时,一切都在我的电脑上,但始终未能当网站被在远程服务器上托管。

这里是修改后的代码我最终使用

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;
}

它的一个非常微小的变化,但它会为你节省大量的调试时间。



Answer 2:

好吧......愚蠢的我...... 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));

完美的作品!



Answer 3:

只要使用这个阅读饼干:

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


文章来源: SignalR .Net client fails to connect (upd: how to set auth. cookie?)