2009-03-23 27 views
36

¿Cuál es la forma más eficiente de invocar alguna lógica empresarial desde javascript en el lado del cliente utilizando AJAX? Parece que puede llamar a [WebMethod] en un aspx directamente desde javascript (en mi caso estoy usando JQuery para ayudar) O puede llamar directamente a .asmx. ¿Qué llamada incurre en menos gastos generales? cual es la mejor practica?.NET AJAX ¿Llamadas a ASMX o ASPX o ASHX?

Además, ¿qué hace el atributo [ScriptService] en una clase? Nunca he usado esto antes en mis métodos .aspx [WebMethod] y todo parece funcionar bien.

Espero que esta sea una pregunta puramente objetiva. ¡Gracias por adelantado!

Respuesta

28

Las cosas ScriptService en mi opinión es una joya escondida en asp.net. Las llamadas al servicio de scripts no se transmiten desde datos + viewstate, son cargas lentas y rápidas de JSON.

Heres la mejor parte, el scriptmanager de ASP.NET3.5 puede hacer la mayor parte del trabajo para usted en cuanto a generar un método JS para que usted llame y también configurar cualquier clase JS necesaria.

Un ejemplo simple para obtener detalles para una "Persona", suponiendo que Persona es una clase C#.

En 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 */ 
    } 
    } 
} 

En DetailsPage.aspx

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

Mediante el uso de una configuración como esta, que ni siquiera se necesita la ayuda de jQuery para llamar el servicio y recuperar una versión JS de su clase C# Person, .net lo hace todo por usted. Un ejemplo del uso de este servicio de JS sería:

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; 
} 

De todos modos, sería más que vale la pena analizar las cosas ASP.NET Ajax ScriptService. Incluso si decides no usarlo esta vez, es una característica bastante malvada.

Enlaces

+0

Gracias, su respuesta fue realmente útil. Marqué el otro como la respuesta ya que él respondió primero, pero voté su respuesta, ya que será útil en adelante – jakejgordon

+2

@jake: debe marcar la respuesta más útil como la respuesta. Aquí estamos recompensando grandes respuestas, no mecanógrafos rápidos. – Espo

+0

El primer enlace (www.jankoatwarpspeed.com) devuelve Página no encontrada :(Puede haberse eliminado entremedio ... – Mochi

15

Si la sobrecarga del servidor es lo único que te importa, enviar un simple GET con una cadena de consulta a una ASHX probablemente lo sea. Es definitivamente preferible a .ASPX, que pasará por un ciclo de vida de página que no necesita.

La ventaja de un método web ASMX es que se basa en un estándar que otras tecnologías pueden invocar fácilmente (admite el descubrimiento). Con algo de documentación, su .ASHX será igual de fácil de llamar, sin embargo.

+0

¿Puedes llamar a un [método web] específico en .ASHX haciendo un GET? – jakejgordon

+2

Eso no es para lo que es. Un .ASHX va a tener que romper la cadena de consulta y ramificarse al método mismo. Es más el trabajo de programación que un ASMX, pero tiene una sobrecarga muy baja mientras se ejecuta, prácticamente lo más pequeño que se puede obtener sin dejar de utilizar ASP.NET. –

+0

Entonces, ¿un ashx es realmente un HTTPRequestHandler que no pasa por un ciclo de vida de página? Eso será útil para otras cosas, pero probablemente querré evitar usar eso en este caso particular, ya que puedo tener 10+ [WebMethods], lo que realmente implicaría el uso de una declaración de cambio gigante ... – jakejgordon

12

La forma en que redactó su pregunta, creo que está considerando la diferencia entre un ASMX "ScriptService", un ASHX HttpHandler y un ASP.NET AJAX "PageMethod" (no una página ASPX real).

Si este es el caso, todos son muy similares. ASP.NET AJAX PageMethods son, para todos los efectos, idénticos a ASMX ScriptServices. No crean una instancia de la página, por lo que no incurren en la sobrecarga normalmente asociada con las páginas ASPX.

A menos que esté hablando de saturar el servidor con solicitudes, probablemente encontrará que las tres funcionan de manera comparable.

Cuestiones relacionadas