【问题标题】:URL Encoding in c# and Asp.net web apic# 和 Asp.net web api 中的 URL 编码
【发布时间】:2013-02-21 02:06:03
【问题描述】:

我有一个ASP.NET web api 接收网络请求并返回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.

我对@9​​87654333@ 做错了吗?我还尝试根据此手动替换有问题的字符:HTML URL Encoding Reference 并使用此功能: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;
        }

【问题讨论】:

  • 你能告诉我们你的路由配置和控制器方法签名吗?

标签: c# url .net-4.0 asp.net-web-api console-application


【解决方案1】:

编辑 2015 年 4 月 10 日:

我将这个答案留给在搜索中找到它的任何人,但是正如 Kevin 在下面和Scott Hanselman says here 所述:

[UrlPathEncode] 没有做你认为它做的事情......这个方法是 非常具体,名称不好,现在完全过时了。


我认为您的问题与零件名称中的正斜杠有关。 您可以使用

处理空格和引号

HttpUtility.UrlPathEncode(partName)

而不是HttpUtility.UrlEncode(partName)

处理正斜杠比较麻烦。详情请见this post

【讨论】:

  • Microsoft 明确声明开发人员不应使用HttpUtility.UrlPathEncode(partName) (msdn.microsoft.com/en-us/library/…)。它不适合此用途(尽管名称暗示)并且使用不安全(asp.net/aspnet/overview/aspnet-45/…)。
  • 我也是从 Google 来到这里的,因为在 Web API 中搜索编码时,这篇文章是最重要的。对于 Web API,您可以轻松访问 WebUtility 类来编码 URL 或 HTML msdn.microsoft.com/en-us/library/…
  • 你知道不做某事并不意味着你一定知道什么是正确的方法。添加另一个答案也不会警告人们有问题的答案可能带来的危险。
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2021-10-27
  • 2015-01-26
相关资源
最近更新 更多