Delen via


Procedure: AJAX-ASP.NET-webservices migreren naar WCF

In dit onderwerp worden procedures beschreven voor het migreren van een eenvoudige ASP.NET AJAX-service naar een equivalente WCF-service (Windows Communication Foundation) met AJAX-functionaliteit. Het laat zien hoe u een functioneel equivalente WCF-versie van een ASP.NET AJAX-service maakt. De twee services kunnen vervolgens naast elkaar worden gebruikt of de WCF-service kan worden gebruikt om de ASP.NET AJAX-service te vervangen.

Het migreren van een bestaande ASP.NET AJAX-service naar een WCF AJAX-service biedt de volgende voordelen:

  • U kunt uw AJAX-service beschikbaar maken als SOAP-service met minimale extra configuratie.

  • U kunt profiteren van WCF-functies, zoals tracering, enzovoort.

In de volgende procedures wordt ervan uitgegaan dat u Visual Studio 2012 gebruikt.

De code die het resultaat is van de procedures die in dit onderwerp worden beschreven, vindt u in het voorbeeld na de procedures.

Zie het onderwerp Procedure: Configuratie gebruiken om een ASP.NET AJAX-eindpunt toe te voegen voor meer informatie over het weergeven van een WCF-service via een AJAX-eindpunt.

De ASP.NET-webservicetoepassing maken en testen

  1. Open Visual Studio 2012.

  2. Selecteer in het menu Bestand de optie Nieuw, vervolgens Project, web en selecteer vervolgens ASP.NET webservicetoepassing.

  3. Geef het project ASPHello een naam en klik op OK.

  4. Verwijder opmerkingen bij de regel in het Service1.asmx.cs-bestand dat ajax voor deze service kan System.Web.Script.Services.ScriptService] inschakelen.

  5. Selecteer Build Solution in het menu Build.

  6. Selecteer in het menu Foutopsporing de optie Starten zonder foutopsporing.

  7. Selecteer de HelloWorld bewerking op de gegenereerde webpagina.

  8. Klik op de knop Aanroepen op de HelloWorld testpagina. U moet het volgende XML-antwoord ontvangen.

    <?xml version="1.0" encoding="utf-8" ?>
    <string xmlns="http://tempuri.org/">Hello World</string>
    
  9. Dit antwoord bevestigt dat u nu een werkende ASP.NET AJAX-service hebt en met name dat de service nu een eindpunt heeft weergegeven bij Service1.asmx/HelloWorld die reageert op HTTP POST-aanvragen en XML retourneert.

    U bent nu klaar om deze service te converteren om een WCF AJAX-service te gebruiken.

Een equivalente WCF AJAX-servicetoepassing maken

  1. Klik met de rechtermuisknop op het ASPHello-project en selecteer Toevoegen, vervolgens Nieuw item en vervolgens OP AJAX ingeschakelde WCF-service.

  2. Geef de service WCFHello een naam en klik op Toevoegen.

  3. Open het bestand WCFHello.svc.cs.

  4. Kopieer vanuit Service1.asmx.cs de volgende implementatie van de HelloWorld bewerking.

    public string HelloWorld()
    {
        return "Hello World";
    }
    
  5. Plak deze om de implementatie van de HelloWorld bewerking in het WCFHello.svc.cs-bestand te kopiëren in plaats van de volgende code.

    public void DoWork()
    {
          // Add your operation implementation here
          return;
    }
    
  6. Geef het Namespace kenmerk op ServiceContractAttribute als WCFHello.

    [ServiceContract(Namespace="WCFHello")]
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
    public class WCFHello
    { … }
    
  7. Voeg de WebInvokeAttribute bewerking toe HelloWorld en stel de ResponseFormat eigenschap in om te retourneren Xml. Houd er rekening mee dat, als dit niet is ingesteld, het standaard retourtype is Json.

    [OperationContract]
    [WebInvoke(ResponseFormat=WebMessageFormat.Xml)]
    public string HelloWorld()
    {
        return "Hello World";
    }
    
  8. Selecteer Build Solution in het menu Build.

  9. Open het WCFHello.svc-bestand en selecteer start zonder foutopsporing in het menu Foutopsporing.

  10. De service toont nu een eindpunt op WCFHello.svc/HelloWorld, dat reageert op HTTP POST-aanvragen. HTTP POST-aanvragen kunnen niet worden getest vanuit de browser, maar het eindpunt retourneert XML na XML.

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
    
  11. De WCFHello.svc/HelloWorld eindpunten en de Service1.aspx/HelloWorld eindpunten zijn nu functioneel equivalent.

