Dans mon contrôleur Web API, j'ai une fonction avec les codes suivants
[HttpPost]
public HttpResponseMessage Post(string schooltypeName)
{
_schoolTypeService.RegisterSchoolType(schooltypeName);
var message = Request.CreateResponse(HttpStatusCode.Created);
return message;
}
Lorsque j'appelle avec un violoneux, je reçois cette erreur
{"Message":"The requested resource does not support http method 'POST'."}
mes paramètres de violon sont
En-tête
User-Agent: Fiddler
Host: myhost:8823
Content-Type: application/json; charset=utf-8
Content-Length: 26
Corps de la demande
{"schooltypeName":"Aided"}
L'URL demandée est
http://myhost:8823/SchoolType
(J'ai configuré l'URL, GET travaille avec cette URL)
Qu'est-ce qui ne va pas ici?
Modifiez votre action pour qu'elle ressemble à Post([FromBody]string schooltypeName)
car, par défaut, le type de chaîne devrait venir Uri.
mis à jour:
Changez votre corps pour simplement "Aided"
comme actuellement vous auriez besoin d'une classe pour faire fonctionner la désérialisation sinon ( ex : class School { public string SchoolTypeName { get; set; } }
Voir en utilisant l'espace de noms en haut du contrôleur, si vous utilisez System.Web.Mvc, alors ce problème peut se produire:
Utilisez ceci:
using System.Web.Http;
Le problème se résume à ceci:
si vos itinéraires au démarrage sont enregistrés avec routes.MapRoute(
, vous devez décorer vos méthodes de publication avec [System.Web.Mvc.HttpPost]
Si vos itinéraires au démarrage sont enregistrés avec Routes.MapHttpRoute(
, Vous devez décorer vos méthodes de publication avec [System.Web.Http.HttpPost]
si vous utilisez MapRoute()
avec [System.Web.Http.HttpPost]
cela ne fonctionnera pas
si vous utilisez MapHttpRoute()
avec [System.Web.Mvc.HttpPost]
cela ne fonctionnera pas
Pour les futurs lecteurs. J'ai trouvé cette question ... mais j'ai trouvé (ma) réponse ailleurs.
J'ai décoré la méthode avec l'attribut ci-dessous.
[System.Web.Http.HttpPost]
public MyOutputObject DoSomething([FromBody]MyInputObject args)
{
Console.Writeline(args.ToString());
}
Mon code client (C #, application console) pour être complet.
private static Task<MyOutputObject> MyClientCall(string baseAddress, MyInputObject args)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
/* Your class name would be "MyEntityController" most likely */
string serviceUrl = baseAddress + @"api/MyEntity/DoSomething";
HttpResponseMessage response = client.PostAsJsonAsync(serviceUrl, args).Result;
Console.WriteLine(response);
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine("ERROR: :( " + response.ReasonPhrase);
return null;
}
Task<MyOutputObject> wrap = response.Content.ReadAsAsync<MyOutputObject>();
return wrap;
}
J'ai trouvé ma réponse ici:
Veuillez vérifier le nom de la méthode GET Action que vous utilisez. Il est probable que vous utilisiez les mêmes noms de route vers la méthode GET et la méthode POST et attendez le résultat.
Exemple :
Nom du contrôleur: StudentController
[Route("api/Student/names")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "student1", "student2" };
}
URL de la méthode (GET): http: // localhost: 59342/api/student/names
[HttpPost]
[Route("api/Student/names")]
public String Post(String name)
{
return "success";
}
Pour POST à url: http: // localhost: 59342/api/student/names
Ensuite, vous obtiendrez l'erreur mentionnée ci-dessus
Solution: modifiez le nom de la méthode d'action POST comme ci-dessous)
[HttpPost]
[Route("api/Student/getName")]
public String Post(String name)
{
return "success";
}
L'URL qui est utilisée pour obtenir la réponse pour la méthode post est alors:
Ce qui m'a aidé à la fin était d'ajouter l'attribut Route
et de répéter simplement la même route que celle enregistrée globalement.