现在的位置: 首页 > 综合 > 正文

[MVC] 获取请求时缺少”+”的处理办法 How to fix the bug that missing plus in Request.QueryString/Form

2011年11月17日 ⁄ 综合 ⁄ 共 1021字 ⁄ 字号 评论关闭

最近一段时间在做跟某公司数据对接的工作,我们双方的技术人员在观察对接数据的时候,发现部分数据无法通过MD5加密验证。

原始代码如下

1 [HttpPost]
2 public ActionResult Index(string lcData)
3 {
4     string lcDataDecode = HttpUtility.UrlDecode(lcData, Encoding.UTF8);
5     string response = DoSometing(lcDataDecode);
6 
7     return RedirectToAction("Index");
8 }

通过双方数据对比,发现上述代码中lcData的值是已经通过Decode之后的值,并不是原始的数据。由于这次Decode,导致数据中的加号“+”被过滤掉。

请参考一下dudu的文章HttpUtility.UrlEncode、HttpUtility.UrlDecode、Server.UrlEncode、Server.UrlDecode的区分与应用

在网上查找了一些解决办法,很多人提到用 Request.QueryString["key"].Replace(" ", "+"); 来处理。但是我们的数据无法这样处理,因为传递的数据中本身就有空格“ ”的存在。

因此,我们寻找到了下面的方法

 1 [HttpPost]
 2 public ActionResult Index(string lcData)
 3 {
 4     Regex r = new Regex(@"lcData=(?<value>[^&=]+)"); //针对我们的需求,如果需要解析所有的可以用(?<name>[^&=]+)=(?<value>[^&=]+)
 5     Match m = r.Match(Request.Params.ToString());
 6 
 7     lcData = m.Groups[1].Value;
 8     string lcDataDecode = HttpUtility.UrlDecode(lcData, Encoding.UTF8);
 9 
10     string response = DoSometing(lcDataDecode);
11 
12     return RedirectToAction("Index");
13 }

希望能帮助到其他有需要的朋友。

 

抱歉!评论已关闭.