CodeGo.net>如何在路径段中包括数字(哈希)字符#?
作者:互联网
我必须下载一个文件(使用现有的Flurl-Http端点[1]),该文件的名称包含一个“#”,当然必须转义为“#”才能与uri碎片检测不冲突.
但是Flurl总是转义其余字符,而不是此字符,导致uri无法正常工作,其中一半路径和所有查询参数都丢失了,因为它们被解析为uri片段:
Url url = "http://server/api";
url.AppendPathSegment("item #123.txt");
Console.WriteLine(url.ToString());
返回:http:// server / api / item#123.txt
这意味着一个HTTP请求(使用Flurl.Http)将仅尝试下载不存在的资源http:// server / api / item.
即使我预先转义了片段,结果仍然变得完全相同:
url.AppendPathSegment("item %23123.txt");
Console.WriteLine(url.ToString());
再次返回:http:// server / api / item#123.txt.
有什么办法可以阻止这种“魔术”的发生?
[1]这意味着我有委托/接口,其中输入是我必须修改的现有Flurl.Url实例.
解决方法:
您好像发现了一个错误.这是Flurl遵循的documented编码规则:
- Query string values are fully URL-encoded.
- For path segments, reserved characters such as / and % are not encoded.
- For path segments, illegal characters such as spaces are encoded.
- For path segments, the ? character is encoded, since query strings get special treatment.
根据第二点,它不应在路径中编码#,因此它如何处理AppendPathSegment(“ item#123.txt”)是正确的.但是,当您自己将#编码为#时,Flurl当然不应对其进行取消编码.但我已经确认这是事实.我邀请您参加create an issue on GitHub,并且将解决该问题.
同时,您可以编写自己的扩展方法来解决这种情况.像这样的东西应该可以工作(并且您甚至不需要预先编码#):
public static Url AppendFileName(this Url url, string fileName) {
url.Path += "/" + WebUtility.UrlEncode(fileName);
return url;
}
标签:flurl,c,net 来源: https://codeday.me/bug/20191111/2017517.html