最近一段时间在做跟某公司数据对接的工作,我们双方的技术人员在观察对接数据的时候,发现部分数据无法通过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 }
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 }
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 }
希望能帮助到其他有需要的朋友。