2010-04-19 2 views
4

.asmx webservice에 ajax 및 jquery를 사용하여 양식을 게시하고 JSON으로 webservice에서 값을 반환하고 싶습니다.ContentType이 JSON이 아닌 경우 .asmx 웹 서비스에서 JSON을 반환 할 수 있습니까?

ASP.NET 4.0을 사용하고 있습니다. JSON을 웹 서비스에서 반환하기 위해서는 다음을 설정해야합니다. dataType : "json"(2) contentType : "application/json; charset = utf-8", (3) type : "POST" (4) 데이터를 무언가로 설정하십시오. 이 테스트를 거쳤고 정상적으로 작동합니다 (예 : 내 webservice에서 JSON으로 데이터를 반환 함) ** **이 모두 ** 설정된 경우 ** **.

그러나, 나는 표준 양식을하고 싶은 내 경우에는 말할 수 후 즉 TEST1 = 값 1 & TEST2 = 이 때문에 contentType이이 JSON 것이 아니라 내가 다시 JSON 원하는 값 2 {TEST1 : 값 1을}. contentType이 "application/x-www-form-urlencoded"이 아니므로 "application/json; charset = utf-8"이 아니므로 작동하지 않는 것 같습니다.

아무도 왜 내가 이것을 할 수 없다고 말할 수 있습니까? 명시 적으로 JSON을 다시 보내야만 JSON을 다시 보내야합니다. JSON (즉, urlencoded contenttype 게시)을 사용하지 않으면 webservice에서 XML을 반환합니다.

모든 통찰력을 매우 높이 평가합니다.

답변

7

.asmx webservice 대신 WFC RESTfull Service를 사용하는 경우 질문에서 모든 요구 사항을 구현할 수 있습니다. 그러나 출력이 인 JSON으로 .asmx webservice를 사용하려면 적어도 contentType: 'application/json'을 사용하는이 필요합니다. JSON 하이재킹을 참조하십시오 - 보안상의 이유로 다른 장소에서 찾을 수 있습니다.

아마 'x-www-form-urlencoded'이 (가) 실제 문제는 아닙니다. dataType: "json"을 사용하면 매개 변수도 "test1 = value1 & test2 = value2"형식으로 전송됩니다. 유일한 차이점은 모든 값은 JSON으로 인코딩되어야한다는 것입니다. 그리고 jQuery 은 데이터의 JSON 인코딩을으로 만들지 않습니다. (당신은 jQuery의 코드를 볼 수있다.) 주요 차이점은 요청 헤더에 명시 적으로 "Accept : application/json"이 설정된다는 것이다.

최근에 쓴 JQuery ajax call to httpget webmethod (c#) not working을보세요. 이 게시물에 GET 요청의 예를 물었다. 그러나 거의 동일합니다. 유일한 차이점은 인코딩 후 URL이 (GET 요청의 경우) 이 추가됩니다. POST 요청의 경우 데이터이 본문으로 전송됩니다. 그런데 "processData : false"(http://api.jquery.com/jQuery.ajax/ 참조)를 설정하면 GET 데이터가 본문 내부로 전송됩니다. 따라서 내 코드 예제를 JQuery ajax call to httpget webmethod (c#) not working에서 읽으십시오. 당신이 원하는 것을 구현할 수있는 아이디어를 얻길 바랍니다.

당신이 복잡한 데이터를 인코딩하는 데 문제가 있다고 생각합니다.asmx webservice 호출. 당신은이 예제를 수정할 수 있습니다

public class InternalData { 
    public string blaBla { get; set; } 
    public int[] iii { get; set; } 
} 
public class OutputData { 
    public string id { get; set; } 
    public List message { get; set; } 
    public int[] myInt { get; set; } 
    public InternalData myComplexData { get; set; } 
} 
public class InputData { 
    public string id { get; set; } 
    public int[] myInt { get; set; } 
    public InternalData data { get; set; } 
}

및 클라이언트 측

var myData = { id: "li1234", myInt: [100, 200], data : {blaBla: "Hahhh!", iii: [10,20,30]}} 
var myDataForjQuery = {input:$.toJSON(myData)}; 
$.ajax({ 
    type: "GET", 
    url: "/Service1.asmx/AjaxGetMore", // + idAsJson, 
    data: myDataForjQuery, // idAsJson, //myData, 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    success: function(msg) { 
     // var msg = {__type: "Testportal.outputData", id: "li1234", message: "it's work!", myInt:101} 
     alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); 
    }, 
    error: function(res, status) { 
     if (status ==="error") { 
      // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace 
      var errorMessage = $.parseJSON(res.responseText); 
      alert(errorMessage.Message); 
     } 
    } 
});

