Jeśli coś pójdzie nie tak w wywołaniu REST WCF, na przykład nie można znaleźć żądanego zasobu, jak mogę grać z kodem odpowiedzi HTTP (na przykład ustawiając go na coś takiego jak HTTP 404) w mojej metodzie OperationContract?
Jeśli coś pójdzie nie tak w wywołaniu REST WCF, na przykład nie można znaleźć żądanego zasobu, jak mogę grać z kodem odpowiedzi HTTP (na przykład ustawiając go na coś takiego jak HTTP 404) w mojej metodzie OperationContract?
Odpowiedzi:
Jest to, do WebOperationContext
którego masz dostęp i ma OutgoingResponse
właściwość typu, OutgoingWebResponseContext
która ma StatusCode
właściwość, którą można ustawić.
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
WebFaultException
Jednak rzucanie wydaje się działać.
Jeśli chcesz zwrócić treść przyczyny, spójrz na WebFaultException
Na przykład
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
WebFaultException
aby zwrócić HttpStatusCode.Created
?
W przypadku 404 istnieje wbudowana metoda w WebOperationContext.Current.OutgoingResponse o nazwie SetStatusAsNotFound (komunikat tekstowy) , która ustawi kod stanu na 404 i opis stanu za pomocą jednego wywołania.
Zauważ, że istnieje również SetStatusAsCreated (lokalizacja Uri) , która ustawi kod stanu na 201 i nagłówek lokalizacji za pomocą jednego wywołania.
Jeśli chcesz zobaczyć opis statusu w nagłówku, metoda REST powinna zwrócić wartość null z sekcji Catch (), jak poniżej:
catch (ArgumentException ex)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
return null;
}
Można również zwrócić StatusCode i rozumu organizmowi WebOperationContext „s StatusCode i StatusDescription :
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
To nie zadziałało w przypadku usług danych WCF. Zamiast tego możesz użyć DataServiceException w przypadku usług danych. Znalazłem przydatny następujący post. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de