13 Stimmen

ASP.NET WebApi Post Methode - 404 beim Übergeben von Parametern

Ich kann einfach nicht herausfinden, was hier los ist. 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. Hier ist mein Code:

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 "Erfolg : " + test;
    }

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

Anfrage:

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

Ich habe viele Variationen der Anfrage ausprobiert, ich habe das Gefühl, dass mir etwas Einfaches entgeht. Vielen Dank für deine Hilfe.

22voto

Kiran Punkte 56311

Da Sie erwarten, dass der Parameter test aus dem Body einer Anfrage stammt, müssten Sie ihn mit dem Attribut FromBody dekorieren. Beispiel: ([FromBody]String test). Dies gilt nicht für andere komplexe Typen, wie z.B. die Employee-Klasse, die implizit als aus dem Body kommend betrachtet wird.

Was die GET-Anforderung betrifft: Sie sollte nur mit dem aus der Abfragezeichenfolge stammenden Test funktionieren /Audit?test=Mike

Der folgende Blogbeitrag enthält weitere Details zur Parameterbindung: http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

Außerdem sehe ich, dass Sie WebRequest verwenden. Haben Sie schon überlegt, stattdessen HttpClient aus System.Net.Http zu verwenden?

3voto

adhocgeek Punkte 1437

Ändern Sie Ihren AuditController, um das FromBody Attribut einzuschließen :

public class AuditController : ApiController
{
    public String Post([FromBody]String test)
    {
        return "Erfolg : " + test;
    }

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

cf. http://msdn.microsoft.com/en-us/library/system.web.http.frombodyattribute(v=vs.108).aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X