WCF REST 메서드에서 사용자 지정 HTTP 상태 코드를 반환하려면 어떻게해야합니까?


88

요청 된 리소스를 찾을 수없는 등 WCF REST 호출에서 문제가 발생한 경우 OperationContract 메서드에서 HTTP 응답 코드 (예 : HTTP 404와 같은 것으로 설정)를 어떻게 사용할 수 있습니까?


이 모든 대답은 제어가 서비스 구현에 적용되었다고 가정합니다. 완전히 유효하지 않은 URI를 통과하면 어떨까요? 서비스에 대한 모든 예상치 못한 히트에 대해 404를 어떻게 제공한다고 가정합니까?
Nathan Tregillus

답변:


111

거기이다 WebOperationContext당신이 액세스 할 수는 그리고 그것은이 OutgoingResponse유형의 특성 OutgoingWebResponseContextStatusCode설정할 수있는 속성을.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

5
WCF Data Services-Service Operations 내에서 작동합니까? 나는 운이 없었고, 내가 설정 한 StatusCode가 다른 것에 의해 엉망이 된 것 같습니다. 따라서 모든 HTTP POST 요청에서 201 등으로 설정했는지 여부에 관계없이 204를 반환합니다.
RyBolt 2010

1
제 경우에는 작동하지 않고 상태를 덮어 씁니다. WebFaultException그러나 던지는 것은 작동하는 것 같습니다.
Josh M.

73

이유 본문을 반환해야하는 경우 WebFaultException을 살펴보십시오.

예를 들면

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

4
우리는 정적의 WebOperationContext.Current를 사용하지 않는 때문에 허용 된 것보다이 더 좋아 I
노엘 아브라함

이 famework 4 이후에만 유효 명심 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

흠, .NET 4.5.1에서 이것은 나를 위해 상태 코드를 설정하지 않습니다. 나는 여전히 200을 받고 있습니다. 저는 jsonp를 사용하고 있습니다. 그것은 내 콜백 (자바 스크립트로)을 호출하고 내 메시지와 상태 코드를 정수.
Shavais 2014 년

4
이것은 2XX 코드 아무것도 외부에 좋은 것 같다,하지만 당신은이 던질 것 WebFaultException을 반환 HttpStatusCode.Created?
분쇄

23

404의 경우 WebOperationContext.Current.OutgoingResponse에 SetStatusAsNotFound (string message) 라는 기본 제공 메서드 가있어 상태 코드를 404로 설정하고 한 번의 호출로 상태 설명을 설정합니다.

도있다 참고 (열린 위치) SetStatusAsCreated 한 통화와 201 상태 코드 및 위치 헤더를 설정한다.


수락 된 답변에 표시된 방법보다 선호됩니까?
분쇄

2

헤더에서 상태 설명을보고 싶다면 REST 메소드는 아래와 같이 Catch () 섹션에서 null을 반환해야합니다.

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
이것은 나에게도 효과가 없었습니다. 나는 여전히 200을 얻습니다. 나는 crossDomainScriptAccessEnabled = "true"와 함께 WebHttpBinding을 사용하고 기본 본문 스타일이 래핑되고 기본 나가는 응답 형식이 json .. 인 webHttp의 끝점 동작을 사용하고 있습니다. 하지만 그게 중요하지 않습니까?
Shavais 2014 년



0

이것은 WCF 데이터 서비스에서 작동하지 않았습니다. 대신 데이터 서비스의 경우 DataServiceException을 사용할 수 있습니다. 다음 게시물이 유용하다는 것을 알았습니다. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


그것은 나에게도 효과가 없습니다. 다른 유용한 정보도없고 응답 본문도없는 400 개의 잘못된 요청을받습니다.
Shavais 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.