Почему я получаю System.FormatException: строка не была распознана как допустимое логическое значение на части компьютеров наших клиентов? - PullRequest
0 голосов
/ 24 февраля 2010

Наше программное обеспечение c # .net подключается к онлайн-приложению для работы с аккаунтами и магазинами. Это делается с использованием HttpWebRequest и 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, которое звучит так, будто ответ искажается чем-то. Если мы попросим их перейти в онлайн-приложение в своем веб-браузере, они увидят правильный ответ. Клиенты, как правило, находятся в школьных сетях, что может быть довольно ограничительным и часто под прокси-серверами, но большинство справляется хорошо, когда они вводят данные прокси или добавляют исключение брандмауэра. Есть ли что-то, что может испортить ответ от сервера, или что-то не так с нашим кодом?

Ответы [ 3 ]

1 голос
/ 24 февраля 2010

Первое, что нужно отметить, я бы определенно использовал что-то вроде:

bool myBool = false;
Boolean.TryParse(Encoding.ASCII.GetString(ms.ToArray()), myBool);
return myBool;
1 голос
/ 24 февраля 2010

Действительно, возможно, что возвращаемый результат будет каким-то другим.

Есть ли какая-то конкретная причина, по которой вы используете достаточно продуманный метод чтения ответа? Почему бы и нет:

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);
0 голосов
/ 24 февраля 2010

Это не проблема локализации, не так ли? Это ожидание суахили версии «правда», и становится запутанным. Все ли сайты в одной стране, на одном языке и т. Д.?

Я бы добавил ведение журнала, как предлагали другие, и посмотрел бы, какие результаты вы видите.

Я бы также склонялся к изменению кода, как это и предполагалось, хотя и с некоторыми дополнительными изменениями от меня (проблемы с запахом кода, IMO); Используйте using вокруг считывателя потока, а также ответ.

Кроме того, я не думаю, что использование as уместно в этом случае. Если Ответ не может быть приведен к HttpWebResponse (что, по общему признанию, маловероятно, но все же), вы получите исключение NullRef для бита response.GetResponseStream(), которое является и неопределенной ошибкой, и вы потеряли исходную строку число. Использование (HttpWebResponse)request.GetResponse() даст вам более правильную ошибку и правильный номер строки фактической ошибки.

...