2010-11-25 4 views
8

WebRequest을 사용하는 Silverlight (v3) 응용 프로그램에서 Silverlight 응용 프로그램과 동일한 웹 사이트의 웹 페이지에 HTTP POST 요청을합니다. 이 HTTP 요청은 같은 웹 사이트의 다른 페이지로 302 (리다이렉트)를 되 찾으며, HttpWebRequest은 자동으로 (according to the documentation)를 따라야합니다.HttpWebRequest는 Internet Explorer에서만 302에 대해 404를 반환합니다.

요청을 만드는 코드에 대한 특히 특별한 것이 (이 대체 붙박이 실버 HTTP 스택을 사용하도록 구성되지 않은 브라우저의 HTTP 스택을 사용) 없습니다 :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("{0}?name={1}&size={2}", _UploadUrl, Uri.EscapeUriString(Name), TotalBytes)); 
request.Method = "POST"; 

이 파이어 폭스에서 잘 작동 모두 및 크롬; Silverlight는 POST HTTP 요청을 만들고 302 응답을 받고 지정된 리디렉션 URL에 대한 GET HTTP 요청을 자동으로 수행하여 나에게 반환합니다. HTTP 요청이 계속 진행되는 것을보기 위해 Fiddler를 사용했기 때문에이 사실을 알았습니다. 그러나 Internet Explorer (v8)에서 Silverlight는 POST HTTP 요청을 수행 한 다음 404 오류 코드와 함께 WebException을 throw합니다!

피들러를 사용하여 Silverlight/Internet Explorer가 요청에 대한 302 상태 코드를 성공적으로 반환했으며 Silverlight에서 얻은 404 상태 코드 (및 관련 WebException)가 내가 브라우저 스택을 통해 수행되는 HTTP 요청은 제한으로 인해 200 또는 404 만 반환 할 수 있음을 알 수 있습니다. 진짜 질문은 입니다. Internet Explorer가 다른 브라우저와 마찬가지로 리디렉션을 따르지 않는 이유는 무엇입니까?

미리 도움을 청하십시오!

EDIT : Silverlight 클라이언트 HTTP 스택을 사용하지 않는 것이 좋습니다. 브라우저의 세션에 쿠키가 포함되어 있지 않은 것으로 알고 있기 때문에 ASP.NET 인증 쿠키가 포함되어 있습니다. Silverlight 컨트롤에 의한 HTTP 요청에 첨부해야합니다.

EDIT 2 : 나는 POST 요청을 할 때만 Internet Explorer가이 동작을한다는 것을 발견했습니다. GET 요청이 성공적으로 리디렉션됩니다. 이것은 Post-Redirect-Get 스타일에서 얼마나 많은 웹 사이트가 현재 일을하고 있는지 고려하면 꽤 나쁜 행동처럼 보입니다.

도움이된다면이 이상한 동작을 나타내는 간단한 demo VS2008 solution을 만들었습니다. 여기에는 기본 ASP.NET MVC 1 프로젝트와 Silverlight 3 프로젝트가 포함되어 있습니다. 웹 사이트에서 SilverlightControlTestPage.html 페이지로 이동하여 문제의 실제 상황을 확인하십시오.

+0

리디렉션 된 URL은 POST 된 To와 Xap의 출처가 동일한 서버의 리소스를 가리 킵니다. – AnthonyWJones

+0

Chrome과 Firefox는 자격 증명을 다르게 처리 할 수 ​​있습니다. 신임 정보가 있습니까? 요청 된 URL이 익명 또는 인증 된 요청을 수락합니까? HTTP 코드에 대한 서버 액세스 로그를 확인 했습니까? – JoeBilly

+0

클라이언트 HTTP 처리 기능을 사용할 수 있습니까? 그렇게하면 모든 상태 코드에 액세스 할 수 있습니다. http://msdn.microsoft.com/en-us/library/cc838250(v=VS.95).aspx – feroze

답변

0

저는 이것이 Internet Explorer 7의 기능 변경으로 예상되는 200 응답을 302로 변경하여 IE가 리다이렉트되도록 지시한다고 생각합니다. 내가 아는이 문제에 대한 매끄러운 해결책이 없습니다. 유사한 질문은 뒤로 here으로 제기되었습니다.

Change in behavior with Internet Explorer 7 and later in regard to CONNECT requests

+0

내 문제가 이것과 관련이 있다고 생각하지 않습니다. 링크 된 블로그 게시물은 해당 동작이 CONNECT 요청 (즉, HTTPS)에 대한 것으로, 이는 내가하지 않을 것이라고 말합니다. 내 요청은 모두 정상적인 HTTP로 완료됩니다. –

3

IE (이것은 사용자의 확인없이 그렇게하지 않아야하지만)는 POST를 전송해야 POST하는 302 사용자 에이전트 응답의 점에서, 본 명세서에 가까운 쪽이다.

반면에 FF와 Chrome은 사용자 에이전트가 상당 기간 전에 자주 잘못되었다는 (HTTP 초기에 문제가 시작된) 방법을 복사 할 때 의도적으로 잘못되었습니다.

이러한 이유로 HTTP/1.1에 307이 도입되어 동일한 HTTP 메소드가 사용되어야한다는 것을 분명히합니다.이 경우에는 POST 여야 함), 303은 항상 GET을 사용해야한다는 것을 의미합니다.

따라서 Response.Redirect을 수행하는 대신 302에서 다른 사용자 에이전트가 다른 방식으로 처리 할 303을 보내십시오. 다음 코드는이를 수행하며 (유효한 엔터티 본문을 포함하고 있습니다. 투기). Uri 또는 문자열을 사용하여 호출 할 수있는 과부하가 있습니다.

private void SeeOther(Uri uri) 
{ 
    if(!uri.IsAbsoluteUri) 
    uri = new Uri(Request.Url, uri); 
    Response.StatusCode = 303; 
    Response.AddHeader("Location", uri.AbsoluteUri); 
    Response.ContentType = "text/uri-list"; 
    Response.Write(uri.AbsoluteUri); 
    Context.ApplicationInstance.CompleteRequest(); 
} 
private void SeeOther(string relUri) 
{ 
    SeeOther(new Uri(Request.Url, relUri)); 
} 
+0

답변 해 주셔서 감사합니다. 위의 예제 코드에서 다른 것들과 마찬가지로 303으로 리디렉션을 변경하려고 시도했지만 Internet Explorer는 Silverlight 컨트롤의 요청에 관계없이 404를 계속 반환합니다. :((늦은 답신을위한 사과) –

관련 문제