2009-03-23 8 views
36

Was ist der effizienteste Weg, um einige Geschäftslogik von Javascript auf dem Client-Seite mit AJAX aufrufen? Es sieht so aus, als könntest du eine [WebMethod] auf einem aspx direkt von Javascript aufrufen (in meinem Fall benutze ich JQuery um zu helfen) ODER du kannst eine .asmx direkt aufrufen. Welcher Anruf verursacht weniger Overhead? Was ist die beste Praxis?.NET AJAX Anrufe zu ASMX oder ASPX oder ASHX?

Was macht das Attribut [ScriptService] in einer Klasse? Ich habe das noch nie zuvor auf meinen .aspx [WebMethod] -Methoden verwendet und alles scheint gut zu funktionieren.

Ich hoffe, das ist eine rein objektive Frage. Danke im Voraus!

Antwort

28

Die ScriptService Zeug ist meiner Meinung nach ein verstecktes Juwel in asp.net. Aufrufe an den Skriptdienst geben keine Rückmeldedaten und Viewstate aus, sie sind schlanke, schnelle JSON-Nutzdaten.

Heres der beste Teil, kann ASP.NET3.5 scriptmanager die meisten der Arbeit für Sie im Hinblick auf die Generierung einer JS-Methode für Sie aufrufen und auch alle erforderlichen JS-Klassen einrichten.

Ein einfaches Beispiel zum Abrufen von Details für eine "Person" unter der Annahme, dass Person eine C# -Klasse ist.

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

In DetailsPage.aspx

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

Durch eine Einrichtung wie dieser, werden Sie nicht einmal die Hilfe von JQuery anrufen müssen der Service und erhalten Sie eine JS-Version Ihrer C# Person Klasse, .net macht das alles für Sie. Ein Beispiel für diesen Service von JS verwenden wäre:

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

Auf jeden Fall wäre es dann wert sein, in die Sachen Ajax Script ASP.NET suchen. Auch wenn Sie dieses Mal nicht verwenden, ist es ein ziemlich schlechtes Feature.

Verbindungen

+0

Danke, deine Antwort war sehr hilfreich. Ich habe den anderen als Antwort markiert, da er zuerst geantwortet hat, aber ich habe deine Antwort gewählt, da es nützlich sein wird, vorwärts zu gehen – jakejgordon

+2

@jake: Du solltest die hilfreichste Antwort als Antwort markieren. Wir belohnen hier gute Antworten, keine schnellen Schreibkräfte. – Espo

+0

Der erste Link (www.jankoatwarpspeed.com) zurück Seite nicht gefunden :(Möglicherweise wurde er zwischenzeitlich entfernt ... – Mochi

15

Wenn serverseitiger Overhead alles ist, was Sie interessieren, dann wäre es wahrscheinlich ein einfaches GET mit einer Abfragezeichenfolge an eine ASHX zu senden. Es ist definitiv einer .ASPX vorzuziehen, die einen Seitenlebenszyklus durchlaufen wird, den Sie nicht benötigen.

Der Vorteil einer ASMX-Webmethode besteht darin, dass sie auf einem Standard basiert, der von anderen Technologien leicht aufgerufen werden kann (unterstützt Discovery). Mit etwas Dokumentation wird Ihr .ASHX jedoch genauso einfach zu erreichen sein.

+0

Können Sie eine bestimmte [WebMethod] auf einem .ASHX eine GET aufrufen? – jakejgordon

+2

Dafür ist es nicht. Ein .ASHX muss den Querystring knacken und zur Methode selbst verzweigen. Es ist mehr Programmierarbeit als ein ASMX, aber sehr wenig Overhead während des Laufens - so ziemlich das kleinste, das Sie bekommen können, während Sie immer noch ASP.NET verwenden. –

+0

Also ein Aschx ist wirklich ein HTTPRequestHandler, der einen Seitenlebenszyklus nicht durchläuft? Das wird für andere Dinge nützlich sein, aber ich werde wahrscheinlich vermeiden wollen, dass in diesem speziellen Fall 10+ [WebMethods], die wirklich eine riesige Switch-Anweisung verwenden würde ... – jakejgordon

12

Wie Sie Ihre Frage formulierten, glaube ich, dass Sie den Unterschied zwischen einem ASMX "ScriptService", einem ASHX HttpHandler und einem ASP.NET AJAX "PageMethod" (keine tatsächliche ASPX Seite) betrachten.

Wenn dies der Fall ist, sind sie alle sehr ähnlich. Die ASP.NET AJAX PageMethods sind in jeder Hinsicht identisch mit ASMX ScriptServices. Sie erstellen keine Instanz der Seite, sodass sie nicht den normalerweise mit ASPX-Seiten verbundenen Aufwand verursachen.

Wenn Sie nicht davon sprechen, den Server mit Anfragen zu sättigen, werden Sie wahrscheinlich feststellen, dass alle drei vergleichbar sind.