2009-03-23 2 views
36

AJAX를 사용하여 클라이언트 측에서 javascript로부터 비즈니스 로직을 호출하는 가장 효율적인 방법은 무엇입니까? 그것은 aspx 직접 자바 스크립트 (내 경우에는 JQuery 사용하는 데 도움이)에서 [WebMethod] 호출 할 수있는 것처럼 보입니다. 또는 .asmx 직접 호출 할 수 있습니다. 오버 헤드가 적은 호출은 무엇입니까? 가장 좋은 방법은 무엇입니까?.NET AJAX는 ASMX 또는 ASPX 또는 ASHX를 호출합니까?

또한 [ScriptService] 속성은 클래스에서 무엇을합니까? 나는 전에 .aspx [WebMethod] 메소드에서 이것을 사용 해본 적이 없으며 모든 것이 잘 작동하는 것처럼 보인다.

저는 이것이 순수한 객관적인 질문이기를 희망합니다. 미리 감사드립니다!

답변

28

내 생각에 ScriptService 물건은 asp.net의 숨겨진 보석입니다. 스크립트 서비스에 대한 호출은 데이터 + viewstate를 패스 백하지 않으며, 그들은 가늘고 빠른 JSON 페이로드입니다.

가장 중요한 부분은 ASP.NET3.5의 scriptmanager가 호출 할 JS 메서드를 생성하고 필요한 JS 클래스를 설정하는 것과 관련된 대부분의 작업을 수행 할 수 있다는 것입니다.

Person이 C# 클래스라고 가정하고 "Person"에 대한 세부 정보를 가져 오는 간단한 예제입니다. PersonService.asmx에서

:

namespace MyProj.Services { 
    [System.Web.Script.Services.ScriptService] 
    [System.Web.Script.Services.GenerateScriptType(typeof(Person))] 
    public class PersonService : System.Web.Services.WebService 
    { 
    [WebMethod, ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public Person GetPersonDetails(int id) 
    { 
     /* return Logic here */ 
    } 
    } 
} 

DetailsPage.aspx

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
<Services> 
    <asp:ServiceReference Path="~/Services/PersonService.asmx" /> 
</Services> 
</asp:ScriptManager> 

에서이 같은 설정을 사용하여, 당신도 전화를 JQuery와의 도움을 필요로하지 않습니다 서비스 및 C# Person 클래스의 JS 버전을 가져 오면 .net이 모든 것을 수행합니다. 것 JS에서이 서비스를 사용하는 예는 :

MyProj.Services.PersonService.GetPersonDetails(id, _onDetailsCallbackSuccess, _requestFailed, null); 

_onDetailsCallbackSuccess: function(result, userContext, methodName) { 
//all persons properties are now intact and available 
document.getElementById('txtFirstname').value = result.Firtname; 
} 

어쨌든, 그것은 ASP.NET 아약스 ScriptService 물건으로 보는 가치가 더 후가 될 것입니다. 이번에는 사용하지 않기로 결정하더라도 꽤 사악한 기능입니다.http://www.jankoatwarpspeed.com/post/2008/05/14/asp-net-ajax-basics-calling-scriptservices-using-javascript.aspx

  • ASP.NET AJAX 익스텐더 (Extender), 당신의 컨트롤에 Ajax를 통합하는 다음의 논리적 단계 :

    링크

  • +0

    감사합니다. 귀하의 답변은 정말 도움이되었습니다. 그가 먼저 응답 한 이후 나는 다른 하나를 답으로 표시했으나 앞으로 유용 할 것이므로 귀하의 응답을 표결했습니다. – jakejgordon

    +2

    @jake : 가장 유용한 답을 답으로 표시해야합니다. 우리는 빠른 타이피스트가 아니라 위대한 해답을 보답합니다. – Espo

    +0

    첫 번째 링크 (www.jankoatwarpspeed.com)는 페이지를 찾을 수 없음을 반환합니다. (그것은 inbetween에서 제거되었을 수 있습니다 ... – Mochi

    15

    서버 측 오버 헤드가 걱정된다면 쿼리 문자열과 함께 간단한 GET을 ASHX로 보내면됩니다. .ASPX는 필요하지 않은 페이지 수명주기를 거쳐야합니다.

    ASMX 웹 방식의 장점은 다른 기술로 쉽게 호출 할 수있는 표준 (검색 지원)을 기반으로합니다. 그러나 일부 문서를 사용하면 .ASHX도 쉽게 호출 할 수 있습니다.

    +0

    GET을 수행하는 .ASHX에서 특정 [WebMethod]를 호출 할 수 있습니까? – jakejgordon

    +2

    그것은 그것이 무엇을위한 것이 아닙니다. .ASHX는 쿼리 문자열을 해독하고 메소드 자체로 분기해야합니다. ASMX보다 프로그래밍 작업이 많지만 실행 중 오버 헤드가 매우 적습니다. 여전히 ASP.NET을 사용하면서 얻을 수있는 가장 작은 것입니다. –

    +0

    ashx는 페이지 라이프 사이클을 거치지 않는 HTTPRequestHandler입니다. 그것은 다른 것들을 위해 유용 할 것이지만 나는 아마 거대한 switch 문을 사용하는 것을 포함 할 10+ [WebMethods]을 가지고있을 수 있으므로이 특별한 경우에 이것을 사용하는 것을 피할 것이다. – jakejgordon

    12

    귀하의 질문에 대한 대답은 ASMX "ScriptService", ASHX HttpHandler 및 ASP.NET AJAX "PageMethod"(실제 ASPX 페이지가 아님)의 차이를 고려하고 있다고 생각합니다.

    이 경우 모두 매우 유사합니다. ASP.NET AJAX PageMethod는 모든 의도와 목적을 위해 ASMX ScriptServices와 동일합니다. 페이지의 인스턴스를 만들지 않으므로 ASPX 페이지와 관련된 정상적인 오버 헤드가 발생하지 않습니다.

    요청이있는 서버를 채우는 것이 아니라면 세 가지 모두 비슷한 성능을 제공한다는 것을 알게 될 것입니다.

    관련 문제