0

当社の c#.net ソフトウェアはオンライン アプリに接続して、アカウントとショップを処理します。と を使用してこれをHttpWebRequest行いHttpWebResponseます。

この相互作用の例と、タイトルの例外が由来する 1 つの領域は次のとおりです。

var request = HttpWebRequest.Create(onlineApp + string.Format("isvalid.ashx?username={0}&password={1}", HttpUtility.UrlEncode(username), HttpUtility.UrlEncode(password))) as HttpWebRequest;
            request.Method = "GET";
            using (var response = request.GetResponse() as HttpWebResponse)
            using (var ms = new MemoryStream())
            {
                var responseStream = response.GetResponseStream();
                byte[] buffer = new byte[4096];
                int read;
                do
                {
                    read = responseStream.Read(buffer, 0, buffer.Length);
                    ms.Write(buffer, 0, read);
                } while (read > 0);
                ms.Position = 0;
                return Convert.ToBoolean(Encoding.ASCII.GetString(ms.ToArray()));
            }

オンライン アプリは、'true' または 'false' のいずれかで応答します。すべてのテストで、これらの値の 1 つを取得しますが、数百人のうちの 2 人の顧客についてはSystem.FormatException: String was not recognized as a valid Boolean、応答が何かによって文字化けしているように聞こえるこの例外が発生します。Web ブラウザーでオンライン アプリにアクセスするように依頼すると、正しい応答が表示されます。クライアントは通常、かなり制限された学校のネットワーク上にあり、多くの場合プロキシ サーバーの下にありますが、プロキシの詳細を設定するか、ファイアウォールの例外を追加すると、ほとんどのクライアントは正常に処理されます。サーバーからの応答を台無しにしている可能性があるものはありますか、それともコードに何か問題がありますか?

4

3 に答える 3

1

実際、返される結果が何らかの形で異なる可能性があります。

そこに応答を読み取るかなり精巧な方法を実行している特定の理由はありますか? なぜだめですか:

string data;

using(HttpWebResponse response = request.GetResponse() as HttpWebResponse){
    StreamReader str = new StreamReader(response.GetResponseStream());
    data = str.ReadToEnd();
    str.Close();
}

string cleanResult = data.Trim().ToLower();

// log this

return Convert.ToBoolean(cleanResult);
于 2010-02-24T13:59:44.817 に答える
1

最初に注意すべきことは、次のようなものを間違いなく使用することです。

bool myBool = false;
Boolean.TryParse(Encoding.ASCII.GetString(ms.ToArray()), myBool);
return myBool;
于 2010-02-24T14:00:36.170 に答える
0

ローカライズの問題じゃないの?「true」のスワヒリ語バージョンを期待していて、混乱しています。サイトはすべて 1 つの国にあり、同じ言語などを使用していますか?

他の人が提案したように、ログを追加して、どのような結果が表示されているかを確認します。

シルキーが示唆したように、コードを変更することにも傾いていますが、さらにいくつかの変更が加えられています(コードの「匂い」の問題、IMO)。usingストリーム リーダーとレスポンスで使用します。

asまた、この場合の使用は適切ではないと思います。Response をキャストできない場合HttpWebResponse(確かに可能性は低いですが、それでも)、あいまいなエラーであるビットで NullRef 例外が発生しresponse.GetResponseStream()、元の行番号が失われます。を使用(HttpWebResponse)request.GetResponse()すると、より正確なエラーと、実際のエラーの正しい行番号が得られます。

于 2010-02-24T14:37:33.680 に答える