Проблема WebClient с URL-адресом, который заканчивается точкой

Я запускаю следующий код;

using (WebClient wc = new WebClient())
{
    string page = wc.DownloadString(URL);
    ...
}

Чтобы получить доступ к URL-адресу веб-сайта с ценами на акции, http://www.shareprice.co.uk

Если вы добавите название символа компании в конец URL-адреса, то будет возвращена страница, которую я проанализирую, чтобы получить последнюю информацию о ценах и т. д.

e.g.

http://www.shareprice.co.uk/VOD

http://www.shareprice.co.uk/TW.

Теперь моя проблема в том, что некоторые символы заканчиваются точками, как во втором примере. По какой-то неизвестной причине в приведенном выше коде возникают проблемы с получением таких URL-адресов.

Ошибки во время выполнения нет, но возвращается страница, которая сообщает «Символ не найден» с самого веб-сайта, что указывает на то, что что-то происходит с точкой в ​​конце URL-адреса между вызовом DownloadString и фактический HTTP-запрос.

Кто-нибудь знает, что может быть причиной этого, и как это исправить?

Спасибо


person Christopher McAtackney    schedule 11.11.2009    source источник
comment
Вы контролируете shareprice.co.uk или это сторонний сайт?   -  person David    schedule 11.11.2009
comment
Если это третья сторона, проверили ли вы их документацию о том, как обрабатывать точки в вашем URL-адресе?   -  person David    schedule 11.11.2009
comment
Это сторонний сайт, я вообще не имею к ним никакого отношения — это всего лишь небольшой проект-хобби, над которым я работаю. Я должен был, вероятно, уточнить, если вы вводите адрес с точкой в ​​конце в браузере, он работает нормально. Отсюда и вопрос здесь, поскольку я предполагаю, что это проблема .NET.   -  person Christopher McAtackney    schedule 11.11.2009
comment
Вы пробовали тот же URL без .? Они могут делать что-то на стороне клиента, когда вы заходите через браузер. Вы можете попробовать URL-адрес, кодирующий строку URL-адреса. Когда я спросил у Google, у некоторых других людей были похожие проблемы на разных платформах.   -  person µBio    schedule 11.11.2009


Ответы (5)


Кажется, вы нашли ошибку в WebClient/WebRequest, хотя, возможно, Microsoft намеренно добавила ее, кто знает. Тем не менее, когда вы передаете TW., класс URI переводит это в TW без точки. Поскольку WebClient/WebRequest анализирует строки в URI, ваш . исчезает в том мире.

Возможно, вам придется использовать TcpClient, чтобы обойти это и запустить собственный веб-клиент. Любая вариация этого:

TcpClient oClient = new TcpClient("www.shareprice.co.uk", 80);

NetworkStream ns = oClient.GetStream();

StreamWriter sw = new StreamWriter(ns);
sw.Write(
   string.Format( 
      "GET /{0} HTTP/1.1\r\nUser-Agent: {1}\r\nHost: www.shareprice.co.uk\r\n\r\n",
           "TW.", 
           "MyTCPClient"  )
);                    
sw.Flush();

StringBuilder sb = new StringBuilder();

while (true)
{
    int i = ns.ReadByte(); // Inefficient but more reliable 
    if (i == -1) break;  // Other side has closed socket 
    sb.Append( (char) i );   // Accrue 'c' to save page data 
}

oClient.Close();

Это даст вам перенаправление 302, поэтому просто проанализируйте «Местоположение:» и снова выполните вышеуказанное с новым местоположением.

HTTP/1.1 302 Found
Date: Wed, 11 Nov 2009 19:29:27 GMT
Server: lighttpd
X-Powered-By: PHP/5.2.4-2ubuntu5.7
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: /TW./TAYLOR-WIMPEY-PLC
Content-type: text/html; charset=UTF-8
Content-Length: 0
Set-Cookie: SSID=668d5d0023e9885e1ef3762ef5e44033; path=/
Vary: Accept-Encoding
Connection: close
person Sean    schedule 11.11.2009
comment
Ничего страшного, рад, что смог помочь. - person Sean; 12.11.2009

Попробуйте добавить косую черту в конце после точки. Ваш обычный веб-браузер сделает это за вас, а класс WebClient не так умен.

http://www.shareprice.co.uk/TW./

Это сработало и для меня, когда я набрал его в браузере.

Изменить — добавлено

Следующее все также работало в браузере

http://www.shareprice.co.uk/TW

а также

http://www.shareprice.co.uk/TW/

поэтому похоже, что вы должны просто проверить, является ли последний символ точкой, и удалить его.

person David    schedule 11.11.2009
comment
Однако это не работает в WebClient или WebRequest. Оба этих класса преобразуют строки в Uri. Когда Uri передается, этот TW. url, кажется, что точка удалена. Предположительно, он считает, что вы намеревались завершить расширение файла, однако оно не было завершено, поэтому оно просто обрезает его. - person Sean; 11.11.2009

используйте кодировку URL... она превратит "." в %2E

person Rich    schedule 11.11.2009
comment
На первый взгляд можно подумать, что это сработает, но это не так. - person Sean; 11.11.2009
comment
Используете ли вы Fiddler для отслеживания звонков? Может быть, это хорошая идея. Когда вы видите, как выглядит необработанный запрос, он иногда дает больше подсказок, чем простая отладка. - person Rich; 11.11.2009

Чтобы указать одиночную точку (.) в конце URL-адреса, используйте следующее:

<system.web>
             <httpRuntime relaxedUrlToFileSystemMapping="true" /> 
</system.web>

Чтобы устранить две точки (..) или другие запрещенные последовательности, см. следующую статью:

http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/denyUrlSequences

person Community    schedule 15.07.2012

Просто добавьте пробел после точки, при синтаксическом анализе пробел будет удален, но точка останется.

person Anfetamina    schedule 23.03.2013