0

我们的 c#.net 软件连接到一个在线应用程序来处理帐户和商店。它使用HttpWebRequestand来做到这一点HttpWebResponse

这种交互的一个例子,以及标题中的异常来自的一个领域是:

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

在线应用程序将响应“真”或“假”。在我们所有的测试中,它都获得了这些值之一,但是对于几个客户(数百个),我们得到了这个异常,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

这不是一些本地化问题吗?它期待斯瓦希里语版本的“真实”,并感到困惑。一个国家的所有网站是否都使用相同的语言等?

我会按照其他人的建议添加日志记录,看看你看到了什么结果。

我也倾向于按照柔滑的建议更改代码,尽管我做了一些进一步的更改(代码“气味”问题,IMO);using在流阅读器以及响应周围使用。

另外,我认为as在这种情况下使用 是不合适的。如果无法将响应强制转换为HttpWebResponse(诚然不太可能,但仍然如此),您将在该response.GetResponseStream()位上得到一个 NullRef 异常,这既是一个模糊的错误,而且您已经丢失了原始行号。使用(HttpWebResponse)request.GetResponse()会给你一个更正确的错误,以及实际错误的正确行号。

于 2010-02-24T14:37:33.680 回答