2009-05-05 3 views
1

.NET 3.5에 Custom 404 CMS 시스템을 구축했으며 게시하는 데이터가 IIS 5.1 및 6.0에서 로컬로 작동하지만 프로덕션 IIS 6.0 서버에서는 작동하지 않습니다. IIS 6.0 사이트 설정 항목을 항목별로 비교 한 결과 거의 차이가 없었습니다.IIS 6.0의 Custom 404 페이지에서 제출할 때 POST 데이터가 손실되는 이유는 무엇입니까?

양식이 "http://domain/folder/folder/page.resource"(코드는 SVN 인 경우)으로 POST 중이며 제출할 때 리다이렉트가 발생하지 않음을 확인했습니다. (예외를 던져서 확인했습니다). 서버 별 디버그 정보 :

IIS 5.1 (my computer, works): 
ServerVariables["REQUEST_METHOD"]="POST" 
Request.TotalBytes = 1600 
Request.QueryString.Count = 1 (NOTE: contains "404;http://domain:80/folder/folder/page.resource" in each case) 
Request.Form.Count = 109 

IIS 6.0 (test server, works): 
ServerVariables["REQUEST_METHOD"]="GET" (NOTE: IIS 6.0 reads this as "GET" instead of "POST") 
Request.TotalBytes = 1600 
Request.QueryString.Count = 1 
Request.Form.Count = 109 

IIS 6.0 (production server, does not work): 
ServerVariables["REQUEST_METHOD"]="GET" 
Request.TotalBytes = 0 (NOTE: should be ~1600) 
Request.QueryString.Count = 1 
Request.Form.Count = 0 (NOTE: should be 109) 

아무도 아이디어가 있습니까? 404 페이지에서 IIS 7.0에서 제출되지 않은 POST 데이터에 대해서는 읽었지만 6.0에서는 그렇지 않습니다. 내 양식이 형식에 :

은 IIS 5.1의
<form id="GolfRegistration" name="GolfRegistration" method="POST" action="/folder/folder/page.resource" onSubmit="return CalculateAmount();"> 
<input type="button" value="Submit" onClick="if(ValidateInput()){submit(GolfRegistration);}"> 
</form> 

만, 내가 설정 "IIS> 웹 사이트> 속성> 홈 디렉터리 탭> 설정 버튼> 추가"에서 .resource 확장 GET, HEAD와 함께 작업하고, 게시하다. 이로 인해 제출시 405 오류가 발생하지 않습니다.

편집 : POST를 GET으로 변경했으며 3 가지 경우 모두 올바르게 데이터를 제출 했으므로 형식 문제가 아닙니다. 불행히도 나는 쿼리 문자열에 변수 (109 개가 있음)를 전달할 수 없다.

+0

"c"태그가 필요한 이유는 무엇입니까? – BobbyShaftoe

답변

1

일시적으로 양식 방법을 GET으로 변경해보십시오. 이것은 어떤 데이터가 전송되고 어떤 데이터가 전송되는지 알려줄 것입니다.

전에 비슷한 문제가 발생했으며 데이터를 전송할 때보다는 전송되는 콘텐츠를 생성하는 스크립트에 문제가 발생했습니다.

+0

GET으로 변경했으며 3 가지 인스턴스 모두에서 쿼리 문자열에 데이터를 보냅니다. – user101567

2

나는 같은 문제가 있었지만 유감스럽게도 "이것은 기능"이라고 대답했습니다.

자세히 알아보기 : 좋아, 문제 설명 링크를 게시하려했지만 '새 사용자는 링크를 게시 할 수 없습니다.'라고 말합니다. 그래서 대신 내가 할 수있는 최선의 방법은 다음과 같습니다. "IIS 6 : 404/405 사용자 정의 오류 처리기에 누락 된 양식 POST 데이터"에 대한 Google 검색 수행 (따옴표 안에 있는지 확인하십시오), 적어도 필자가 작성한 시점에 , 최고의 결과는 내가 언급 한 페이지 여야합니다. 요약

, 무슨 일이 일어나고 것은 :

1) 존재하지 않는 URL (예를 들어, mydomain.com/somepage) 2) IIS가 요청을 수신, 메모 somepage 아무튼에 POST'd한다 존재하지 않는 경우 오류 처리기에 대한 두 번째 요청을 발생시키고 그 요청에 대한 메서드는 내부적으로 GET입니다. 그리고 POST 데이터는 전달되지 않습니다.

그 이유는 당신이 인 이유입니다.은 모두 IIS 6에서 성공을 거두었습니다. 저에게는 당혹 스럽습니다.

어쨌든 위의 링크를 더 읽으십시오.

덧붙여 말하면, 저는 IIS 6/Windows2003에서 PHP를 실행 중이며 흥미로운 해결 방법을 발견했습니다. PHP는 IIS에서 POST 변수를받지 못하지만 PHP는 원래 입력 스트림 인 "php : // input"에 액세스 할 수 있습니다. 원래 요청 본문을 읽을 수 있습니다. 여기에는 원시 형식의 POST 변수가 포함됩니다. PHP의 parse_str() 함수를 사용하여 원시 문자열에서 POST 변수를 가져올 수있었습니다.

그래서 은 ASP.NET에서 비슷한 작업을 수행 할 수 있습니다. Request.InputStream을 검사 해 보셨습니까? 내 기억이 올바르게 나를 돕는다면, 그것은 당신에게 당신이 읽을 수있는 스트림을 줄 것입니다. 어쩌면 그것은 원시 POST 데이터를 가질 것인가?

-Josh

관련 문제