Opmerking

De code die het resultaat is van de procedures die in dit onderwerp worden beschreven, vindt u in het volgende voorbeeld.

//This is the ASP.NET code in the Service1.asmx.cs file.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Web.Script.Services;

namespace ASPHello
{
    /// <summary>
    /// Summary description for Service1.
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

//This is the WCF code in the WCFHello.svc.cs file.
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace ASPHello
{
    [ServiceContract(Namespace = "WCFHello")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class WCFHello
    {
        // Add [WebInvoke] attribute to use HTTP GET.
        [OperationContract]
        [WebInvoke(ResponseFormat=WebMessageFormat.Xml)]
        public string HelloWorld()
        {
            return "Hello World";
        }

        // Add more operations here and mark them with [OperationContract].
    }
}

Het XmlDocument type wordt niet ondersteund door de DataContractJsonSerializer omdat het niet serialiseerbaar is door de XmlSerializer. U kunt een XDocument type gebruiken of de DocumentElement in plaats daarvan serialiseren.

Als ASMX-webservices worden geüpgraded en gemigreerd naast WCF-services, vermijdt u het toewijzen van twee typen aan dezelfde naam op de client. Dit veroorzaakt een uitzondering in serializers als hetzelfde type wordt gebruikt in een WebMethodAttribute en een ServiceContractAttribute:

  • Als de WCF-service eerst wordt toegevoegd, veroorzaakt het aanroepen van de methode op ASMX-webservice een uitzondering ConvertValue(Object, Type, String) omdat de WCF-stijldefinitie van de volgorde in de proxy voorrang krijgt.

  • Als DE ASMX-webservice eerst wordt toegevoegd, veroorzaakt het aanroepen van de methode voor de WCF-service uitzondering DataContractJsonSerializer omdat de definitie van de webservicestijl van de volgorde in de proxy voorrang krijgt.

Er zijn aanzienlijke verschillen in gedrag tussen de DataContractJsonSerializer en de ASP.NET AJAX JavaScriptSerializer. Het vertegenwoordigt bijvoorbeeld DataContractJsonSerializer een woordenlijst als een matrix van sleutel-waardeparen, terwijl de ASP.NET AJAX JavaScriptSerializer een woordenlijst vertegenwoordigt als werkelijke JSON-objecten. Het volgende is dus de woordenlijst die wordt weergegeven in ASP.NET AJAX.

Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("one", 1);
d.Add("two", 2);

Deze woordenlijst wordt weergegeven in JSON-objecten, zoals wordt weergegeven in de volgende lijst:

Het DataContractJsonSerializer is krachtiger in de zin dat het woordenlijsten kan verwerken waarbij het sleuteltype geen tekenreeks is, terwijl het niet kan JavaScriptSerializer . Maar de laatste is meer JSON-vriendelijk.

De belangrijke verschillen tussen deze serializers worden samengevat in de volgende tabel.

Categorie van verschillen DataContractJsonSerializer ASP.NET AJAX JavaScriptSerializer
Deserialiseren van de lege buffer (nieuwe byte[0]) in Object (of Uri, of sommige andere klassen). SerializationException Nul
Serialisatie van Value {} (of {"__type":"#System"}) Null
Serialisatie van de persoonlijke leden van [Serializable]-typen. Serialized niet geserialiseerd
Serialisatie van de openbare eigenschappen van ISerializable typen. niet geserialiseerd Serialized
Extensies van JSON Voldoet aan de JSON-specificatie, waarvoor aanhalingstekens zijn vereist voor objectlidnamen ({"a":"hello"}). Ondersteunt de namen van objectleden zonder aanhalingstekens ({a:"hello"}).
DateTime Coordinated Universal Time (UTC) Ondersteunt de notatie \/Date(123456789U)\/" of "\/Date\(\d+(U|( \+\-[\d{4}]))?\)\\/)". Ondersteunt indeling \/Date(123456789U)\/" en "\/Date\(\d+(U|( \+\-[\d{4}]))?\)\)\ \/)" als datum/tijd-waarden.
Weergave van woordenlijsten Een matrix van KeyValuePair<K,V> verwerkt sleuteltypen die geen tekenreeksen zijn. Als werkelijke JSON-objecten, maar alleen sleuteltypen verwerken die tekenreeksen zijn.
Escape-tekens Altijd met een escape-slash (/); staat nooit niet-escaped ongeldige JSON-tekens toe, zoals \n. Met een escape-slash (/) voor Datum/tijd-waarden.

Zie ook