Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c和Asp.net web api中的URL编码_C#_Url_.net 4.0_Asp.net Web Api_Console Application - Fatal编程技术网

C# c和Asp.net web api中的URL编码

C# c和Asp.net web api中的URL编码,c#,url,.net-4.0,asp.net-web-api,console-application,C#,Url,.net 4.0,Asp.net Web Api,Console Application,我有一个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://

我有一个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 我得到一个404文件或目录找不到。错误 我使用.NET 4控制台应用程序使用json,如下所示:

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=HttpWebResponsewr.GetResponse; 异常消息是:远程服务器返回错误:404未找到

我的零件名有问题吗?我还尝试根据以下内容手动替换有问题的字符:并使用以下函数:Uri.EscapeDataStringpartName,但没有成功

编辑 这是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;
        }
2015年4月10日编辑:

我将此答案留给在搜索中找到它的任何人,但正如Kevin在下面所述:

[UrlPathEncode]不会做你认为它会做的事。。。这种方法是可行的 非常具体,名字不好,现在已经完全过时了

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

HttpUtility.UrlPathEncodepartName

而不是HttpUtility.UrlEncodepartName


处理正斜杠的问题更大。有关更多详细信息,请参阅。

能否向我们显示您的路由配置和控制器方法签名。Microsoft明确声明开发人员不应使用HttpUtility.UrlPathEncodepartName。尽管它的名字意味着什么,但它并不是用于此用途的,而且使用起来也不安全。我也是从谷歌来到这里的,因为这篇文章在搜索web API编码时排名靠前。对于WebAPI,您可以轻松访问WebUtility类来编码URL或HTML,因为您知道不做某些事情并不意味着您一定知道正确的方法是什么。添加另一个答案也不会提醒人们问题答案可能存在的危险。