这件事让我疯狂。
我有一个.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,以便它可以连接到服务器?
答案 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"];