Проблема WebClient с URL, который заканчивается точкой - PullRequest
2 голосов
/ 11 ноября 2009

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

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

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

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

, например

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

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

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

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

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

Спасибо

Ответы [ 5 ]

2 голосов
/ 11 ноября 2009

Кажется, вы нашли ошибку в 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, так что просто разберите 'Location:' и выполните вышеуказанное снова с новым местоположением.

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
1 голос
/ 11 ноября 2009

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

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

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

Редактировать - добавлено

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

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

и

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

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

0 голосов
/ 23 марта 2013

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

0 голосов
/ 15 июля 2012

Для адресации одного периода (.) В конце URL используйте следующее:

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

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

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

0 голосов
/ 11 ноября 2009

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

...