mvc - .NET AJAX ¿Llama a ASMX o ASPX o ASHX?
asp.net ajax download (3)
¿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?
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!
El material de 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.
Aquí está la mejor parte, el scriptmanager de ASP.NET3.5 puede hacer la mayor parte del trabajo para usted en cuanto a la generación de un método JS para que pueda llamar y también la configuración de cualquier clase JS necesaria.
Un ejemplo simple para obtener detalles de 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>
Al utilizar una configuración como esta, ni siquiera necesitará la ayuda de JQuery para llamar al 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 valioso mirar en el material ASP.NET Ajax ScriptService. Incluso si decides no usarlo esta vez, es una característica bastante malvada.
Campo de golf
- Parece un buen ejemplo básico del uso de un scriptservice: http://www.jankoatwarpspeed.com/post/2008/05/14/asp-net-ajax-basics-calling-scriptservices-using-javascript.aspx
- ASP.NET Ajax Extenders, los siguientes pasos lógicos para integrar Ajax en sus controles. http://weblogs.asp.net/scottgu/archive/2007/08/19/using-asp-net-ajax-control-extenders-in-vs-2008.aspx
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.
Si lo único que te preocupa es la sobrecarga del lado del servidor, 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.