.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 스크립트에서 스크립트, 그리고 다른 어떤 문자열) "
안부
안녕하세요 올렉, 답장 보내 주셔서 감사합니다! ! 많은 노력 끝에 json 데이터를 웹 서비스에서 반환하는 유일한 방법은 contentType을 'application/json'으로 설정하는 것입니다. 모든 브라우저에서 기본적으로 지원되는 기능이 아니기 때문에 간단한 형식을 json으로 직렬화하는 방법을 사용하지 않으려 고했기 때문에이 방법을 사용하지 않기로 결정했습니다. 마지막으로 컨트롤러에서 JSONResult를 통해 'out of the box'JSON 지원을 제공하는 ASP.NET MVC를 사용하는 것이 가장 좋은 방법이라고 판단했습니다. 도움을 주셔서 감사합니다 :) –
당신을 환영합니다. 나는 또한 ASP.NET MVC를 좋아한다. 데이터가 제공하는대로 WFC 내부에 모든 비즈니스 로직을 배치하기로 결정했습니다. 순수한 아키텍처 결정이었습니다. 하지만 당신은 ASP.NET MVC 프로젝트가 가장 좋습니다. ASP.NET MVC는 WFC, MVC 및 .asmx webservice의 세 가지 방식 중 가장 유연합니다. Goog 행운과 소프트웨어 개발에 많은 즐거움! – Oleg