c#和Asp.net web api中的URL编码
本文关键字:中的 URL 编码 api web Asp net | 更新日期: 2023-09-27 18:02:25
我有一个ASP.NET web api
,接收web请求并返回Json
数据。
浏览此URL:http://1.2.3.4/api1/api/values/mypartname
将返回以下json字符串:
{
'"PartName'": '"mypartname'",
'"PartDes'": '"53.6X53.6APA/ALIM1NOTPAK'",
'"PartLocation'": '"A36'"
}
但是当发送一个包含空格或引号的部件名称时,像这样:http://1.2.3.4/api1/api/values/my part na"me
我得到404 - File or directory not found.
错误。
我正在使用json
和.NET 4 Console application
,如下所示:
static void Main(string[] args)
{
try
{
string partName = "TAPE 56 3M 3/4'"";
WebRequest wr = WebRequest.Create("http://1.2.3.4/api1/api/values/" +
HttpUtility.UrlEncode(partName));
wr.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse hwr = (HttpWebResponse)wr.GetResponse();
Stream dataStream = hwr.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string json = reader.ReadToEnd();
//some json parsing function
des(json);
reader.Close();
dataStream.Close();
hwr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}
在这一行抛出异常:HttpWebResponse hwr = (HttpWebResponse)wr.GetResponse();
异常消息为:The remote server returned an error: (404) Not Found.
我做错了什么与mypartname
?我还尝试手动替换有问题的字符根据这:HTML URL编码参考和使用这个函数:Uri.EscapeDataString(partName)
,但没有运气。
编辑
这是routeConfig的定义:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
和api GET方法:
// GET api/values/5
public string Get(string id)
{
List<dummy> dummies = new List<dummy>();
string con = "user id=sa;" +
"password=1234" +
"server=someServer''someInstance;" +
"database=game; " +
"connection timeout=30";
//SqlConnection sqlConn = new SqlConnection(con);
using (SqlConnection sqlconn = new SqlConnection(con))
{
sqlconn.Open();
StringBuilder sb = new StringBuilder();
sb.Append("SELECT PART.PARTNAME,PART.PARTDES, PARTPARAMA.LOCATION ");
sb.Append("FROM PART LEFT JOIN PARTPARAMA ");
sb.Append("ON PART.PART = PARTPARAMA.PARTPARAM ");
sb.Append("WHERE PART.PARTNAME = @part");
using (SqlCommand cmd = new SqlCommand(sb.ToString(), sqlconn))
{
cmd.Parameters.AddWithValue("part", id);
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
dummies.Add(new dummy
{
PartName = sdr.IsDBNull(0) ? "Unknown" : sdr.GetString(0),
PartDes = sdr.IsDBNull(1) ? "Unknown" : sdr.GetString(1),
PartLocation = sdr.IsDBNull(2) ? "Unknown" : sdr.GetString(2)
});
}
}
}
if (dummies.Count() > 0)
{
string json = JsonConvert.SerializeObject(dummies[0]);
return json;
}
else
{
string json = JsonConvert.SerializeObject(null);
return json;
}
编辑 10 2015年4月:
我把这个答案留给任何在搜索中找到它的人,然而,正如Kevin在下面所说的和Scott Hanselman在这里所说的:
[UrlPathEncode]不做你认为它做什么…这个方法是非常具体,命名不当,现在完全过时了。
我认为您的问题更多地与部件名称中的正斜杠有关。您可以使用
处理空格和引号
HttpUtility.UrlPathEncode(partName)
代替HttpUtility.UrlEncode(partName)
。
处理正斜杠更有问题。