2013-01-10 2 views
0

jQuery + Ajax를 사용하여 홈 메이드 vb.net 웹 서비스를 호출하려고하고 있습니다. 세부 사항에 어려움을 겪고 있습니다. 내가 XML을 반환하지만, 만약 내가 그들을 필요로하지 않습니다 말해 주시기 된 이후 나는 ScriptMethod 추가 한 웹 속성을 찾고 후jQuery + Ajax에서 .Net 웹 서비스 호출

<WebMethod()> <ScriptMethod(ResponseFormat:=ResponseFormat.Xml, UseHttpGet:=True)> _ 
Public Function GetAllVotes() As XmlDocument 

    Dim theVotes = getVotes() 
    Dim strResult As String = theVotes.XMLSerialize 


    Dim doc As XmlDocument = New XmlDocument() 
    doc.LoadXml(strResult) 
    Return doc 

End Function 

: 여기

는 웹 방법으로 노출 된 작은 함수의 그렇습니다. 나는 포스트를 사용하거나 얻을,이 코드의 많은 .. 많은 변화를 시도했습니다

function getVotes() { 
$.support.cors = true; 

$.ajax({ 
    type: "GET", 
    contentType: "application/json", 
    url: "http://nhrd635:8008/votingmanager.asmx/GetAllVotes", 
    data: {}, 
    dataType: "xml text jsonp", 
    success: function(msg) { 
     // Hide the fake progress indicator graphic. 
     // Insert the returned HTML into the <div>. 
     $('#myPlaceHolder').html(msg); 
    }, 
    error: function(msg) { 
     $('#myPlaceHolder').html(msg); 
     // alert(msg); 
    } 

}); 
} 

하거나하지 않고, 내용 유형을 변경 :

그런 다음, 클라이언트 측에서,이 코드는 charset = utf-8. 데이터에 큰 따옴표가 있거나없는 경우 : {}.

나는 나의 요청을 추적하기 위해 방화 광구를 사용합니다. jsonp에 dataType을 설정할 때만 결과를 얻을 수 있지만 모든 인스턴스에서 코드는 상태가 200 OK 일 때도 "오류"기능을 종료합니다. 하지만 jsonp로 설정하는 것은 잘못된 것이므로 실제 XML로 처리되는 XML을 얻게됩니다 ...

나는 encosia에있는 사람으로부터 매우 유용한 블로그 항목을 읽었습니다. (샘플 : http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/)

그러나 그의 예를 따르더라도 적절한 반환을 얻을 수 없습니다.

내가 뭔가 잘못하고있는 것이 분명합니다. 그것은 사실 json 직렬화 된 문자열 대신 xml 문자열을 반환하는 사실입니까?

답변

-1

여기 대부분의 문제는 원래의 요청 (동일한 컴퓨터의 다른 포트에서 요청을하더라도)이 원인 일 가능성이 높습니다. 그래서 JSONP로 전환했을 때 그 기능을 볼 수있었습니다. 아쉽게도 ASMX "ScriptServices"는 JSONP를 지원하지 않으므로 WebMethod가 반환 한 데이터는 jQuery가 삽입하는 JSONP 콜백 함수에 유효한 매개 변수가 아닙니다.

가능한 한 최선의 솔루션은 서비스를 호출하는 페이지와 동일한 도메인에서 실행되도록하는 것입니다. 교차 출처 문제에 대한 다양한 해결책이 있지만 그 중 어느 것도 요청을하는 페이지가 상주하는 동일한 도메인에 대한 간단한 XHR 요청만큼 광범위하게 호환/신뢰할 수 없습니다.

그렇게 할 수없는 경우 votingmanager.asmx를 처리하는 사이트에 대해 CORS 지원을 사용하는 것이 좋습니다. IE의 대부분의 버전에서는 작동하지 않지만 다른 브라우저에서는 교차 출처 요청을 허용합니다. 여기에서하는 방법에 대한 자세한 정보 : http://encosia.com/using-cors-to-access-asp-net-services-across-domains/

가능한 경우 추가 XML 직렬화 레이어를 피할 수 있습니다. getVotes()가 List와 같은 것을 반환하면이를 반환 유형으로 사용하고 ASP.NET이 컬렉션을 JSON으로 자동 직렬화하도록하고 jQuery가 자동으로이를 성공 처리기의 JavaScript 배열로 변환합니다. 여기에 대한 자세한 정보 : http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

