Le Codage d'URL en c# et Asp.net web api

J'ai un ASP.NET web api qui reçoit les requêtes web et renvoie Json de données.

la navigation à cette URL:

http://1.2.3.4/api1/api/values/mypartname sera de retour le suivant de la chaîne json:

{
    \"PartName\": \"mypartname\",
    \"PartDes\": \"53.6X53.6APA/ALIM1NOTPAK\",
    \"PartLocation\": \"A36\"
}

mais lors de l'envoi d'une partie dont le nom contient des espaces ou des guillemets comme ceci: http://1.2.3.4/api1/api/values/my part na"me - je obtenir un 404 - File or directory not found. erreur.

Je suis à la consommation de la json avec un .NET 4 Console application comme suit:

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();
        }
    }

l'exception est levée lors de cette ligne:HttpWebResponse hwr = (HttpWebResponse)wr.GetResponse();
et le message d'exception est: The remote server returned an error: (404) Not Found.

Je fais quelque chose de mal avec l' mypartname? J'ai aussi essayé de remplacer manuellement la problématique personnages en fonction de ce: HTML Codage d'URL de Référence et l'utilisation de cette fonction:Uri.EscapeDataString(partName) mais avec pas de chance.

MODIFIER

c'est le routeConfig définition:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );  

et de l'api méthode 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;
}
Pouvez-vous nous montrer votre configuration de routage et de contrôleur de signatures de méthode.

OriginalL'auteur Yoav | 2013-03-06