2013-06-11 14 views
12

Nie mogę do końca życia zrozumieć to. Mam kontrolera web api z metodami Get and Post. Metoda Get działa dobrze z parametrami i bez nich, ale post łamie się, gdy próbuję dodać do niego parametr String. Poniżej znajduje się mój kod.Metoda ASP.NET WebApi Post - 404 Podczas przekazywania parametrów

Trasa:

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

Kontroler:

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

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

Zapytanie:

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

Próbowałem wiele wariacji na życzenie, czuję się jak coś jest proste, jestem brakujący. Dzięki za pomoc.

+1

Twoja trasa mówi, że ma parametr o nazwie "id", ale w twojej metodzie przekazujesz parametr o nazwie 'test'. Co to będzie? Również prymitywne parametry są zawsze próbowane do odczytu z Uri, więc twoja metoda postu nie zadziała. Naprawdę sugeruję, aby przejrzeć wszystkie bardzo ładne samouczki ASP.Net Web API na stronie głównej asp.net! – JustAnotherUserYouMayKnow

+0

jest to^^ dokładne? – Jonesopolis

+0

Tak, jest. Twoja metoda Get reprezentuje trasę bez parametru {id} - ponieważ Twój parametr id nie występuje w metodzie. Twój parametr testowy jest jednym z opcjonalnych parametrów zapytania, gdy wywołasz 'Audit? Test = value', ale nie w" Audit/value ". Odpowiedź, którą zaakceptowałeś, podsumowała to dobrze, ale nadal zachęcam cię do prawdziwej pracy z samouczkami! – JustAnotherUserYouMayKnow

Odpowiedz

21

Ponieważ oczekuje się, że parametr test pochodzi z treści żądania, należy go udekorować atrybutem FromBody. Przykład: ([FromBody]String test). Nie dotyczy to innych typów złożonych, na przykład: Employee, która jest domyślnie uważana za pochodzącą z Ciała.

Reagowanie na żądanie GET. Należy pracować tylko z testów pochodzących z łańcucha zapytania /Audit?test=Mike

Po poście ma więcej szczegółów na temat parametru wiązania: http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

Ponadto widzę, że używasz WebRequest. Czy rozważałeś zamiast tego użycie HttpClient z System.Net.Http?

+0

Dodałem atrybut FromBody, który dotrze teraz do usługi, ale zmienna "testowa" w metodzie post jest niestety nieważna. Przyjrzę się również HttpClient. – Jonesopolis

+0

spróbuj wysłać tylko '= TEST' w swoim ciele. –

+0

fantastyczne, że to zrobiło! Dziękuję za twój wgląd – Jonesopolis

Powiązane problemy