2009-09-26 1 views
4

[참고 : 여기서 좋은 디버깅 기술을 찾고 있습니다. 아마도 내가 모르는 것을 단순화하는 몇 가지 트릭이나 방법]ASP.Net에서 더 나은 오류 메시지 받기 [WebMethod] JQuery에서 호출되었습니다.

herehere과 같이 JQuery의 ASPX 페이지에 정의 된 [WebMethods]를 호출하는 기술을 사용하고 있습니다. 그것은 점점 더 보편적 인 방법으로 보인다.

저는 잠시 동안 사용 해왔고, 일반적으로 잘 작동합니다. 그러나 그것을 개발하는 동안 꽤 허약합니다. 매개 변수가 올바르지 않으면 실제로 모호하고 특이하지 않은 오류 메시지가 표시됩니다.

[WebMethod] 
public static string SaveComplexRecord(int recID, GeneralData general, SomeObject data, SomeOtherObject moreData) 
{ 
    //do a bunch of stuff with that data 
} 

그리고 GeneralData, SomeObject의, 그리고 SomeOtherObject 모든 매개 변수의 다양한 유형의 혼합이 매우이다 : 나는 상당히 복잡한 웹 방법이있는 경우로 예를 들어, 정의 (문자열의 int, bools, 날짜 시간을.) 특히 초기 개발 중에 클라이언트 측에 JSON을 잘못 빌드 할 가능성이 있습니다. 아마도 나는이 작업을 수행합니다 세 번째 매개 변수의 이름, moredata moreData하지 않기 때문에 오류가 발생합니다

var data = { 
    recID: curID, 
    general: 
    { 
     a: aValue, 
     b: bValue, 
     c: cValue 
    }, 
    data: 
    { 
     d: dValue, 
     e: eValue, 
     f: fValue 
    }, 
    moredata: 
    { 
     g: gValue, 
     h: hValue, 
     i: iValue 
    } 
}; 

합니다. 그리고 그것은 단지 하나의 예일뿐입니다. 수백 가지의 미묘한 오타 스타일 오류가있을 수 있습니다.

C에서이 메서드를 호출하면 컴파일러에서 "SaveComplexRecord의 오버로드 된 메서드는 세 개의 매개 변수를 사용하지 않습니다."와 같은 오류 메시지를 표시합니다. 또는 올바른 방향으로 당신을 가리키는 다른 유용한 메시지.

그래서 ... 더 나은 오류 메시지를 생성하기 위해 ASP.Net을 얻는 방법이 있습니까?

[WebMethod] 호출의 JSON 매개 변수 구조를 자동으로 빌드하는 유틸리티가 있습니까? (마치 웹 서비스의 WSDL을 자동으로 가져올 수있는 것처럼)

... 또는 내가 누락되었을 수있는 다른 기술은 무엇입니까? 당신이 컴파일 타임 오류를 얻을 수 있도록

