1

このことは私を夢中にさせています。

.net 4.0 コンソール アプリと MVC Web アプリがあります。

JavaScriptクライアントはサーバーに接続して通信できます-ここでは問題ありません...

しかし、私の.netクライアントはSystem.AggregateException with 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 Cookie を SignalR にフィードする方法はありますか?

4

3 に答える 3

3

わかりました...ばかげています...SignalRは、サーバーのフォーム認証に違反できないため、接続に失敗しました。したがって、実行する必要があるのは、認証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));

完璧に動作します!

于 2012-10-24T15:48:07.660 に答える
3

Agzam による解決策は非常に役に立ちましたが、他の誰かが投稿されたコードを使用している場合は、GetAuthCookie を終了する前に HttpWebResponse を閉じることが重要です。そうしないと、SignalR を使用してサーバーでメソッドを呼び出すたびに、(ほとんどの状況で) 要求がクライアントで無期限にキューに入れられ、成功も失敗もしないことがわかります。

ノート。元のコードは、すべてが PC 上にあるテスト環境では機能しましたが、Web サイトがリモート サーバーでホストされている場合は一貫して失敗しました。

これが私が最終的に使用した変更されたコードです

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

これは非常に小さな変更ですが、デバッグ時間を大幅に節約できます。

于 2012-12-21T20:49:54.123 に答える
0

これを使用してCookieを読み取るだけです:

var cookie = response.Cookies[".AspNet.ApplicationCookie"];
于 2014-11-11T08:08:37.203 に答える