2009-12-05 3 views
4

문제는 오류 간다

난에 (AN ASMX 웹 서비스 파일을 통해 아약스 요청을 보낼 jQuery 코드가있는 aspx 페이지가 같은 웹 사이트). 되돌아 오는 응답은 일관성이 없지만 "성공"콜백과 반대되는 "오류"jQuery 콜백을 지속적으로 발생시킵니다. 상태 코드는 200, 12030 및 12031 사이에서 일관성이 없습니다. 콜백에 대한 메시지의 responseText은 [비어 있음]과 json webservice가 반환하는 실제 XML 사이에 일관성이 없습니다. 코드를 디버깅했고 webservice는 예외없이 실제로 실행됩니다.

ASPX 코드 코드 간결함을 위해 생략 //

<script type="text/javascript"> 
jQuery(document).ready(function() 
{ 
    jQuery.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "CallDequeue.asmx/Dequeue", 
    data: "{}", 
    dataType: "json", 
    success: function(Msg) 
    { 
     alert('success:' + Msg.responseText); 
    }, 
    error: function(Msg) 
    { 
     alert('failed:' + Msg.status + ':' + Msg.responseText); 
    } 
    }); 
}); 
</script> 

코드는 간결 ommitted //

웹 서비스 코드

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class CallDequeue : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string Dequeue() 
    { 
    return "{\"d\":{\"FirstName\":\"Keivan\"}}"; 
    } 
} 

답변

4

서비스를 ScriptService로 표시하면 JSON 직렬화가 자동으로 처리됩니다. 응답을 수동으로 직렬화하면 안됩니다.

반환을 "FirstName"으로 되돌리려면 DTO 클래스를 사용하여 구문을 제어 할 수 있습니다. 그냥 문자열을 반환하면 { 'd': 'Keivan'} 대신 { 'd': 'Keivan'} 대신 '{'d ': {'FirstName ': 호출 구문

[ScriptService] 
public class CallDequeue : System.Web.Services.WebService 
{ 
    public class PersonDTO 
    { 
    public string FirstName; 
    } 

    [WebMethod] 
    public PersonDTO Dequeue() 
    { 
    var p = new PersonDTO(); 

    p.FirstName = "Keivan"; 

    return p; 
    } 
} 

몇 가지 변화 : 당신이 관심이 있다면

jQuery(document).ready(function() { 
    jQuery.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "CallDequeue.asmx/Dequeue", 
    data: "{}", 
    dataType: "json", 
    success: function(Msg) { 
     // Unless you're using 2.0, the data comes back wrapped 
     // in a .d object. 
     // 
     // This would just be Msg.d if you return a string instead 
     // of the DTO. 
     alert('success:' + Msg.d.FirstName); 
    }, 
    error: function(Msg) { 
     alert('failed:' + Msg.status + ':' + Msg.responseText); 
    } 
    }); 
}); 

당신은 more about ASP.NET AJAX's .d wrapper here 읽을 수 있습니다.

업데이트 :

ASP.NET 2.0을 사용하여, 당신은 the ASP.NET AJAX Extensions v1.0를 설치해야합니다. 또한 make sure your web.config is configured for ASP.NET AJAX (가장 구체적으로 HttpHandlers 섹션).

+0

"Keivan"을 반환하기 위해 웹 서비스 코드를 변경했습니다. 응답이 JSON 대신 XML로 반환되기 때문에 callback이 여전히 호출됩니다. 이것은 .net 2.0 웹 사이트입니다. 문자열을 반환 할 때 순수한 JSON을 반환하도록하려면 어떻게해야합니까? –

+0

2.0에서 작동하는 JSON 직렬화를 얻는 데 필요한 몇 가지 단계로 대답을 업데이트했습니다. –

0

당신은 그것이 json이라고 말하지만 xml을 반환합니다. 나는 거기에서 약간의 분리를 본다.

+1

웹 서비스에서 "ScriptService"속성을 설정하면 응답은 기본적으로 각 ScriptMethod의 Response.Json으로 자동 설정됩니다. 응답은 JSON이 XML로 래핑 될 때 반환됩니다 (일반적으로 반환하는 비누 XML 메시지가 아닙니다). 이 질문에 대한 대답이 있습니까? –

+0

여기에서 문제는 jquery에 응답이 JSON 형식으로 표시되지만 실제로는 XML (JSON과 함께 CDATA가 포함 된 요소) 인 경우 jquery에 거짓말을하고 혼란스럽게하는 것입니다. JSON이라고 할 때 전체 응답 본문은 JSON으로 간주됩니다. 아약스 요청이 실제로 XML을 반환한다고 가정한다면 (적절한 경우) 적절한 매개 변수 (s/json/xml /)를 사용하여 JSON 데이터를 직접 평가해야합니다. –

+0

그렇다면 웹 서비스가 XML로 래핑되지 않고 JSON을 반환하도록하려면 어떻게해야합니까? 이것은 ASP.NET 2.0에 있습니다 –

2

This 질문이 도움이 될 것입니다.

그렇지 않으면이 웹 서비스를 페이지 메서드로 변환했으며 즉시 작동했습니다. 그 옵션이 있습니까?

CS :

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    [WebMethod] 
    public static string Dequeue() 
    { 
     return "{\"d\":{\"FirstName\":\"Keivan\"}}"; 
    } 
} 

ASPX :

<script type="text/javascript"> 
    jQuery(document).ready(function() 
    { 
      jQuery.ajax({ 
      type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "test.aspx/Dequeue", 
       data: "{}", 
       dataType: "json", 
       success: function(Msg) 
       { 
        alert('success:' + Msg.responseText); 
       }, 
       error: function(Msg) 
       { 
        alert('failed:' + Msg.status + ':' + Msg.responseText); 
       } 
      });  
    }); 

확인 this 및 자세한 내용은 밖으로 다른 Encosia 기사.

0

이렇게 간단한 대답입니다. 내 웹.config는 ajax를 사용할 수 없으므로 (모든 webservice가 scriptservice 인 것과 상관없이) 모든 호출은 pure json 대신 XML을 반환합니다. 마찬가지로

[ScriptMethod]와 웹 방법을 표시

+0

답변을 추가하는 대신 질문을 업데이트하십시오. –

+0

안녕하십니까 나는 거의 일년이 지난 후에이 글을 계속하기 위해 여기에 왔습니다. 또한 $ .ajax() 내에서 웹 서비스를 호출 할 때 오류가 발생하는 것과 동일한 문제가 발생합니다. AJX를 사용하도록 수정해야하는 web.config 파일을 명확히하기 위해. 웹 서비스 web.config 또는 사이트입니까? 내 시나리오에서 내 사이트는 asp.net 사이트가 아닙니다. 이것은 사용자 creddentials의 유효성을 검사하는 양식이며 web.config 파일이 첨부되어 있지 않습니다. 그래서 내가 수정할 수있는 파일. 미리 감사드립니다. – alienavatar

0

시도 : 여기있는 모든 조치에

[WebMethod] 
[ScriptMethod] 
0

감사를드립니다. ScriptMethod이 필요할 때

방법의 앞에 이러한 특성을 추가해야합니다은

[WebMethod] 
[ScriptMethod] 

확실하지

를 사용한다?

흥미롭게도 그는 다운로드 코드에 [Script Service][WebMethod]을 갖고 있지 않았습니다.

어쨌든 위의 변경 후에 aJax 500 12030 12031 오류가 사라졌습니다.