none
.net灵异事件,在线等。 RRS feed

  • 问题

  • 客户端我访问服务端的api接口的时候,(post请求)参数有特殊符号我在每个参数的值给他HttpUtility.UrlEncode编码,比如
    www.test.com?a=HttpUtility.UrlEncode("aa+&#")&b=HttpUtility.UrlEncode("bb+&#")特殊符号,

    我在服务端获取是用到 NameValueCollection postForm = HttpContext.Current.Request.Form;
    在遍历每个参数,注意,灵异事件来了,我再.net的时候不需要给他进行HttpUtility.UrlDecode他的参数就已经是解码的了,这个时候如果在用HttpUtility.UrlDecode就会把参数中的+变成了空格,请问怎么解决,因为java过来的时候是不会自动解码的必须用HttpUtility.UrlDecode才行,所以这里就出现了矛盾
    2017年8月16日 9:52

答案

  • 你好,

    你可以使用Regex去检测字符串中是否包含”%XX“.

    示例如下:

         protected void Page_Load(object sender, EventArgs e)
            {
                string str1 = "aa + &#";
                string str2 = HttpUtility.UrlEncode(str1);  //result: aa+%2b+%26%23
    
                string str3 = HttpUtility.UrlDecode(str2); //result: aa + &#
    
                bool b1 = IsHttpEncode(str2); //result: true; 
                bool b2 = IsHttpEncode(str3); //result: false;
            }
    
            protected bool IsHttpEncode(string str)
            {
                string regex = @"(%[0-9a-f]{2})";
                //Regex rr = new Regex(@"^[\%[0-9a-f]{2}]", RegexOptions.IgnorePatternWhitespace);
                bool bb = Regex.IsMatch(str, regex); 
                return bb;
            }
    根据检测结果,如果为true, 说明已经被Encode了,可以调用HttpUtility.UrlDecode去解码。

    否则不需要调用。


    • 已标记为答案 Jason2s 2017年8月21日 1:22
    • 取消答案标记 Jason2s 2017年8月21日 1:22
    • 已标记为答案 Jason2s 2017年8月21日 1:22
    2017年8月18日 10:16
    版主

全部回复

  • 我认为这一步是多余的: (post请求)参数有特殊符号我在每个参数的值给他HttpUtility.UrlEncode编码

    post/get请求的参数值不需要做encode/decode,

    HttpUtility.UrlDecode是给url参数做encode/decode.  asp.net mvc或web api会处理好参数的传递,无需"请求的参数值encode/decode"


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年8月17日 0:26
  • 因为java过来的时候是不会自动解码的必须用HttpUtility.UrlDecode才行,所以这里就出现了矛盾

    请问你用Java语言做了一个页面,然后提交到NET的WebApi里边去?

    无论如何,只要经过ASP MVC的WebApi,Decode应该自动进行的。

    如果还是不行,请在您的Java页面额外提交一个参数(比如暂定为isJavaSubmit)。你在MVC中检测如果带有这个参数,说明通过Java提交,然后强行使用Url.Decode。


    Reproduce your quesions with   ScreenToGif is your choice.
    For IIS: IIS Forum,
    For WebSite of .NET, ASP.NET Forum,
    For others, StackExchange
    For spam-sender or forum urgent issues, Send your Email at: forumsfeedback@microsoft.com

    2017年8月17日 0:58
  • 你好,webapi在怎么处理好,但是我用Request.From获取参数带特殊符号比如+号,他默认获取到的就是空格,如果不编码的话,现在就是java过来后Request.From没有自动解码,还需要手动解码才可以
    2017年8月17日 1:13
  • 你好,

    你可以使用Regex去检测字符串中是否包含”%XX“.

    示例如下:

         protected void Page_Load(object sender, EventArgs e)
            {
                string str1 = "aa + &#";
                string str2 = HttpUtility.UrlEncode(str1);  //result: aa+%2b+%26%23
    
                string str3 = HttpUtility.UrlDecode(str2); //result: aa + &#
    
                bool b1 = IsHttpEncode(str2); //result: true; 
                bool b2 = IsHttpEncode(str3); //result: false;
            }
    
            protected bool IsHttpEncode(string str)
            {
                string regex = @"(%[0-9a-f]{2})";
                //Regex rr = new Regex(@"^[\%[0-9a-f]{2}]", RegexOptions.IgnorePatternWhitespace);
                bool bb = Regex.IsMatch(str, regex); 
                return bb;
            }
    根据检测结果,如果为true, 说明已经被Encode了,可以调用HttpUtility.UrlDecode去解码。

    否则不需要调用。


    • 已标记为答案 Jason2s 2017年8月21日 1:22
    • 取消答案标记 Jason2s 2017年8月21日 1:22
    • 已标记为答案 Jason2s 2017年8月21日 1:22
    2017年8月18日 10:16
    版主