这件事情是拖我坚果。
我有一个.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因此它可以连接到服务器?
通过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;
}
它的一个非常微小的变化,但它会为你节省大量的调试时间。
好吧......愚蠢的我...... 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));
完美的作品!
只要使用这个阅读饼干:
var cookie = response.Cookies[".AspNet.ApplicationCookie"];
文章来源: SignalR .Net client fails to connect (upd: how to set auth. cookie?)