忽略特殊字符-Web API C#



问题:特殊字符,特别是$和£,导致Web Api-ASP.NET C#中的行为不一致。调用API后,结果有时是-

结果:{"消息":"发生错误。"}

  • 请求格式:url+消息
  • API完整调用:"//api/数据?消息=测试%20For%20%245700.00%20at%20">
  • 消息:";在">

我尝试了

  1. 使用Uri.EscapeDataString(请求)调用API,但结果仍然不总是100%成功(50%的次数通过,其余50%的次数出现上面的错误消息)
  2. 删除$或£符号,它每次都会通过

问题:有没有办法允许特殊字符通过API(就像字符串一样)?即使包含了特殊字符,有没有办法只返回普通字符串?下面有一些代码可以得到消息-

public List<Results> Get(string Message)
{
//DO SOMETHING WITH THE MESSAGE AS A STRING & RETURN RESULTS
}

此外,以下是我如何调用API-

//CALLING API STEPS
string url = ".....//api/data?Message=";
string message = "Test For $5700.00 at ";
string completeURL = url + Uri.EscapeDataString(message);
var client = new WebClient();
var content = client.DownloadString(completeURL);

我在下面添加了一些额外的测试结果-

测试结果-通过

string url = ".....//api/data?Message=";
string message = "Test For $5700.00 at ";
message = message.Replace("$", "%24");//Adding this line before the URL-encoding fixes the problem
string completeURL = url + Uri.EscapeDataString(message);
var client = new WebClient();
var content = client.DownloadString(completeURL);
//PASS - COMPLETE URL: ".....//api/data?Message=Test%20for%20%25245700.00%20at%20"
//RESULT - API CALL SUCCESSFUL

测试结果-失败

string url = ".....//api/data?Message=";
string message = "Test For $5700.00 at ";
string completeURL = url + Uri.EscapeDataString(message);
var client = new WebClient();
var content = client.DownloadString(completeURL);
//FAIL - COMPLETE URL: ".....//api/data?Message=Test%20for%20%245700.00%20at%20"
//RESULT - EXCEPTION -> "The remote server returned an error: (500) Internal Server Error."

感谢您添加测试结果:

//PASS - COMPLETE URL: ".....//api/data?Message=Test%20for%20%25245700.00%20at%20"
//RESULT - API CALL SUCCESSFUL
//FAIL - COMPLETE URL: ".....//api/data?Message=Test%20for%20%245700.00%20at%20"
//RESULT - EXCEPTION -> "The remote server returned an error: (500) Internal Server Error."

似乎很清楚发生了什么:

  • 在";成功;如果您正在传递一个百分号("%",十六进制0x25)和值"%";245700.00">
  • 在";失败";在这种情况下,您将传递一个美元符号(0x24)和值"0";5700.00〃&">
  • 当您的应用程序(应用程序,而不是Web API)试图读取$&">

我怀疑失败的情况(HTTP错误500);成功;案例两者都是错误的。

我认为你的意思是";5700.00";,而不是";245700.00";。

建议:

  • 消除"$"…或者
  • 修改你的应用程序以期望(并接受)领先的"$"签名

最新更新