2013-02-28 18 views
5

Mam następujący kod, ale końce żądania (Foo()/Bar()) zawsze w No action was found on the controller 'Device' that matches the request.ASP.NET WebAPI - Brak działania stwierdzono

mam niestandardową trasę w moim WebApiConfig:

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

My WebAPI kontroler ASP.NET:

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

Aby zapytać mojego ASP.NET WebAPI Używam RestSharp.

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); 
} 

Jedynym sposobem, aby uniknąć tego błędu jest stworzenie klasy otoki z nieruchomości (get; set;), w którym ma ona nazwę argumentu kontrolera (newToken).

Mam wiele żądań, które wysyłają jeden lub dwa niestandardowe ciągi (nieokreśloną długość) jako post (otrzymanie ma ograniczoną długość). Ale aby utworzyć dla każdego scenariusza, implementacja opakowania jest prawdziwa! Szukam innej drogi.

PS: Mam nadzieję, że nie popełniłem żadnych błędów poprzez uproszczenie scenariusz =)

Odpowiedz

12

prymitywów domyślnie związana z URI. Jeśli chcesz prymitywne pochodzić z organizmu, należy użyć [FromBody] atrybut tak:

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

Łańcuch zostanie rozszeregować użyciu odpowiedniego formatowania. Jeśli to JSON, treść żądania powinna wyglądać następująco:

"1234567890" 
+0

Dziękuję, tylko brakująca [FromBody] -Attribute była winą. – dannyyy

+0

To właśnie uratowało moją noc. Zastanawiałem się, zastanawiając się, dlaczego ta jedna konkretna trasa otrzymywała numer 404. Ma int, gdzie reszta moich tras przyjmuje typ odniesienia. Dodanie atrybutu [FromBody] rozwiązało problem. – squillman

+0

1 za uratowanie mojego pół dnia mego życia, połowa już zmarnowana na to dzięki –

Powiązane problemy