2009-05-18 3 views
10

ASP.NET MVC를 사용하여 REST API를 구현하고 있으며 요청에 대한 요청 헤더가 Expect: 100-continue 인 간단한 걸림돌이 있습니다. 게시물 몸체.ASP.NET MVC에서 "Expect : 100-continue"헤더 지원

Upon receiving a request which includes an Expect request-header field with the "100-continue" expectation, an origin server MUST either respond with 100 (Continue) status and continue to read from the input stream, or respond with a final status code. The origin server MUST NOT wait for the request body before sending the 100 (Continue) response. If it responds with a final status code, it MAY close the transport connection or it MAY continue to read and discard the rest of the request. It MUST NOT perform the requested method if it returns a final status code.

이것은 내가 즉이 즉시 HTTP 100 응답을 계속 보낼 필요, 요청에 응답을해야하고 읽는 계속처럼 나에게 소리 :

RFC 2616 상태에 있음 요청을 끝내지 않고 원본 요청 스트림 (즉, HttpContext.Request.InputStream)을 보내고 최종적으로 결과 상태 코드를 보냅니다 (인수로 인해 204 내용 없음 결과가 표시됨).

그래서, 질문이 있습니다 : 내가 사양 권리를 읽는

  1. 오전, 내가 요청에 두 응답을 할 필요가?
  2. 어떻게 ASP.NET MVC에서이 작업을 수행 할 수 있습니까?

w.r.t. (2)이 입력 스트림을 읽어 진행하기 전에 다음과 같은 코드를 사용하여 시도 ...

HttpContext.Response.StatusCode = 100; 
HttpContext.Response.Flush(); 
HttpContext.Response.Clear(); 

...하지만 최종 204 상태 코드를 설정하려고 할 때 오류 얻을 :

System.Web.HttpException: Server cannot set status after HTTP headers have been sent.

답변

2

100-continue는 IIS에서 처리해야합니다. 이것을 명시 적으로하고 싶은 이유가 있습니까?

+0

아니요 - 나는 그것을 피하고 싶습니다! IIS가 개입하지 않고도 IIS를 처리 할 수 ​​있다는 것을 깨닫지 못했습니다. –

+0

100 Continue로 'WebRequest'에 버그가 발생했습니다. 그것은 그것을 사용하지 않는 좋은 이유입니다. http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds

2

IIS없이이 두 반응이 아니다 말했다 (100)

처리합니다. HTTP에서 Expect : 100-Continue가 메시지 헤더의 일부로 들어 오면 클라이언트는 내용을 보내기 전에 응답을받을 때까지 기다려야합니다.

asp.net이 설계된 방식 때문에 출력 스트림을 거의 제어 할 수 없습니다. 스트림에 기록 된 모든 데이터는 플러시 할 때마다 버퍼링 된 모드인지 여부에 관계없이 청크 분할 인코딩으로 200 응답에 자동으로 저장됩니다.

슬프게도이 모든 것들은 장소의 내부 메소드에 숨겨져 있습니다. 결과는 MVC와 마찬가지로 asp.net에 의존하면 거의 무시할 수 없다는 것입니다.

버퍼링되지 않은 방식으로 입력 스트림에 액세스 할 때까지 기다려주십시오. 통증이 가득합니다.

은 셉은

15

기본적으로 .NET 프레임 워크는 항상 모든 HTTP 1.1에 대한 expect: 100-continue 헤더를 보냅니다. 이 문제는 프로그램 때문에 같은 System.Net.ServicePoint.Expect100Continue 속성을 통해 요청에 따라 제어 할 수 있습니다 :

HttpWebRequest httpReq = GetHttpWebRequestForPost(); 
httpReq.ServicePoint.Expect100Continue = false; 

또한 전 세계적으로 프로그래밍 방식으로 제어 할 수 있습니다 :

을 ...또는 전세계 구성을 통해 :

<system.net> 
    <settings> 
    <servicePointManager expect100Continue="false"/> 
    </settings> 
</system.net> 

이 정보를 당신에게 랜스 올슨과 Phil Haack 감사드립니다.

+0

어디에 System.Net.ServicePointManager.Expect100Continue = false를 추가해야합니까? 내 wp7 코드에서? – Apoorva

+1

WP7에 대한 프로그래밍을하지는 않았지만 코드가 App.xaml.cs, Application_Launching 또는 Application_Activated 이벤트 처리기에있을 가능성이 있습니다. –

+0

이것은 질문에 전혀 대답하지 않습니다 ... –