2013-06-11 8 views
12

Ich kann nicht für das Leben von mir dies herausfinden. Ich habe einen Web-API-Controller mit Get und Post-Methoden. Die Get-Methode funktioniert einwandfrei mit und ohne Parameter, aber der Post bricht ab, wenn ich versuche, einen String-Parameter hinzuzufügen. Unten ist mein Code.ASP.NET WebApi Post-Methode - 404 Beim Übergeben von Parametern

Route:

 config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{id}", 
      defaults: new { id = UrlParameter.Optional } 
     ); 

Controller:

public class AuditController : ApiController 
{ 
    public String Post(String test) 
    { 
     return "Success : " + test; 
    } 

    public String Get(String test) 
    { 
     return "Success : " + test; 
    } 
} 

Anfrage:

var request = WebRequest.Create("http://localhost:42652/Audit"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     using (var writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write("test=TEST"); 
     } 
     WebResponse webResponse = request.GetResponse(); 

ich viele Variationen der Anfrage versucht haben, ich fühle mich wie es ist etwas einfach ich bin fehlt. Danke für Ihre Hilfe.

+1

Ihre Route sagt, es hat einen Parameter mit dem Namen "ID", aber in Ihrer Methode übergeben Sie einen Parameter namens "test". Was soll es sein? Auch primitive Typparameter versuchen immer aus dem Uri zu lesen, daher funktioniert Ihre Post-Methode nicht. Ich schlage vor, dass Sie alle sehr netten ASP.Net Web API Tutorials auf der asp.net Homepage durcharbeiten! – JustAnotherUserYouMayKnow

+0

ist das ^^ genau? – Jonesopolis

+0

Ja ist es. Ihre Get-Methode repräsentiert die Route ohne den Parameter {id} - weil Ihr ID-Parameter in der Methode nicht vorhanden ist. Ihr Testparameter ist einer der optionalen Abfrageparameter, wenn Sie 'Audit? Test = value', aber nicht 'Audit/value' aufrufen. Die Antwort, die du angenommen hast, fasst das gut zusammen, aber ich ermutige dich trotzdem, die Tutorials wirklich zu bearbeiten! – JustAnotherUserYouMayKnow

Antwort

21

Da Sie Parameter erwartet werden test von Körper einer Anfrage zu kommen, würden Sie es mit FromBody Attribut schmücken müssen. Beispiel: ([FromBody]String test). Dies gilt nicht für andere komplexe Typen, z. B .: Employee Klasse, die implizit als von Body kommend betrachtet wird.

Reading GET Anfrage. Es soll nur arbeiten wird mit Test /Audit?test=Mike

Nach Blog-Post von Query-String kommt hat mehr Details über Parameterbindung: http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

Auch ich sehe, dass Sie WebRequest verwenden. Haben Sie darüber nachgedacht, stattdessen HttpClient von System.Net.Http zu verwenden?

+0

Ich habe das FromBody-Attribut hinzugefügt, und es wird jetzt den Dienst erreichen, aber die Variable 'test' in der Post-Methode ist leider null. Ich werde mir auch den HttpClient anschauen. – Jonesopolis

+0

versuchen, nur '= TEST' in Ihrem Körper zu senden. –

+0

fantastisch, dass es geschafft hat! Danke für deine Einsicht – Jonesopolis

Verwandte Themen