2009-11-11 10 views
2

Je cours le code suivant;Problème WebClient avec l'URL qui se termine par une période

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

Pour accéder à l'URL d'un site de cours de l'action, http://www.shareprice.co.uk

Si vous ajoutez un nom de symbole de la société sur la fin de l'URL, puis une page est retournée que je parse pour obtenir les dernières informations de prix etc.

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

http://www.shareprice.co.uk/TW. Maintenant, mon problème est que certains symboles se terminent par des périodes, comme dans le deuxième exemple là-bas. Pour une raison inconnue, le code ci-dessus rencontre un problème lors de la récupération de ces types d'URL.

Il n'y a pas d'erreur au moment de l'exécution, mais une page est retournée qui indique "Le symbole est introuvable" sur le site Web, indiquant qu'il se passe quelque chose à la fin de l'URL entre l'appel à DownloadString et la requête HTTP réelle.

Est-ce que quelqu'un a une idée de ce qui pourrait être à l'origine de ce problème et comment y remédier?

Merci

+0

Contrôlez-vous http://www.shareprice.co.uk, ou s'agit-il d'un site tiers? – David

+0

Si c'est une tierce partie, avez-vous vérifié leur documentation sur la façon de gérer les périodes dans votre URL? – David

+0

C'est un site tiers, je n'ai aucune association avec eux - c'est juste un petit projet de loisir sur lequel je travaille. Je devrais probablement avoir clarifié, si vous tapez une adresse avec une période à la fin dans un navigateur, cela fonctionne bien. D'où la question ici, car je présume que ce doit être un problème .NET. –

Répondre

2

Il semble que vous ayez trouvé un bogue dans WebClient/WebRequest, bien que Microsoft l'ait peut-être intentionnellement mis en place, qui sait? Néanmoins, lorsque vous passez dans TW., La classe URI le traduit en TW sans la période. Depuis WebClient/WebRequest analyser les chaînes en URI, votre. est en train de disparaître dans ce monde.

Vous devrez peut-être utiliser TcpClient pour contourner ce problème et lancer votre propre client Web. Toute variation de cette:

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

Cela vous donnera une redirection 302, de sorte que le parser « Location: » et exécuter ce qui précède à nouveau avec le nouvel emplacement.

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 
+0

Parfait. Cette solution a fonctionné greated, merci beaucoup Sean. –

+0

Pas de problème, content que cela puisse aider. – Sean

1

Essayez d'ajouter une barre oblique à la fin, après la période. Votre navigateur Web normal le fera pour vous, et la classe WebClient n'est pas très intelligente.

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

Cela a fonctionné pour moi aussi quand je l'ai tapé dans le navigateur.

Edition - a ajouté

qui suit tout aussi travaillé dans le navigateur

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

et

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

donc il semble que vous devriez être en mesure de vérifier juste voir si le dernier caractère est une période et l'enlever.

+1

Toutefois, cela ne semble pas fonctionner dans WebClient ou WebRequest. Ces deux classes convertissent les chaînes en Uri. Quand un Uri est remis à ce TW. url, il semble enlever la période. Vraisemblablement, il croit que vous aviez l'intention de compléter l'extension du fichier, mais il n'a pas été terminé, donc il coupe juste le tout. – Sean

0

utiliser l'encodage de l'URL ... il activera le "." dans% 2E

+1

À première vue, on pourrait penser que cela fonctionnerait, mais il ne semble pas. – Sean

+0

Utilisez-vous Fiddler pour tracer les appels? Ça pourrait être une bonne idée. Lorsque vous pouvez voir à quoi ressemble la requête brute, elle offre parfois plus d'indices que le simple débogage. – Rich

0

il suffit d'ajouter un espace après la période, lorsque Parsin g l'espace sera supprimé mais la période restera là.

Questions connexes