2016-11-11 10 views
4

Ich habe eine WebAPI ControllerASP.NET WebAPI und Angular POST

public class MyController : ApiController 
{ 
    [HttpPost] 
    public SomeResult MyAction(string name, string message) 
    { 
     return SomeResult.???; 
    } 
} 

Ich habe einen Winkelregler Der Aufruf dieser Methode

$http 
    .post("/api/My/MyAction", { name: "bob", message: "hello" }) 
    .then(function(xhr) { ... }, function(xhr) { ... }); 

ich dieses Ergebnis

Server-Fehler erhalten in '/' Anwendung.

Die Ressource kann nicht gefunden werden.

Was habe ich falsch gemacht?

P.S. Es ist nicht die URL ... Es funktioniert, wenn ich HttpGet verwende und die Parameter an die Abfragezeichenfolge anfügen.

+0

schreiben Sie bitte Ihre Routing-Konfiguration Anrufe . – toadflakz

+0

Überprüfen Sie die Antwort auf diese Frage http://stackoverflow.com/questions/40082163/webapi-httppost-endpoint-not-being-hit/40082757#40082757 –

+0

Es könnte nur ein Tippfehler sein, aber in Ihrer Probe ist der Name der Aktion "MyAction", aber die von Ihnen verwendete URL ist "MyAccount". Wie der erste Kommentator sagte, wäre es auch nützlich, die Routing-Konfiguration zu sehen. – ADyson

Antwort

2

für mehr als ein Attribut für die Post-Anfragen, können Sie [FromBody] in Ihrem Controller und ein Ansichtsmodell Klasse. Beispiel:

[HttpPost] 
     public HttpResponseMessage UpdateNumber([FromBody]UpdateNumberViewModel model) 
     { 
      //To do business 
      return Request.CreateResponse(HttpStatusCode.OK); 
     } 

UpdateViewModel:

public class UpdateViewModel 
    { 
     public int Id{ get; set; } 
     public string Title{ get; set; } 

    } 

Eckig:

var model = {      
        Id: 1, 
        Title: 'Vai filhão' 
       } 

    $http.post('/api/controller/updateNumber/',model).then(function() { alert("OK"); }, function() {alert("something wrong"); }); 

Sie weitere Details sehen, wie Web-api es hier funktioniert: https://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

+0

ähnlich zu einer anderen Antwort hier, '[FromBody]' sollte nicht für einen komplexen Typ wie diese notwendig sein. Es ist nur erforderlich, wenn Sie versuchen, einen einfachen Typ (z. B. Zeichenfolge) im Körper zu übergeben. Siehe https://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api – ADyson

+0

Genau. Ich werde meine Antwort bearbeiten ... –

2

Ich habe dieses Problem konfrontiert, wenn Sie google gibt es verschiedene Möglichkeiten, es zu lösen. Eine der einfachsten erfordert nur ein Eingabeobjekt in Sie WebAPI Controller zu verwenden, so in Sie Fall nur Kiste eine Klasse

public class InputData { 
    public string name { get; set; } 
    public string message { get; set; } 
} 

dann Ihre Eingabe in die neuen erstellen mit [FromBody] Präfixobjekt ändern (vielleicht nicht zwingend notwendig, siehe @ Adyson Kommentar)

public SomeResult MyAction([FromBody]InputData inputData) 
+0

'[FromBody]' sollte für einen komplexen Typ wie diesen nicht notwendig sein. Es ist nur erforderlich, wenn Sie versuchen, einen einfachen Typ (z. B. Zeichenfolge) im Körper zu übergeben. Siehe https://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api – ADyson

+0

@ADyson danke für den Vorschlag, von Ihrem Link scheint es vernünftig, dass es nicht obligatorisch ist – Naigel