Vorgehensweise: Migrieren AJAX-aktivierter ASP.NET-Webdienste nach WCFHow to: Migrate AJAX-Enabled ASP.NET Web Services to WCF

Dieses Thema beschreibt Verfahren zum Migrieren von eines einfachen ASP.NET AJAX-Diensts mit einem entsprechenden AJAX-aktivierten Windows Communication Foundation (WCF)-Dienst.This topic outlines procedures to migrate a basic ASP.NET AJAX service to an equivalent AJAX-enabled Windows Communication Foundation (WCF) service. Es wird gezeigt, wie eine funktional äquivalente WCF-Version von ASP.NET AJAX-Diensts erstellt.It shows how to create a functionally equivalent WCF version of an ASP.NET AJAX service. Die beiden Dienste können dann parallel verwendet werden, oder kann der WCF-Dienst verwendet, um ASP.NET AJAX-Dienst zu ersetzen.The two services can then be used side by side, or the WCF service can be used to replace the ASP.NET AJAX service.

Migrieren einer vorhandenen ASP.NET AJAX bietet Service an einen WCF AJAX-Dienst die folgenden Vorteile:Migrating an existing ASP.NET AJAX service to a WCF AJAX service gives you the following benefits:

  • Sie können den AJAX-Dienst mit nur minimaler zusätzlicher Konfiguration als SOAP-Dienst verfügbar machen.You can expose your AJAX service as a SOAP service with minimal extra configuration.

  • Sie können WCF-Funktionen, z. B. Ablaufverfolgung profitieren und so weiter.You can benefit from WCF features such as tracing, and so on.

In den folgenden Verfahren wird davon ausgegangen, dass Sie Visual Studio 2012Visual Studio 2012 verwenden.The following procedures assume that you are using Visual Studio 2012Visual Studio 2012.

Der Code, der sich aus den hier besprochenen Verfahren ergibt, wird in dem Beispiel im Anschluss an das Verfahren bereitgestellt.The code that results from the procedures outlined in this topic is provided in the example following the procedures.

Weitere Informationen zum Bereitstellen eines WCF-Diensts über einen AJAX-aktivierten Endpunkt finden Sie unter der Vorgehensweise: Verwenden der Konfiguration zum Hinzufügen eines ASP.NET AJAX-Endpunkts Thema.For more information about exposing a WCF service through an AJAX-enabled endpoint, see the How to: Use Configuration to Add an ASP.NET AJAX Endpoint topic.

So erstellen und testen Sie die ASP.NET-WebdienstanwendungTo create and test the ASP.NET Web service application

  1. Öffnen Sie Visual Studio 2012Visual Studio 2012.Open Visual Studio 2012Visual Studio 2012.

  2. Aus der Datei klicken Sie im Menü neu, klicken Sie dann Projekt, klicken Sie dann Web, und wählen Sie dann ASP.NET-Webdienstanwendung .From the File menu, select New, then Project, then Web, and then select ASP.NET Web Service Application.

  3. Nennen Sie das Projekt ASPHello , und klicken Sie auf OK.Name the project ASPHello and click OK.

  4. Entfernen Sie in der Datei Service1.asmx.cs die Kommentarzeichen vor der Zeile, die System.Web.Script.Services.ScriptService] enthält, damit AJAX für diesen Dienst aktiviert wird.Uncomment the line in the Service1.asmx.cs file that contains System.Web.Script.Services.ScriptService] to enable AJAX for this service.

  5. Aus der erstellen klicken Sie im Menü Projektmappe.From the Build menu, select Build Solution.

  6. Aus der Debuggen klicken Sie im Menü Starten ohne Debugging.From the Debug menu, select Start Without Debugging.

  7. Wählen Sie auf der generierten Webseite den Vorgang HelloWorld aus.On the Web page generated, select the HelloWorld operation.

  8. Klicken Sie auf die Invoke Schaltfläche auf der HelloWorld Testseite.Click the Invoke button on the HelloWorld test page. Sie sollten die folgende XML-Antwort empfangen.You should receive the following XML response.

    <?xml version="1.0" encoding="utf-8" ?>  
    <string xmlns="http://tempuri.org/">Hello World</string>  
    
  9. Diese Antwort bestätigt Ihnen, dass Sie nun über einen funktionierenden ASP.NET AJAX-Dienst verfügen und insbesondere, dass der Dienst jetzt einen Endpunkt unter Service1.asmx/HelloWorld verfügbar gemacht hat, der auf HTTP POST-Anforderungen antwortet und XML zurückgibt.This response confirms that you now have a functioning ASP.NET AJAX service and, in particular, that the service has now exposed an endpoint at Service1.asmx/HelloWorld that responds to HTTP POST requests and returns XML.

    Jetzt sind Sie bereit ist, konvertiert diesen Dienst, um einen WCF AJAX-Dienst verwenden.Now you are ready to convert this service to use a WCF AJAX service.

