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

最近一段时间在做跟某公司数据对接的工作,我们双方的技术人员在观察对接数据的时候,发现部分数据无法通过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 }

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

 

你可能感兴趣的:(request)