2010-02-09 9 views
0

나는 POST 요청을 기대하는 페이지가 있고 JSON을 반환한다. 본질적으로 그것은 .ashx 페이지입니다.하지만 그건 별 문제가되지 않습니다. jQuery를 사용하는 경우 ASP.net을 사용하여 JSON을 반환하는 페이지 호출하기 AJAX

, 나는 단순히 POST 요청을 다시 객체를 얻기 위해 데이터 형 "JSON"로 jQuery.Post을 사용합니다. 그러나 현재 프로젝트에서는 주로 ASP.net AJAX를 사용하며 jQuery를 추가하기를 원하지 않습니다.

ASP.net AJAX의 경우 "전통적인"웹 서비스를 호출하는 방법에 대한 정보 만 찾았습니다. 즉, ScriptManager에 asp : ServiceReference를 추가하고 끝에 "실제"웹 서비스가 있음을 의미합니다.

Page에 POST 호출을하는 더 간단한 방법이 있습니까? 나는 그것을 보내고() 수동 평가 원시 JSON을 받고 살 수 있지만 전체 ASMX 웹 서비스를 만들지 않으

답변

0

Sys.Net.WebServiceProxy 실제로 웹 서비스를 기대하는 것 같아서 도움이되지 않았습니다. Request.Form이 서버 측에서 비어 있었고 parametersDictionary가 무시되는 것 같습니다. 대신 다른 집행자를 연결하는 재정의 (override)가없는 것 같습니다.

는 지금 수동으로 Sys.Net.WebRequest를 작성하여 그것을 해결. 이 접근법은 훨씬 더 복잡하고 "베어 메탈 (bare-metal)"이지만 jQuery 소스가 필요 없다면 jQuery에 의존성을 추가하고 싶지 않기 때문에 jQuery 소스를 살펴볼 것이다.

var ApplicationFunctions = { 
    showDialog: function(someParam, someOtherParam) { 
     var sb = new Sys.StringBuilder("Do you really want to do '"); 
     sb.append(someParam); 
     sb.append("' ?"); 
     var msg = sb.toString(); 
     if (confirm(msg)) { 
      var myWebRequest = new Sys.Net.WebRequest(); 
      myWebRequest.set_url('SomeService.ashx'); 
      myWebRequest.set_httpVerb('POST'); 
      // Manually build POST body. This would need escaping/urlencoding 
      // I think if I couldn't guarantee that the parameters are 'clean' 
      var bodySb = new Sys.StringBuilder("postParam="); 
      bodySb.append(someParam); 
      bodySb.append("&anotherPostParam="); 
      bodySb.append(someOtherParam); 
      var body = bodySb.toString(); 
      myWebRequest.set_body(body); 
      myWebRequest.get_headers()["Content-Length"] = body.length; 
      // also check out usercontext to pass additional data into the completed function 
      // http://msdn.microsoft.com/en-us/library/bb397436.aspx 
      myWebRequest.add_completed(ApplicationFunctions.onCallCompleted); 
      myWebRequest.set_timeout(10 * 1000); // 10 seconds 
      myWebRequest.invoke(); 
     } 
    }, 
    onCallCompleted: function(response) { 
     if (response.get_timedOut()) { 
      alert("Timed Out!"); 
      return; 
     } 
     if (response.get_statusCode() !== 200) { 
      alert("Status Code not OK"); 
      return; 
     } 
     if (!response.get_responseAvailable()) { 
      alert("No data available?!"); 
      return; 
     } 
     // Better use a JSON parser 
     // http://www.json.org/js.html 
     var responseData = eval('(' + response.get_responseData() + ')'); 
     alert("Success: " + responseData.SomeField); 
    } 
} 
+0

또한 JSON 파서 인 Sys.Serialization.JavaScriptSerializer가 기본 제공됩니다. http://msdn.microsoft.com/en-us/library/bb384128.aspx –

2
계획 (SharePoint에 배포하기 것은 약간의 고통이며, 내 ASHX 처리기 잘 작동합니다)

Sys.Net.WebServiceProxy.invoke (url, methodName, useGet, parametersDictionary, onSuccess, onFailure, userContext, timeout);

첫 번째 매개 변수를 제외한 모든 매개 변수는 선택 사항입니다.

parametersDictionary은 같다 {foo는 : 막대} - 매개 변수가 당신이 게시 된 경우, 또는 쿼리 문자열에 매개 변수로는 (각 매개 변수를 GET 별도로 JSON 직렬화 된 경우 본문에 JSON으로 전송됩니다 - 어떤 BTW 문자열은 따옴표와 함께 "foo"처럼 보입니다.

는 onSuccess 경우, 첫번째 파라미터 (이미 역 직렬화 객체)로 데이터를 얻어 콜백.

onFailure 오류 메시지를받을 수있는 GET_MESSAGE() 메소드를 포함하는 첫 번째 매개 변수, 그리고 다른 것들과 같은 오류 개체를 가져옵니다.

+2

오는 MS AJAX 버전에 사용중인 따라 서비스가 'D'에 싸서 데이터를 반환해야 할 수도 있습니다. 예를 들어 서비스가 다음을 반환하는 경우 [1, 2, 3] { "d": [1, 2, 3]} 이것은 여기에 포함되지 않을 보안 조치입니다. MS AJAX 4 (베타)를 사용하는 경우에는이 기능이 필요하지 않습니다. 그러나 3.5에서 그렇게합니다. JavaScriptSerializer를 사용하여 JSON을 생성하는 경우 데이터를 Dictionary 에 배치하여 'd'를 가져올 수 있습니다. 여기서 'd'는 키이고 값은 객체입니다. – InfinitiesLoop

+0

고마워요.하지만 WebServiceProxy는 웹 서비스에 대해서만 작동하는 것으로 보이며, POST에서 물건을 읽는 단순한 페이지에 대해서는 작동하지 않습니다. parametersDictionary가 WebService 함수를 대신 기대하기 때문에 매개 변수를 전달할 수 없습니다. Request.Form이 비어 있습니다. –

+0

게시 본문에 매개 변수를 보내지 만 키/값 쌍으로는 보내지 않습니다. 글자 그대로 JSON입니다. 페이지에서 JSON이 아닌 기존 게시물을 원한다면 WebRequest를 직접 사용해야합니다. – InfinitiesLoop

1

당신은 직접 Sys.Net.WebServiceProxy 클래스의 invoke 방법을 사용할 수 있습니다.

메소드 서명은 다음과 같습니다

invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout); 

를 서비스가 실제로 JSON은 다음 succeededCallback에 대한 첫 번째 인수가 JSON 오브젝트해야 반환 가정.

+0

고마워요.하지만 WebServiceProxy는 웹 서비스에 대해서만 작동하는 것으로 보이며, POST에서 물건을 읽는 단순한 페이지에 대해서는 작동하지 않습니다. parametersDictionary가 WebService 함수를 대신 기대하기 때문에 매개 변수를 전달할 수 없습니다. Request.Form이 비어 있습니다. –

관련 문제