如何编码此查询字符串?

时间:2011-06-08 20:34:48

标签: c# url-encoding

我正在尝试实施付款处理器。为了验证响应是否合法,我必须获取查询字符串并附加验证密钥,然后执行MD5哈希并将我的哈希值与它们匹配。

支付处理器根据以下查询字符串生成哈希值:

  

trnId = 10000041
  &安培; MessageText中=重复+事务+%2D +这+交易+已+已经+被批准+
  &安培; trnAmount = 11.20
  &安培; trnDate = 6%2F8%2F2011 + 12%3A32%3A20 + PM
  &安培; trnEmailAddress =约翰%2Edoe%40gmail%2Ecom
  &安培; avsMessage =地址+验证+未+为+ +这个事务%2E
进行+   & ref1 = aab02ccd%2D7d17%2D4d09%2Da30c%2Dad6324fe33f1

现在,如果我打电话给QueryString["messageText"],我会得到"Duplicate Transaction - This transaction has already been approved"。我不能使用它,因为我需要+%2D

因此要生成我的字符串,我会这样做:

NameValueCollection queryString = new NameValueCollection(QueryString);
queryString.Remove("hashValue");

List<string> parameters = new List<string>();
foreach(string qs in queryString.Keys)
   parameters.Add(qs + "=" + HttpUtility.UrlEncode(QueryString[qs]));

string value = string.Join("&", parameters.ToArray());

我的结果字符串:

  

trnId = 10000041
  &安培; MessageText中=重复+交易+ - +这+交易+已经+已经被+ +批准
  &安培; trnAmount = 11.20
  &安培; trnDate = 6%2F8%2f2011 + 1%3a05%3a09 + PM
  &安培; trnEmailAddress = john.doe%40gmail.com
  &安培; avsMessage =地址+验证+未+为+ +这个交易进行+
。   &amp; ref1 = aab02ccd-7d17-4d09-a30c-ad6324fe33f1

这有点接近,但有2个问题,破折号和句点不编码,编码生成小写而不是大写。 %2f代替%2F

有没有办法在没有string.replace的情况下解决这个问题?我可以调用的另一种方法可以提供我想要的结果吗?

2 个答案:

答案 0 :(得分:1)

Rick Strahl在这里说得很清楚:Html and Uri String Encoding without System.Web

在那篇文章中,他的目标是避免使用System.Web,因为它的结果是混合的,这正是你遇到的问题(与源相比结果不一致)。

如果最坏的情况发生,你可能不得不退回使用string.Replace()或string.ToUpper() - 因为你的字符串不是很大,所以不应该产生太多的性能损失。

答案 1 :(得分:1)

使用QueryString.ToString()将完整的查询字符串作为一个大的编码字符串,包括所有&+等。如果仍然与您的预期不同,您可以去更深层次并抓住Request.RawUrl.Split('?')[1]