So erstellen Sie eine äquivalente WCF AJAX-DienstanwendungTo create an equivalent WCF AJAX service application

  1. Mit der rechten Maustaste die ASPHello Projekt, und wählen Sie hinzufügen, klicken Sie dann neues Element, und klicken Sie dann AJAX-aktivierter WCF-Dienst.Right-click the ASPHello project and select Add, then New Item, and then AJAX-enabled WCF Service.

  2. Benennen Sie den Dienst WCFHello , und klicken Sie auf hinzufügen.Name the service WCFHello and click Add.

  3. Öffnen Sie die Datei WCFHello.svc.cs.Open the WCFHello.svc.cs file.

  4. Kopieren Sie die folgende Implementierung des in der Datei Service1.asmx.cs die HelloWorld Vorgang.From Service1.asmx.cs, copy the following implementation of the HelloWorld operation.

    public string HelloWorld()  
    {  
         return "Hello World";  
    }  
    
  5. Fügen Sie die kopierte Implementierung des der HelloWorld Vorgang in die Datei WCFHello.svc.cs anstelle des folgenden Codes.Paste to copied implementation of the HelloWorld operation into the WCFHello.svc.cs file in place of the following code.

    public void DoWork()  
    {  
          // Add your operation implementation here  
          return;  
    }  
    
  6. Geben Sie die Namespace -Attribut für ServiceContractAttribute als WCFHello.Specify the Namespace attribute for ServiceContractAttribute as WCFHello.

    [ServiceContract(Namespace="WCFHello")]  
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]  
    public class WCFHello  
    { … }  
    
  7. Hinzufügen der WebInvokeAttribute auf die HelloWorld Vorgang und legen die ResponseFormat -Eigenschaft zum Zurückgeben von Xml.Add the WebInvokeAttribute to the HelloWorld operation and set the ResponseFormat property to return Xml. Beachten Sie, dass der Standardrückgabetyp Json ist, sofern nichts anderes festgelegt wird.Note that, if not set, the default return type is Json.

    [OperationContract]  
    [WebInvoke(ResponseFormat=WebMessageFormat.Xml)]  
    public string HelloWorld()  
    {  
        return "Hello World";  
    }  
    
  8. Aus der erstellen klicken Sie im Menü Projektmappe.From the Build menu, select Build Solution.

  9. Öffnen Sie die Datei WCFHello.svc und aus der Debuggen klicken Sie im Menü Starten ohne Debugging.Open the WCFHello.svc file and from the Debug menu, select Start Without Debugging.

  10. Der Dienst macht jetzt einen Endpunkt unter WCFHello.svc/HelloWorld, die auf HTTP-POST-Anforderungen reagiert.The service now exposes an endpoint at WCFHello.svc/HelloWorld, which responds to HTTP POST requests. HTTP POST-Anforderungen können im Browser nicht getestet werden, aber der Endpunkt gibt die folgenden XML-Daten zurück.HTTP POST requests cannot be tested from the browser, but the endpoint returns XML following XML.

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>  
    
  11. Die WCFHello.svc/HelloWorld und die Service1.aspx/HelloWorld Endpunkte sind jetzt funktional äquivalent.The WCFHello.svc/HelloWorld and the Service1.aspx/HelloWorld endpoints are now functionally equivalent.

BeispielExample

Der Code, der sich aus den hier besprochenen Verfahren ergibt, wird im folgenden Beispiel bereitgestellt.The code that results from the procedures outlined in this topic is provided in the following example.

//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].  
    }  
}  

Der XmlDocument-Typ wird vom DataContractJsonSerializer nicht unterstützt, da er vom XmlSerializer nicht serialisiert werden kann.The XmlDocument type is not supported by the DataContractJsonSerializer because it is not serializable by the XmlSerializer. Sie können entweder einen XDocument-Typ verwenden oder stattdessen das DocumentElement serialisieren.You can use either an XDocument type, or serialize the DocumentElement instead.

Wenn ASMX-Webdienste aktualisiert werden und migriert Seite-an-Seite-WCF-Diensten, vermeiden Sie die Zuordnung von zwei Typen auf dem gleichen Namen auf dem Client.If ASMX Web services are being upgraded and migrated side-by-side to WCF services, avoid mapping two types to the same name on the client. Denn andernfalls wird beim Serialisieren eine Ausnahme ausgelöst, wenn der gleiche Typ in einem WebMethodAttribute und einem ServiceContractAttribute verwendet wird.This causes an exception in serializers if the same type is used in a WebMethodAttribute and a ServiceContractAttribute:

  • Wenn WCF-Dienst zuerst hinzugefügt wird, Aufruf der Methode ASMX-Webdienst führt dazu, dass die Ausnahme in ConvertValue(Object, Type, String) , da die WCF-Formatdefinition der Reihenfolge im Proxy Vorrang hat.If WCF service is added first, invoking the method on ASMX Web Service causes exception in ConvertValue(Object, Type, String) because the WCF style definition of the order in the proxy takes precedence.

  • Wenn ASMX-Webdienst zuerst hinzugefügt wird, Aufrufen der Methode für WCF-Dienst führt dazu, dass die Ausnahme in DataContractJsonSerializer , da die Webdienst-Formatdefinition der Reihenfolge im Proxy Vorrang hat.If ASMX Web Service is added first, invoking method on WCF service causes exception in DataContractJsonSerializer because the Web Service style definition of the order in the proxy takes precedence.

