Ошибка 500 при запросе Yahoo Placefinder с определенным символом?

Я использую службу Yahoo Placefinder, чтобы найти некоторые позиции широты/долготы для списка адресов, которые у меня есть в файле csv.

Я использую следующий код:

String reqURL = "http://where.yahooapis.com/geocode?location=" + HttpUtility.UrlEncode(location) + "&appid=KGe6P34c";

XmlDocument xml = new XmlDocument();
xml.Load(reqURL);
XPathNavigator nav = xml.CreateNavigator();
// process xml here...

Я только что обнаружил очень упрямую ошибку, которая, как я думал (ошибочно) в течение нескольких дней, была связана с тем, что Yahoo запретил мне дальнейшие запросы.

Это для этого URL:

http://where.yahooapis.com/geocode?location=31+Front+Street%2c+Sedgefield%2c+Stockton%06on-Tees%2c+England%2c+TS21+3AT&appid=KGe6P34c

Мой браузер жалуется на ошибку синтаксического анализа для этого URL-адреса. Моя программа на С# говорит, что у нее ошибка 500.

Строка местоположения здесь исходит из этого адреса:

Agape Business Consortium Ltd.,[email protected],Michael A Cutbill,Director,,,9 Jenner Drive,Victoria Gardens,,Stockton-on-Tee,,TS19 8RE,,England,85111,Hospitals,www.agapesolutions.co.uk

Я думаю, что ошибка возникает из-за первого дефиса в Stockton-on-Tee , но я не могу объяснить, почему это так. Если я заменю этот дефис «нормальным» дефисом, запрос пройдет успешно.

Является ли эта ошибка следствием неисправности моей стороны (функция HttpUtility.UrlEncode неверна?) или неисправности стороны Yahoo?

Хотя я вижу, что вызывает эту проблему, я не понимаю, почему. Может ли кто-нибудь объяснить?

РЕДАКТИРОВАТЬ:

Дальнейшее расследование с моей стороны показывает, что символ, в который кодируется этот дефис, «% 06», является управляющим символом ascii «Подтверждение», «ACK». Я понятия не имею, почему этот персонаж оказался здесь. Кажется, что разные места отображают Stockton-on-Tee по-разному - он выглядит нормально открытым в текстовом редакторе, но к тому времени, когда он появляется в Visual Studio, до кодирования, это Stocktonon-Tees. Обратите внимание, что, когда я скопировал предыдущее в это текстовое поле в Firefox, дефис отображался как странный символ квадратного поля, но при этом последующем редактировании программное обеспечение SO, похоже, очистило символ.

Ниже я привожу класс функции и держателя, который я использую для анализа CSV-файла. Как видите, я не делаю ничего странного, что может привести к появлению неожиданных символов. Опасный персонаж появляется в поле «Город».

public List<PaidBusiness> parseCSV(string path)
{
    List<PaidBusiness> parsedBusiness = new List<PaidBusiness>();
    List<string> parsedBusinessNames = new List<string>();

    try
    {
        using (StreamReader readFile = new StreamReader(path))
        {
            string line;
            string[] row;

            bool first = true;
            while ((line = readFile.ReadLine()) != null)
            {
                if (first)
                    first = false;
                else
                {
                    row = line.Split(',');
                    PaidBusiness business = new PaidBusiness(row);
                    if (!business.bad) // no problems with the formatting of the business (no missing fields, etc)
                    {
                        if (!parsedBusinessNames.Contains(business.CompanyName))
                        {
                            parsedBusinessNames.Add(business.CompanyName);
                            parsedBusiness.Add(business);
                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {  }

    return parsedBusiness;
}

public class PaidBusiness
{
    public String CompanyName, EmailAddress, ContactFullName, Address, Address2, Address3, Town, County, Postcode, Region, Country, BusinessCategory, WebAddress;
    public String latitude, longitude;
    public bool bad;


    public static int noCategoryCount = 0;
    public static int badCount = 0;

    public PaidBusiness(String[] parts)
    {
        bad = false;

        for (int i = 0; i < parts.Length; i++) 
        {
            parts[i] = parts[i].Replace("pithawala", ",");
            parts[i] = parts[i].Replace("''", "'");
        }

        CompanyName = parts[0].Trim();
        EmailAddress = parts[1].Trim();
        ContactFullName = parts[2].Trim();
        Address = parts[6].Trim();
        Address2 = parts[7].Trim();
        Address3 = parts[8].Trim();
        Town = parts[9].Trim();
        County = parts[10].Trim();
        Postcode = parts[11].Trim();
        Region = parts[12].Trim();
        Country = parts[13].Trim();
        BusinessCategory = parts[15].Trim();
        WebAddress = parts[16].Trim();

        // data testing
        if (CompanyName == "")
            bad = true;
        if (EmailAddress == "")
            bad = true;
        if (Postcode == "")
            bad = true;
        if (Country == "")
            bad = true;
        if (BusinessCategory == "")
            bad = true;

        if (Address.ToLower().StartsWith("po box"))
            bad = true;

        // its ok if there is no contact name.
        if (ContactFullName == "")
            ContactFullName = CompanyName;

        //problem if there is no business category.
        if (BusinessCategory == "")
            noCategoryCount++;

        if (bad)
            badCount++;

    }       
}

person Oliver    schedule 29.09.2011    source источник


Ответы (1)


Добро пожаловать в данные реального мира. Вероятно, проблема в CSV-файле. Для проверки прочитайте строку и проверьте каждый символ:

foreach (char c in line)
{
    Console.WriteLine("{0}, {1}", c, (int)c);
}

«Нормальный» дефис даст вам значение 45.

Другая проблема может заключаться в том, что вы читаете файл, используя неправильную кодировку. Возможно, файл закодирован как UTF8, и вы читаете его с кодировкой по умолчанию. Вы можете попробовать указать UTF8 при открытии файла:

using (StreamReader readFile = new StreamReader(path, Encoding.UTF8))

Сделайте это, а затем снова выведите каждый символ в строке (как указано выше) и посмотрите, какой символ вы получите вместо дефиса.

person Jim Mischel    schedule 29.09.2011
comment
Спасибо за вашу помощь. Даже в разных кодировках этот символ представляет собой «6», а не «45». Странно, что этот символ оказался в файле и отображается как дефис. Сейчас я проверяю файл как прочитанный для любого символа со значением ниже 32, надеюсь, теперь я смогу обнаружить эти проблемы. - person Oliver; 29.09.2011