2010-03-11 2 views
1

먼저 코드 스 니펫을 여기에 입력 해 보겠습니다. Visual Studio에서 제공하는 ASP.NET MVC 프로젝트를 사용하고 있습니다. 그래서 난 그냥 여기에 추가 한 조각을 걸었습니다 :

Site.master의 머리 부분 : test.js의

<head runat="server"> 
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
    <script src="../../Scripts/test.js" type="text/javascript"></script> 
    <script type="text/javascript">$(document).ready(ready);</script> 
</head> 

내용 : HomeController에서

function ready(){ 
$.get("/Home/TestAjax", ajaxResponse); 
} 

function ajaxResponse(data){ 
    alert("got response from server: " + data); 
} 

방법 :

 public String TestAjax() 
     { 
      if (Request.IsAjaxRequest()) 
      { 
       return "Got ajax request!"; 
      } 
      else 
      { 
       return "Non-ajax request"; 
      } 
     } 

Firefox 3.5.30729 (Firebug)에서 볼 수있는 문제는 ajax 요청이 나가면 IIS 7 e 원격 상자는 HTTP 302를 다시 보내고, 리디렉션을 수행하고 다른 요청을 강제 실행하지만 비동기는 아닙니다. 오페라도 작동하지 않으므로 같은 문제라고 생각합니다. 그러나 위의 코드는 Internet Explorer 8, Chrome 및 Safari에서 정상적으로 작동합니다.

localhost에서 위의 모든 브라우저는 Firefox와 Opera를 포함하여 예상대로 작동합니다. 모두 "아약스 요청을 받았습니다!" 서버에서 응답으로.

아무도 여기에 무슨 일이 일어나고 있고 어떻게 해결할 수 있는지 아이디어가 있습니까? 나는 무슨 일이 일어나고 있고 왜 있는지에 관해서는 진짜 해결책이나 최소한의 설명을 찾고있다.

+0

Fiddler/Wireshark를 사용하여 요청/응답에 대한 더 나은 가시성을 얻으려고 했습니까? – Pierreten

+0

@ 피에르 텐 (Pierreten) : 우리가 말한대로 나는 그것을 어지럽히고 있습니다. 새로운 발견 사항이 있으면 여기에 게시하겠습니다. – codelove

답변

1

따라서 Fiddler와 함께 놀면이 문제를 파악하는 데 도움이됩니다. 여기에 무슨 일이 있었는지 :

$ .get 호출의 URI가 서버에 302가 반환되었다는 질문에 표시된 동작 메서드를 찾지 못하게 만들었습니다. 일단 Firefox (및 Opera)에 302 서버에서 "/ Home/TestAjax /"(끝에 슬래시가 붙은)를 사용하여 시도했습니다. 그러나 이번에는 HTTP 헤더에 X-Request-With가 "XMLHttpRequest"로 설정되지 않았습니다. 그래서 TestAjax() 액션 메소드 Request.IsAjaxRequest()이 거짓이었습니다. 따라서 응답으로 "Non-ajax request"를 받았습니다.

반면에 IE, Safari 및 Chrome이 작동하는 이유는 리디렉션 된 요청에서 여전히 X-Request-With가 "XMLHttpRequest"로 설정 되었기 때문입니다. 파이어 폭스와 오페라가 왜 그렇게하지 않았는지는 나에게는 여전히 수수께끼이지만, 지금은 걱정하지 않을 것이다.

끝내주는 슬래시를 간과하는 것은 어리 석었지만 나는 그 중요성을 알지 못했습니다!

0

조치 방법의 승인 된 설계는 ActionResult을 반환하는 것입니다. 귀하의 경우 문자열을 반환합니다. 대신 다음을 시도하십시오.

public ActionResult TestAjax() 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     return Content("Got ajax request!", "text/plain"); 
    } 
    return View(); 
} 
+0

내 질문과 제안 사이에 아무런 관련이 보이지 않지만 완전히 관련이 없습니다. ActionResult는 ASP.NET MVC의 기능을 활용하여 마크 업을 생성하는 래퍼입니다. 그러나 IMO에서는 수동으로 생성 한 JSON 블록 또는 XHTML 등을 나타내는 문자열을 반환하는 것이 좋습니다. – codelove

+0

아니 괜찮아. 틀린 디자인이고 jQuery에 모호한 올바른 내용 유형을 설정하지 않습니다. –

관련 문제