ASMX Webservices reloaded

In den Anfängen von .NET  vor über 10 Jahren gab es .NET Remoting und Webservices für Objekt Kommunikation über Anwendungsgrenzen hinweg. Die ASP.NET Web Services waren supereinfach zu konfigurieren (nämlich nichts) zu programmieren ( ein Methoden Attribut genügt) zu konsumieren ( add service reference) und zu deployen (copy paste). Ersetzt wurden beide durch WCF, das nichts davon bot.

Persönlich habe ich ASMX gerne verwendet, aber über die Jahre als “obsolet”  in die Ecke gestellt. Vor allem das gelieferte SOAP Format, war meist wenig nützlich. Proxys erstellt man heute eher selten.

Allerdings kann ein ASMX Service auch JSON. Ich weis zwar nicht seit wann genau, aber geht. Das einzige was zu tun ist, ein Attribut setzen.

   1:  <ScriptService()>
   2:  Public Class WebService1
   3:      Inherits System.Web.Services.WebService
   4:   
   5:      <WebMethod()>
   6:      <ScriptMethod(ResponseFormat:=ResponseFormat.Json)>
   7:      Public Function HelloWorld() As List(Of person)
   8:          Dim l As New List(Of person)
   9:          l.Add(New person With {.id = 1, .Name = "Hannes", .alter = 27})
  10:          l.Add(New person With {.id = 2, .Name = "Franz", .alter = 24})
  11:          l.Add(New person With {.id = 3, .Name = "Maria", .alter = 47})
  12:   
  13:          Return l
  14:      End Function
  15:   
  16:  End Class

Man kann zwei Wege wählen, um den Service zu konsumieren. Proxy oder native HTTPrequest (was der Proxy auch macht). In ASP.NET erzeugt das Scriptmanager Control einen JavaScript Proxy beim HTML rendering.

   1:   <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
   2:              <Services>
   3:                  <asp:ServiceReference Path="~/WebService1.asmx"  />
   4:              </Services>
   5:  </asp:ScriptManager>
   6:  <input type="button" onclick="GetCustomers()"/>

Pagemethods Attribut wird nicht benötigt. Dies bewirkt das man die Web Service Methoden einfach in ASPX Seiten packen kann.

Mit ganz wenig Jscript klappt nun der Zugriff über Namensraum (Anwendungsname), Name der ASMX Datei, Methodenname und optionale Paramater (in diesem Fall keiner) der Zugriff auf die entfernte Methode

   1:   <script type="text/javascript">
   2:          function pageLoad() {
   3:          }
   4:          function GetCustomers() {
   5:              WebApplication2.WebService1.HelloWorld(OnComplete, OnError);
   6:   
   7:          }
   8:          function OnComplete(result) {
   9:              var c = eval( result );
  10:          
  11:          }
  12:          function OnError(errorMessage) {
  13:              alert(errorMessage.get_message());
  14:          }
  15:    </script>

Also einfacher geht nicht. Fiddler zeigt den Zugriff

image

Und die Daten sind JSON

image

Entsprechend lässt sich der Request auch manuell per XMLHTTPRequest durchführen bzw. mit der Jquery Library. Hier wird eine Dropdownliste mit den Daten gefüllt

   1:     <script>
   2:          $.ajax({type        : "POST",
   3:                  url         : "Webservice1.asmx/HelloWorld",
   4:                  data        : "",
   5:                  contentType : "application/json; charset=utf-8",
   6:                  dataType    : "json",
   7:                  success: function (result) {
   8:                      $.each(result.d, function (Key, Value) {
   9:                          $("#dp1").append($("<option></option>").val(Value.id).html(Value.Name))
  10:                      });
  11:                      }
  12:                  });
  13:   
  14:      </script>

Scott Guthrie schreibt schon 2007 über einige Sicherheitsdetails dazu.

Pingbacks and trackbacks (1)+

Kommentare sind geschlossen