( $.toJSON는 JSON 플러그인에서 온)

[WebMethod] 
[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
public OutputData AjaxGetMore (InputData input) { 
    return new OutputData() { 
     id = input.id, 
     message = new List { "it's work!", "OK!" }, 
     myInt = new int[] { input.myInt[0] + 1, input.myInt[1] + 1, 20, 75 }, 
     myComplexData = new InternalData() { blaBla = "haha", iii = new int[] { 1, 2, 3, 4, 5 } } 
    }; 
}

: 여기에 "복잡한"데이터 예입니다 원하는 경우 HTTP POST로.

하나 더 작은 조언. jQuery 1.4.x를 사용하는 경우 dataType으로 'none'을 사용해 볼 수 있습니다. "아무 것도 지정하지 않으면 jQuery는 응답의 MIME 유형에 따라 결과를 지능적으로 얻으려고 시도합니다 (XML MIME 유형은 XML을 생성합니다. 1.4 JSON은 JavaScript 객체를 생성합니다. 1.4 스크립트에서 스크립트, 그리고 다른 어떤 문자열) "

안부

+0

안녕하세요 올렉, 답장 보내 주셔서 감사합니다! ! 많은 노력 끝에 json 데이터를 웹 서비스에서 반환하는 유일한 방법은 contentType을 'application/json'으로 설정하는 것입니다. 모든 브라우저에서 기본적으로 지원되는 기능이 아니기 때문에 간단한 형식을 json으로 직렬화하는 방법을 사용하지 않으려 고했기 때문에이 방법을 사용하지 않기로 결정했습니다. 마지막으로 컨트롤러에서 JSONResult를 통해 'out of the box'JSON 지원을 제공하는 ASP.NET MVC를 사용하는 것이 가장 좋은 방법이라고 판단했습니다. 도움을 주셔서 감사합니다 :) –

+0

당신을 환영합니다. 나는 또한 ASP.NET MVC를 좋아한다. 데이터가 제공하는대로 WFC 내부에 모든 비즈니스 로직을 배치하기로 결정했습니다. 순수한 아키텍처 결정이었습니다. 하지만 당신은 ASP.NET MVC 프로젝트가 가장 좋습니다. ASP.NET MVC는 WFC, MVC 및 .asmx webservice의 세 가지 방식 중 가장 유연합니다. Goog 행운과 소프트웨어 개발에 많은 즐거움! – Oleg

1

요청 및 응답 헤더는 다른 이야기입니다. 따라서 특정 데이터 유형을 수신하기 위해 특정 데이터 유형을 전송할 필요는 없습니다.

jQuery의 경우 dataType이 'json'으로 설정된 .ajax() 함수를 사용하십시오. 나머지는 호출 스크립트/서비스에 따라 다릅니다.

+0

안녕 jAndy, 답장을 보내 감사로 반환됩니다. 내 문제는 contentType을 생략하고 dataType을 설정하면 contentType이 urlencoded로 기본 설정되지만 올바른 것이지만 webservice에서 반환 된 데이터는 json이 아닌 json으로 인코딩됩니다. contentType도 json으로 설정하지 않으면 dataType이 무시되는 것 같습니다. –

1

또한 JSON 요청에서도 contentType을 설정해야합니다. 이렇게하면 요청에 application/x-www-form-urlencoded이 없게됩니다. 대신, 그것은 당신이 원하는 것을 줄 것이다 : application/json; charset = utf-8.

$.ajax({ 
    url: '/your/site', 
    contentType: 'application/json', 
    dataType: 'json', 
    data: jsonString, 
    type: 'post', 
    success: function (data) { 
     /* do stuff */ 
    } 
}); 
+0

안녕하세요 Talor 패, 내 문제는 내가 json으로 데이터를 게시하고 싶지 않아, 내가 urlencoded로 게시하고 싶습니다. 그러나 나는 json을 webservice에서 반환하고 싶지만 contentType을 json으로 설정하지 않으면 dataType이 json으로 설정된 경우에도 xml이 반환됩니다. –

+0

이런 소리가 웹 서비스의 문제입니다. 여기에 관련된 질문이 있습니다 : http://stackoverflow.com/questions/288850/how-to-return-json-from-a-2-0-asmx-web-service –

관련 문제