C # HttpClient PostAsync zamienia 204 na 404
Biorąc pod uwagę tę usługę WebApi:
[ActionName("KillPerson")]
[HttpPost]
public void KillPerson([FromBody] long id)
{
// Kill
}
I to połączenie HttpClient PostAsync:
var httpClient = new HttpClient { BaseAddress = new Uri(ClientConfiguration.ApiUrl) };
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
};
var serializedParameter = JsonConvert.SerializeObject(parameter, serializerSettings);
var httpContent = new StringContent(serializedParameter, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(serviceUrl, httpContent).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
Spodziewałbym się odpowiedzi.EnsureSuccessStatusCode (); aby odnieść sukces, ale zamiast tego rzuca 404. Zabawną rzeczą jest to, że skrzypek mówi medowi, że usługa webapi powraca zgodnie z oczekiwaniami 204, a kiedy go debuguję, KillPerson działa bez problemu.
Aktualizacja: Ustaliłem, że dzieje się to tylko wtedy, gdy kod klienta znajduje się w projekcie PCL lub Silverlight 5. Dokładnie ten sam kod da oczekiwany 204, jeśli powielę go w aplikacji formularzy Windows. Jeśli wskażę aplikację Windows Forms na kod klienta zawarty w PCL, otrzymasz 404 Again.
Aktualizacja 2: rozwiązuje problem (choć nie przeszkadza mi to, że powinienem to zrobić):
[ActionName("KillPerson")]
[HttpPost]
public HttpResponseMessage KillPerson([FromBody] long id)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
Powoduje to ponowne wprowadzenie 404 (skrzypek nadal mówi, że 204 i klient nie działający w srebrze działa poprawnie)
[ActionName("KillPerson")]
[HttpPost]
public HttpResponseMessage KillPerson([FromBody] long id)
{
return this.Request.CreateResponse(HttpStatusCode.NoContent);
}
Aktualizacja 3 (rozwiązana): W końcu się zorientowaliśmy. Wygląda na to, że masz możliwość korzystania z przeglądarki HTTP lub obsługi klienta w Silverlight. Podczas korzystania z przeglądarki HTTP obsługa wielu rzeczy nie jest obsługiwana - w tym różne kody odpowiedzi i nagłówki. Naprawiono to, dodając te linie przed wywołaniem HttpClient:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);