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;
}
OriginalL'auteur Yoav | 2013-03-06
Vous devez vous connecter pour publier un commentaire.
MODIFIER 10 Avril 2015:
Je quitte cette réponse ici pour quiconque la trouve en faisant une recherche, cependant, que Kevin états-dessous et Scott, Hanselman dit ici:
Je pense que votre problème a plus à faire avec la barre oblique dans le nom de la pièce.
Vous pouvez gérer les espaces et les guillemets à l'aide de
au lieu de
HttpUtility.UrlEncode(partName)
.De la manipulation de la barre oblique est plus problématique. Voir ce post pour plus de détails.
HttpUtility.UrlPathEncode(partName)
(msdn.microsoft.com/en-us/library/...). Il n'était pas prévu pour cette utilisation (malgré ce que son nom l'indique) et n'est pas sûr à utiliser (asp.net/aspnet/overview/aspnet-45/...).Je suis arrivé ici à partir de Google aussi que ce post est top lors de la recherche pour l'encodage dans l'API web. Pour les API web, vous pouvez facilement accéder à la WebUtility classe pour coder l'URL ou le code HTML msdn.microsoft.com/en-us/library/...
Juste parce que vous ne savez pas faire quelque chose ne signifie pas nécessairement savoir ce que le droit chemin. L'ajout d'une autre réponse aussi ne pas avertir les gens sur les dangers possibles de la problématique de la réponse.
OriginalL'auteur Jon Susiak