2010-07-12 12 views
2

Je vais avoir un peu de mal avec les URIs relativesTravailler avec des URIs relatives

J'ai une application simple HttpListener qui écoute sur un préfixe donné (actuellement il est http://+:80/Temporary_Listen_Addresses/, mais il pourrait être tout autre préfixe valide) .

Pour une demande donnée, j'essaie de déterminer l'URI demandé par rapport à ce préfixe, par exemple si quelqu'un a demandé http://localhost/Temporary_Listen_Addresses/test.html, je veux obtenir test.html.

Quelle est la meilleure façon de faire cela?

Mise à jour: La méthode MakeRelativeUri ne fonctionnait pas pour moi car elle ne connaissait pas les adresses équivalentes. Par exemple, ce qui suit a bien fonctionné lorsque vous utilisez « localhost »:

Uri baseUri = new Uri("http://localhost/Temporary_Listen_Addresses/"); 
Uri relative = baseUri.MakeRelativeUri(uri); 

Cependant, il ne fonctionne pas si vous accédez à http://127.0.0.1/, ou http://machinename/ etc ...

Répondre

2

Vous pouvez utiliser la méthode MakeRelative sur la Classe URI. Ce que vous pouvez faire si le nom de l'ordinateur ou la partie autorité de l'URL est un problème, créez une nouvelle URL avec la même autorité à chaque fois et utilisez uniquement le chemin des URI existants. Par exemple, vous pouvez créer votre URI entrée en faisant quelque chose comme:

UriBuilder b = new UriBuilder(); 
b.Path = input.Path; //this is just the path portion of the input URL. 
b.scheme = "http"; 
b.host = "localhost"; // fix the host so machine name isn't an issue 

input = b.Uri; 
URI relative = baseUri.MakeRelative(input); 
+0

Cela ne fonctionne pas tout à fait comme prévu - je vais préciser dans ma question. – Justin

0

Vous pouvez obtenir de l'URL de l'indice de la dernière occurrence de «/» et obtenir la sous-chaîne, qui commence juste après.

1

Voici une façon vraiment stupide pour réaliser ce but qui fonctionne:

var relativeUri = context.Request.Url.AbsolutePath. 
         Substring(baseUri.AbsolutePath.Length);