4

ASP.NET web apiWeb リクエストを受信して​​データを返す があります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 Encoding Reference and using this function:Uri.EscapeDataString(partName)しかし、うまくいきませんでした。

EDIT
これは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;
        }
4

1 に答える 1

3

編集2015 年 4 月 10 日:

検索で見つけた人のために、この回答をここに残しておきますが、ケビンが以下に述べ、スコット・ハンセルマンがここで言っているように

[UrlPathEncode] は、あなたが思っていることをしません... このメソッドは非常に具体的で、名前が不十分で、現在は完全に廃止されています。


あなたの問題は、パーツ名のスラッシュに関係していると思います。を使用してスペースと引用符を処理できます

HttpUtility.UrlPathEncode(partName)

の代わりに HttpUtility.UrlEncode(partName)

スラッシュの処理はさらに問題があります。詳細については、この投稿を参照してください。

于 2013-03-06T12:38:03.867 に答える