2

基本的にFacebookの資格情報でユーザーを認証する次の方法があります。WebException認証キー (コード) を処理しようとすると、何らかの理由でエラーが発生します。そのため、何が起こっているのかを知るために応答ストリームを読み取ろうとしましたが、ストリームの読み取り中にエラーが発生し続けます。これが私のコードです:

    private void OnAuthCallback(HttpContextWrapper context, WebServerClient client)
    {
        try
        {
            IAuthorizationState authorizationState = client.ProcessUserAuthorization(context.Request);
            AccessToken accessToken = AccessTokenSerializer.Deserialize(authorizationState.AccessToken);
            String username = accessToken.User;
            context.Items[USERNAME] = username;
        }
        catch (ProtocolException e)
        {
            if (e.InnerException != null)
            {
                String message = e.InnerException.Message;
                if (e.InnerException is WebException)
                {
                    WebException exception = (WebException)e.InnerException;
                    var responseStream = exception.Response.GetResponseStream();
                    responseStream.Seek(0, SeekOrigin.Begin);
                    using (StreamReader sr = new StreamReader(responseStream))
                    {
                        message = sr.ReadToEnd();
                    }
                }
                EventLog.WriteEntry("OAuth Client", message);
            }
        }
    }

responseStream.Seek(0, SeekOrigin.Begin);この行を削除するArgumentExceptionと、ストリームが読み取れないというメッセージが表示されます。この行があれば、既に閉じられているストリームを操作できないことがわかります。このストリームはどのように閉鎖されましたか? そして、なぜ私はそれを読むことができないのですか?

4

3 に答える 3

3

DotNetOpenAuth を使用しているようです。残念ながら、このライブラリは、コードが受け取る ProtocolException にラップする前に、WebException の応答ストリームを閉じていると思います。DEBUG レベルでログを有効にして、応答をログ ファイルにダンプできますが、コードからアクセスする方法はないと思います。

DotNetOpenAuth 開発者の 1 人が、この状況について次のように説明しています

DotNetOpenAuth は、ラップされた例外の処理とスロー中に HTTP 応答ストリームを閉じます。これは、DNOA がストリームを閉じないと、開いているストリームの割り当てがいっぱいになり、アプリがハングし始めるためです。私の記憶が正しければ、DNOA は応答ストリームの内容をログに書き込みます。

現在のリリース バージョンで問題を引き起こしているコードの一部が削除されているため、DNOA (5.0) の最新 (リリースされていない) バージョンでは状況が変わっている可能性があります。

于 2013-08-15T17:26:36.663 に答える
0

WebExceptionにはさまざまな原因が考えられ、サーバーは特定の(エラー)状況下で本文を返す必要がないため、response.streamがありません。

最初に返されたステータスコードを見てください

何が起こっているのかを調査するのに役立つもう1つのツールはFiddlerです

于 2013-03-16T18:54:00.300 に答える