【问题标题】:SignalR .Net client fails to connect (upd: how to set auth. cookie?)SignalR .Net 客户端无法连接(更新:如何设置 auth.cookie?)
【发布时间】:2012-10-23 01:37:29
【问题描述】:

这件事让我抓狂。

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

javascript 客户端可以连接并与服务器对话 - 没有问题...

但是我的 .net 客户端抛出 System.AggregateException with InnerException = "解析值时遇到意外字符:<.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,以便它可以连接到服务器?

【问题讨论】:

  • 您是否尝试查看 fiddler 以查看 http 响应是什么?或者,您可以使用 GetError 扩展方法来获取底层的 http 响应。 GetError 挂起异常。
  • @MaYaN 你是什么意思,为什么?因为它在 SignalR 示例 wiki 页面上是这样说的......无论如何它可以与我的其他应用程序一起使用,而不是与我必须使用的应用程序一起使用:(
  • @dfowler 从 VS 调试时,如何在提琴手中拦截 SignalR 的内容?有没有办法在端口 8888 上为 SignalR 连接设置代理,或者类似的东西?

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


【解决方案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;
}

这是一个很小的变化,但它会为您节省大量的调试时间。

【讨论】:

    【解决方案2】:

    好的...愚蠢的我... SignalR 无法连接,因为它无法破坏服务器的表单身份验证。所以需要做的是获取auth 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));
    

    完美运行!

    【讨论】:

      【解决方案3】:

      仅用于读取 cookie:

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

      【讨论】:

        猜你喜欢
        • 2012-03-06
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多