从包含特殊字符的字符串构建URI(SVN文件夹)

时间:2018-04-19 09:48:59

标签: c# url encoding sharpsvn flurl

我需要在SVN存储库上远程创建目录。 文件夹可以包含特殊字符,例如我的示例中的供应商,驱动程序和版本目录可以包含一个或多个加号(“+”)字符。

DoDontEscape()只是将目录合并到一个URL

DoEscape()

  • 在将目录与URI
  • 组合之前对目录使用Uri.EscapeDataString()
  • 抛出'路径已存在'异常

在组合和构建Uri.EscapeDataString()对象之前,是否需要在每个目录上使用Uri?或者只是组合和构建Uri对象OK?

我使用SharpSVN 用于远程创建目录的库和用于组合URL的Flurl

代码

using SharpSvn;
using Flurl;

static readonly string reposRootString = @"https://my.svn.repos/Testing/";
static readonly string vendor = "Vendor";
static readonly string driver = "Driver+";
static readonly string version = "1.0.0.1";

static void Main(string[] args)
{
    DoDontEscape();
    DoEscape();

}

private static void DoDontEscape()
{
    string combined = Url.Combine(reposRootString, vendor, driver, version);
    TryCreateURI(combined);
}

private static void DoEscape()
{
    var vEscaped = Uri.EscapeDataString(vendor);
    var dEscaped = Uri.EscapeDataString(driver);
    var dvEscaped = Uri.EscapeDataString(version);

    string combined = Url.Combine(reposRootString, vEscaped, dEscaped, dvEscaped);
    TryCreateURI(combined);
}

private static void TryCreateURI(string combined)
{
    Uri uri;
    if (Uri.TryCreate(combined, UriKind.Absolute, out uri))
    {
        CreateSvnDir(uri);
    }
    else
    {
        throw new Exception(string.Format("{0} is an invalid URI!", combined));
    }
}

private static void CreateSvnDir(Uri uri)
{
    using (SvnClient client = new SvnClient())
        client.RemoteCreateDirectory(uri, new SvnCreateDirectoryArgs() { CreateParents = true, LogMessage = "create dir" });
}

1 个答案:

答案 0 :(得分:0)

Flurl的Url.Combine对其如何编码路径段非常保守。如果您包含保留字符(具有特殊含义的字符,例如" /"或" +"),则会假定您要将它们包括在内 - 是和不会对它们进行编码。它只会编码非法字符,例如空格。

我猜你想在这里编码保留字符,所以你的DoEscape()方法看起来是正确的。请注意,Flurl有自己的编码方法Url.Encode,它与Uri.EscapeDataString非常相似,只是它克服了一些可能影响或不影响您的quirks。即:

    当你达到65,520个字符时,
  1. Uri.EscapeDataString会抛出异常; Url.Encode没有。

  2. Uri.EscapeDataString没有为您提供将空格编码为" +&#34 ;; Url.Encode确实如此。