【问题标题】:C# Keep Semicolon in URIC# 在 URI 中保留分号
【发布时间】:2019-01-13 15:39:56
【问题描述】:

我需要在 URI 中保留分号(不要转义它)。最终的 url 看起来像这样:

http://dontclick.com?Product=CON&Properties=color;price;location

我一直在使用 UriBuilder,但似乎无法保留分号。

它一直在转义“;”作为“%3d”

string url = "http://dontclick.com";
string product = "CON";
List<string> props = new List<string>{"color", "price", "location"};

var uriBuilder = new UriBuilder(url);
var paramValues = HttpUtility.ParseQueryString(uriBuilder.Query);
paramValues.Add("Product", product);
paramValues.Add("PropertyNames", string.Join(";", props));
uriBuilder.Query = paramValues.ToString();

string finalURL = uriBuilder.Query.ToString();

Console.WriteLine(finalURL);

//OUTPUT:
//http://dontclick.com?Product=CON&PropertyNames=color%3dprice&3dlocation

谁能帮我保留分号?

编辑 我有一些关于为什么需要分号的问题,因为它们是非法字符。

回答:这是 URL 所要求的 - 我无法控制它。我正在查询一个外部站点(我有自己的加密访问密钥),它将根据参数返回一个 XML 文件。在示例中,它们明确告诉我们使用分号分隔参数。当我使用分号时 - 它有效,如果我让 URL 将分号编码为 %3d - 它不起作用。

很遗憾我无法控制

【问题讨论】:

  • ; 是 Url 中的保留字符,因此正在对其进行编码。如果您控制dontclick.com,则让您的应用程序解码该值。
  • 您确定使用编码的分号会失败吗?
  • @HansKesting 是的。系统很旧 - 开发人员现在只是希望将这个 POS Silverlight 应用程序转换为 HTML5 标准

标签: c# decode uribuilder


【解决方案1】:

根据URL specification(CFG 在第 15/16 页),分号是 URL 的非法字符,因此被编码出来。

您尝试使用的服务设计不佳,或者您尝试做一些您确实不应该做的事情。

但是,回答您的问题:

你可以用字符串替换finalURL:

finalUrl = finalUrl.Replace("%d3", ";");

但是,这里有些东西闻起来很时髦。您能告诉我们为什么需要这个分号吗?

【讨论】:

  • HttpUtillity.UrlEncode 将是比字符串替换更好的选择
  • 我必须查询一个外部系统,该系统将根据查询生成一个 XML 文件。在它给我们的示例中 - 它需要一个分号来表示单独的属性名称。不管这是否违法,这是我必须处理的,我无法控制。
  • @Liam 代码的重点不是在编码后将%d3 更改为; 吗?这让HttpUtillity.UrlEncode 成为一个非常糟糕的选择?
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多