12
votes

Combinant deux URI relatives

Je dois combiner deux URIS relatives, par ex. ../ mypath / code> et myImage.png code> pour créer ../ mypath / myimage.png code>. Ils ne sont pas des chemins vers des fichiers sur disque, de sorte que path.combine code> n'est pas approprié (ce sont des chemins relatifs des ressources pour une page Web). nouvel URI code> jette un argumentoutofrantageeexception code> car l'uri de base est relatif (non absolu).

Dois-je une option autre que de vérifier une barre oblique de traction, puis de la combinaison de chemins Moi-même? p>

Edit: p>

Voici un cas de test qui démontre que la path.combine ne fonctionnera pas pour le cas lorsque la première URL ne contient pas déjà une barre oblique suivante: P >

// The first case fails with result "../testpath\resource.png"
[TestCase("../testpath", "resource.png", "../testpath/resource.png")] 
[TestCase("../testpath/", "resource.png", "../testpath/resource.png")]
public void TestPathCombine(string path, string resourceName, string expectedResult) {
    string result = Path.Combine(path, resourceName);
    Assert.AreEqual(expectedResult, result);
}


1 commentaires

3 Réponses :


2
votes

N'utilisez pas de path.combine tel qu'il est pour le chemin physical afin qu'il puisse vous confondre avec des barres obliques. Vous pouvez faire votre propre fonction d'Uri Combinez. Vérification de la barre oblique à la fin et annoncez-la à la suivante.

Constructeur URI de deux arguments? xxx


4 commentaires

Comme je l'ai dit dans le post en utilisant ce nouveau constructeur de l'URI échoue avec un argumentoutofrangeException car la baseuri est relatif. Créer ma propre fonction semble vraiment comme ma seule option.


Je pense que c'est la meilleure façon de le faire. Prenez l'aide de la classe VirtualPathutility. Il a combiné la fonction mais je ne suis pas sûr que cela correspond exactement à votre exigence. Mais il a des fonctions qui pourraient aider à en faire un. par exemple. APPENDRAILSLASH ET APPENDRAILSLASH


VirtualPathutility.AppendtrailingSlash PLUS Simple String Concaténation résout cette question. Cependant, à la fin, j'ai décidé d'exiger et de documenter que la barre oblique de fin était nécessaire pour le chemin de la base en premier lieu.


Grande Lawrence. Et il serait utile que vous éditez votre message et mettez la fonction ici car cela pourrait aider les personnes qui visitent ce message: P



3
votes

Vous pouvez utiliser le constructeur uri qui prend une base et un élément relatif pour effectuer la combinaison - mais noter que le comportement ne sera peut-être pas ce que vous attendez. La classe URI verra la partie d'extrémité de votre base comme un "répertoire" ou un "fichier" (pour le mettre en termes de chemin). S'il voit la fin sous forme de fichier, cela sera supprimé.

Par exemple, combinant http: // serveur / quelque chose / avec ressource.png vous donnera http: //server/something/resource.png .

Maintenant omettez la barre oblique suivante: combinez http: // serveur / quelque chose avec ressource.png et obtenir http: //server/resource.png < / code>.

Cela donne un sens si vous le pensez comme à partir d'une uri de base de http: //server/something.png et demandant le rapport uri ressource.png : http: //server/somethi.png/resource.png n'est pas ce que vous cherchez.

Si vous savez toujours qu'ils devraient être ajoutés, vous devez vous assurer que la base se termine par une barre oblique avant de combiner.


0 commentaires

8
votes

Si votre deuxième partie est (comme dans mon propre cas) vraiment un nom de fichier sans une évasion (et peut contenir des invalides caractères pour une URL), voici la solution que j'ai fini par:

/// <summary>
/// Convert a partial file path to a partial url path.
/// </summary>
/// <param name="partialFilePath">The partial file path.</param>
/// <returns>A partial url path.</returns>
public static string ConvertPartialFilePathToPartialUrlPath(
    string partialFilePath)
{
    if (partialFilePath == null)
        return null;
    return string.Join("/", 
        partialFilePath.Split('/', '\\')
            .Select(part => Uri.EscapeDataString(part)));
}


0 commentaires