Es gibt bedeutende Unterschiede im Verhalten von DataContractJsonSerializer und dem ASP.NET AJAX JavaScriptSerializer.There are significant differences in behavior between the DataContractJsonSerializer and the ASP.NET AJAX JavaScriptSerializer. Beispielsweise stellt der DataContractJsonSerializer ein Wörterbuch als Array von Schlüssel-Wert-Paaren dar, wohingegen der ASP.NET AJAX JavaScriptSerializer ein Wörterbuch als tatsächliche JSON-Objekte darstellt.For example, the DataContractJsonSerializer represents a dictionary as an array of key/value pairs, whereas the ASP.NET AJAX JavaScriptSerializer represents a dictionary as actual JSON objects. Deshalb ist das Folgende die Darstellung eines Wörterbuchs in ASP.NET AJAX.So the following is the dictionary represented in ASP.NET AJAX.

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

Dieses Wörterbuch wird entsprechend der folgenden Liste in JSON-Objekten dargestellt:This dictionary is represented in JSON objects as shown in the following list:

Der DataContractJsonSerializer ist insofern leistungsfähiger, als dass er Wörterbücher handhaben kann, bei denen der Schlüsseltyp keine Zeichenfolge ist. Der JavaScriptSerializer kann dies nicht.The DataContractJsonSerializer is more powerful in the sense that it can handle dictionaries where the key type is not string, while the JavaScriptSerializer cannot. Letzterer ist jedoch JSON-freundlicher.But the latter is more JSON-friendly.

Die wichtigsten Unterschiede zwischen diesen Serialisierern werden in der folgenden Tabelle zusammengefasst.The significant differences between these serializers are summarized in the following table.

UnterschiedskategorieCategory of Differences DataContractJsonSerializerDataContractJsonSerializer ASP.NET AJAX JavaScriptSerializerASP.NET AJAX JavaScriptSerializer
Deserialisieren des leeren Puffers (new byte[0]) in Object (oder Uri oder andere Klassen).Deserializing the empty buffer (new byte[0]) into Object (or Uri, or some other classes). SerializationExceptionSerializationException nullnull
Serialisierung von ValueSerialization of Value {} (oder {"__type": "#System"}){} (or {"__type":"#System"}) NullNull
Serialisierung der privaten Member von [Serializable]-Typen.Serialization of the private members of [Serializable] types. serialisiertserialized nicht serialisiertnot serialized
Serialisierung der öffentlichen Eigenschaften von ISerializable-TypenSerialization of the public properties of ISerializable types. nicht serialisiertnot serialized serialisiertserialized
"Erweiterungen" von JSON"Extensions" of JSON Entspricht der JSON-Spezifikation, die erfordert, dass Objektmembernamen in Anführungszeichen gesetzt werden müssen ({"a":"hello"}).Adheres to the JSON specification, which requires quotes on object member names ({"a":"hello"}). Lässt Namen von Objektmembern ohne Anführungszeichen zu ({a:"hello"}).Supports the names of object members without quotes ({a:"hello"}).
DateTime UTC (Coordinated Universal Time)DateTime Coordinated Universal Time (UTC) Unterstützt keine Format "\/Date(123456789U)\/" oder "\/Date\(\d+ (U|(\+\-[\d{4}]))?\) \\/)".Does not support format "\/Date(123456789U)\/" or "\/Date\(\d+(U|(\+\-[\d{4}]))?\)\\/)". Unterstützt das Format "\/Date(123456789U)\/" und "\/Date\(\d+ (U|(\+\-[\d{4}]))?\) \ \/) "als DateTime-Werte.Supports format "\/Date(123456789U)\/" and "\/Date\(\d+(U|(\+\-[\d{4}]))?\)\\/)" as DateTime values.
Darstellung von WörterbüchernRepresentation of dictionaries Ein Array von KeyValuePair<K, V >, behandelt Schlüsseltypen, die keine Zeichenfolgen sind.An array of KeyValuePair<K,V>, handles key types that are not strings. Als tatsächliche JSON-Objekte, behandelt aber nur Schlüsseltypen, die Zeichenfolgen sind.As actual JSON objects - but only handles key types that are strings.
EscapezeichenEscaped characters Immer mit einem Schrägstrich (/) als Escapezeichen; lässt nie ungültige JSON-Zeichen ohne Escapezeichen wie "\n" zu.Always with an escape forward slash (/); never allows un-escaped invalid JSON characters, such as "\n". Mit einem Schrägstrich (/) als Escapezeichen für DateTime-Werte.With an escape forward slash (/) for DateTime values.

Siehe auchSee Also

Vorgehensweise: Verwenden der Konfiguration zum Hinzufügen eines ASP.NET AJAX-EndpunktsHow to: Use Configuration to Add an ASP.NET AJAX Endpoint