var jsondata = $.toJSON(data); 

    $.ajax({ 
     type: "POST", 
     url: "MyWebPage.aspx/SaveComplexRecord", 
     data: jsondata, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     beforeSend: function(xhr) 
     { 
      xhr.setRequestHeader("Content-type", 
         "application/json; charset=utf-8"); 
     }, 
     success: function(msg) 
     { 
      //do something on success 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) 
     { 
      alert("ERROR status:" + textStatus + " error:" + errorThrown); 
     } 

    }); 
+2

다소 관련이 없지만 $ .toJSON 대신 JSON.stringify를 사용하는 것이 좋습니다. 최신 브라우저에서 JSON.stringify는 JavaScript 엔진을 통해 직렬화하는 대신 브라우저 고유의 빠른 기능을 자동으로 활용합니다. –

+0

차가움. 그 사실을 모르고있었습니다. –

답변

1

Or is there some utility that will automatically build the JSON parameter structure of a [WebMethod] call? (just like you can automatically get the WSDL of a web service)

예! ASP.Net AJAX 프레임 워크가 이것을 할 수 있습니다! 웹 서비스 클래스에서 'GenerateScriptType'속성을 사용하여 GeneralData, SomeObject 및 클래스의 클라이언트 측 프록시 클래스를 생성하는 프레임 워크를 얻을 수 있습니다.
주제에 관한 아주 좋은 기사는 understanding asp net ajax web servcies을 참조하십시오.

[불행하게도, AFAIAA에서, GenerateScriptType이 페이지 메소드가 정의 된 페이지 클래스에 적용 아무런 영향이 없다 -. 프록시 세대를 얻기 위해 순전히이 .asmx을 추가해야합니다 있도록]을

당신은 할 수 아마도 이러한 클래스를 사용하여 .ajax을 호출 할 때 JSON이 문자열 화하는 data 구조를 구축 할 수 있습니까? [MS AJAX 프레임 워크에 대해 정말 좋아하는 것 중 (매우 적은) 것들 중 하나는 클라이언트 측 프록시 생성입니다. 웹 서비스와 페이지 메서드를 매우 쉽게 호출 할 수 있습니다. 그렇게 말했듯이 나는 MS AJAX보다 jQuery를 사용하려고한다.]

또는 ... 페이지 메서드의 인수에 JSON 데이터의 비 직렬화가 완료되었다는 것이 문제이다. 프레임 워크 (대부분의 경우 좋은 점)에 의해 투명하게 처리되지만 잘못 될 경우 피드백은 도움이되지 않습니다. 직렬화 문제를 해결하려면 사용자 정의 JSON 변환기 (here 참조)를 사용하거나 메서드가 문자열을 허용하고 JSN을 serialize하는 대신 세련된 슬레지 해머 접근법을 사용하여 직렬화를 제어해야한다고 생각합니다 메서드에서 자신을 - 많은 JSON 라이브러리 중 누구와도 사소한 것입니다.

+0

지금까지 최선의 대답은 승인 된 것으로 표시됩니다. 나는 "그냥 문자열을 받아 들인다"(또는 Dictionary ) 경로를 받아 들였다. 그것은 효과가 있지만 제대로하는 것만 큼 좋지는 않습니다. 어떻게 든 ASP.Net AJAX 프레임 워크를 사용하여 프록시 클래스를 생성하는 방법에 대해 생각했지만 그 방법을 파악할 정도로 파고 들지 않았습니다. –

0

자바 스크립트가 동적으로 입력된다

그리고 여기에 완성도에 대한

내가 JQuery와에서 이러한 웹 메쏘드를 호출하는 방법입니다. 그러나 window.onerror + ajax 트릭을 사용하거나 콜백 jQuery.ajax()의 ajax를 통해 오류를 보낼 수 있으며 서버에 있으면 다른 런타임 오류와 마찬가지로 처리 할 수 ​​있습니다 (예외 발생, 오류 기록, 뭐든간에)

0

jQuery 관점에서 문제는 오류 함수 선언에 있습니다. 하나의 입력 매개 변수 만 가져 오면 오류의 모든 속성을 갖게되고 더 쉽게 디버깅 할 수 있습니다.

문제가 서버 쪽이면 오류를 catch하고 오류 메시지가 포함 된 return json을 만듭니다.

아, 컴파일 타임에 자바 스크립트를 확인하고 싶다면 jslint.com의 추가 기능을 사용하는 것이 좋습니다.

그래서 :

$ 아약스 ({ 유형 : "POST", URL : "MyWebPage.aspx/SaveComplexRecord ", 데이터 : jsondata, contentType :"application/json; 캐릭터 = UTF-8 " dataType와"JSON " beforeSend : 함수 (XHR) { xhr.setRequestHeader ("컨텐츠 타입 " "애플리케이션/JSON; 문자셋 = UTF-8 ");} , 성공 : 기능 (MSG) { // 성공 에 뭔가를}, 오류 : 기능 (ERR) { 경고 (e.message) } }); 내가 무엇

0

웹 서비스에서 JSON을 반환 할 때 "ret"라는 속성과 "err"속성이 포함 된 객체가있을 때 서비스 호출 결과를 포함하는 "데이터"를 제공하십시오. 웹 서비스에서 나는 예외를 잡아두고 예외 메시지를 "err"속성에 두었습니다. 그런 다음 클라이언트에서 오류가 발생했다는 것을 알고있는 경우 "비어 있음"속성이 비어 있지 않은지 확인합니다.