C# WebAPI仅对URL编码字符串进行部分解码

C# WebAPI仅对URL编码字符串进行部分解码,c#,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,因此,我正在ASP.NET上使用WebAPI编写一个REST应用程序。我遇到了一个问题 在PHP上,我使用urlencode函数 原始的base64编码字符串为 kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc= 在PHP上通过urlencode运行后,我得到:- kA%2B1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3%2FWubyGTc%3D 在这个调试之后,我检查了fiddler,实际上是它通过正确的URLEncoded字符串发送 现

因此,我正在ASP.NET上使用WebAPI编写一个REST应用程序。我遇到了一个问题

在PHP上,我使用urlencode函数

原始的base64编码字符串为

kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc=

在PHP上通过urlencode运行后,我得到:-
kA%2B1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3%2FWubyGTc%3D

在这个调试之后,我检查了fiddler,实际上是它通过正确的URLEncoded字符串发送

现在,当谈到ASP.NET MVC WebAPI时,我得到:-

kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc%3

因此,看起来WebAPI或MVC正试图自己进行一些预草书url解码,但它有两个问题:-

  • 它只是对字符串进行部分解码,因此+和/号可以正确转换,而=不能
  • 它似乎正在截断%3D中的D,这将导致%3不是有效的URL字符
以前有人遇到过这个问题吗?要复制它,只需使用

public TokenAPI Get(Guid caller, Guid id, string ip, string signature, Guid eventID)
{
}
并传递值

/api/GenerateToken?id=d9a2057c-c228-40d4-a9a9-5d7a4da4984b&调用方=e1af32bb-ac84-4f45-b4d6-67f7543ffa2&ip=127.0.0.1&事件id=f6d71c3d-ef00-41e1-8dec-a37bdf7484&签名=kA%2b1n8i00qcjpngpuq8yqerscbqow5hvb3%2FWubyGTc%3D

然后检查signature参数,您会发现它只被自己部分解码


非常感谢您的指点

我无法用ASP.NET MVC 4 RC重现这一点

步骤:

  • 创建新的空ASP.NET MVC 4应用程序
  • 添加API控制器:

    public class ValuesController : ApiController
    {
        public string Get(Guid caller, Guid id, string ip, string signature, Guid eventID)
        {
            return signature;
        }
    }
    
  • 导航到
    /api/values?id=d9a2057c-c228-40d4-a9a9-5d7a4da4984b和caller=e1af32bb-ac84-4f45-b4d6-67f7543ffa2&ip=127.0.0.1和eventID=f6d71c3d-ef00-41e1-8dec-a37bdf7484和签名=kA%2b1n8i00qcjpngpuq8yqerscbqow5hvb3%2FWubyGTc%3D

  • 结果:

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc=</string>
    
    kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc=
    

  • 签名
    参数已正确进行url解码。

    我无法使用ASP.NET MVC 4 RC重现此结果

    步骤:

  • 创建新的空ASP.NET MVC 4应用程序
  • 添加API控制器:

    public class ValuesController : ApiController
    {
        public string Get(Guid caller, Guid id, string ip, string signature, Guid eventID)
        {
            return signature;
        }
    }
    
  • 导航到
    /api/values?id=d9a2057c-c228-40d4-a9a9-5d7a4da4984b和caller=e1af32bb-ac84-4f45-b4d6-67f7543ffa2&ip=127.0.0.1和eventID=f6d71c3d-ef00-41e1-8dec-a37bdf7484和签名=kA%2b1n8i00qcjpngpuq8yqerscbqow5hvb3%2FWubyGTc%3D

  • 结果:

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc=</string>
    
    kA+1n8i00qcJPNgPUXq8YqerScbQOw5Hvb3/WubyGTc=
    

  • 签名
    参数的url解码正确。

    Ugh,好的,谢谢@DarinDimitrov,我会试着弄清楚发生了什么。移除所有过滤器等,etc将发回任何发现。呃,好的,谢谢@DarinDimitrov,我会尝试找出发生了什么。移除所有过滤器等,并将发现的结果发回。