2013-02-28 8 views
5

Ich habe den folgenden Code, aber die Anfrage Enden (Foo()/Bar()) immer in No action was found on the controller 'Device' that matches the request.ASP.NET WebAPI - Es wurde keine Aktion gefunden

ich eine benutzerdefinierte Route in meinem WebApiConfig haben:

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

Meine ASP.NET WebAPI Controller:

[HttpPost] 
public void UpdateToken(string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

zu meiner ASP.NET WebAPI Abfrage ich RestSharp bin mit.

private static void Send(string resource, Method method, object payload) 
{ 
    var client = new RestClient(baseUrl); 
    var request = new RestRequest(resource, method); 
    request.XmlSerializer = new JsonSerializer(); 
    request.RequestFormat = DataFormat.Json; 
    request.AddBody(payload); 

    var response = client.Execute(request); 
    // ... handling response (exceptions, errors, ...) 
} 

public void Foo() 
{ 
    var newToken = "1234567890"; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

public void Bar() 
{ 
    var newToken = new { newToken = "1234567890" }; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

Der einzige Weg, diesen Fehler zu vermeiden, ist eine Wrapper-Klasse mit einer Eigenschaft zu schaffen (get; set;) darin der den Namen des Controllers Arguments (newToken) hat.

Ich habe eine Menge Anfragen, die eine oder zwei benutzerdefinierte Zeichenfolgen (undefinierte Länge) als Post sendet (get ist in der Länge begrenzt). Aber für jedes Szenario eine Wrapper-Implementierung zu erstellen, ist ein echter Overhead! Ich suche nach einem anderen Weg zu gehen.

PS: Ich hoffe, ich habe keine Fehler gemacht durch das Szenario zu vereinfachen =)

Antwort

12

Primitives sind standardmäßig aus dem URI gebunden. Wenn Sie ein primitiver kommen aus dem Körper wollen, sollten Sie die Verwendung [FromBody] Attribut wie folgt aus:

[HttpPost] 
public void UpdateToken([FromBody] string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

Der String wird dann mit dem entsprechenden Formatter deserialisiert werden. Wenn es JSON ist, sollte der Anfragetext wie folgt aussehen:

"1234567890" 
+0

Vielen Dank, nur das fehlende [FromBody] -Attribute war der Fehler. – dannyyy

+0

Das hat gerade meine Nacht gerettet. Ich hämmerte mir den Kopf und fragte mich, warum diese eine bestimmte Route eine 404 bekam. Es braucht eine int, wo der Rest meiner Routen einen Referenztyp hat. Das Hinzufügen des [FromBody] -Attributs hat den Trick gemacht. – squillman

+0

1 für die Rettung meines halben Tages meines Lebens, die Hälfte bereits verschwendet, danke –

Verwandte Themen