+0

가 좋아, 그 말이, 불행하게도이 스크립트가있다 교차 도메인을 운영합니다. 간단한 설명으로, 좋은 관리자가 투표 기능을 사용하지 못하게하는 우리 사이트의 Sharepoint 2010 투표 기능을 다시 만들려고 시도하고 있습니다 ... 그래서 우리는 sharepoint 웹과 작동하는 WS를 만들어서 우리 자신을 만들 것이라고 생각했습니다. 서비스. 어쨌든 ... 나는 jsonp 데이터 유형을 사용할 때 언급 한 것처럼 방화 광이 응답을 봅니다. 비록 "오류"처리기에 빠졌더라도 오류 처리기에서 jquery의 응답을 읽는 것이 가능하고 어떻게 든 다시 캐스팅하는 방식으로 해킹되거나 다시 HTML로 변환됩니다. – Stephane

+0

@Stephane : 원격 서버를 제어하지 않으면 로컬 서버의 HttpHandler를 사용하여 동일한 출처 정책 (http://encosia.com/use)을 위반하지 않는 릴레이 역할을 수행 할 수 있습니다. -asp-nets-httphandler-to-bridge-the-cross-domain-gap/ –

+0

흥미 롭군요, 최근에 제가 부딪히는 모든 문제에 블로그에 블로그가있는 것 같습니다 ... 아약스 응답을 얻을 수 없다는 것을 깨닫고 jsonp 형식 일지라도 간단한 방법은 내 웹 서비스를 간단한 웹 요청으로 호출 할 수있는 일련의 작은 웹 페이지로 "변환"하는 것이었지만 추악하고 성가시다. 나는 당신의 HttpHandler 게시물에 대한 모든 것을 아직 이해하지 못하고 있지만 그것은 유망한 것으로 보인다. 도와 주셔서 감사합니다. 정말로 감사드립니다. – Stephane

0

Stack Overflow 및 Encosia의 Dave Ward의 도움을 더 많이 사용하면서 문제를 해결할 수있었습니다. 나는 미래의 누군가를 돕기 위해 나의 최종 해결책을 여기에 게시해야한다고 생각했다.

우선 웹 서비스는 좋지 않은 방법이었습니다. Dave Ward가 제안한 것처럼 원래 질문에 대한 답변으로 HttpHandler solution을 사용했습니다.

XML을 반환하는 것은 나도 잘 모르는 잘못된 선택이었습니다. JSon.net에 대한 참조를 프로젝트에 추가하고 내 객체를 Json 문자열로 변환하는 데 사용했습니다.

Dave's blog post에 나와있는 것처럼 json 문자열로 변환하기 위해 ".net only"를 사용하고 싶었지만 어떻게 든 Dave의 예와 같이 자동으로 Json으로 변환하는 방법을 배우는 데 어려움을 겪었습니다. Json.net와 함께하는 쉬운 방법을 꺼내서 내 HttpHandler를에,

그런 다음 "이 작업을 진행하게", 나는 응답 문자열에 유래에서이 게시물의 지시 사항을 따르했다 :

https://stackoverflow.com/a/3703221/1060133

을 내 경우 : 해당했다 :

context.Response.Write(String.Format("{0}({1});", context.Request("callback"), jsonVotes)) 

jquery 호출도 위 게시물의 지침을 사용했습니다.

재미있는 노트, 심지어 매개 변수가없는 전화에, 당신과 같이 빈 데이터를 보낼 수 있습니다

$.getJSON('http://url/httpHandler.ashx?callback=?', {}, 
      function(data) { 
      alert(data); 
      } 
); 

... 행운을 빕니다

+0

다행입니다. HttpHandler 솔루션을 그대로 사용했다면 JSON을 자동으로 서비스에서 제외시킬 수없는 이유는 HttpHandler가'GET'을 통해 요청하고'application/json' Content-Type을 추가하지 않았기 때문입니다. "ScriptServices"는 이러한 두 조건이 충족되지 않으면 JSON을 반환하지 않습니다. –