Dela via


Gör så här: Migrera AJAX-aktiverade ASP.NET Webbtjänster till WCF

Det här avsnittet beskriver procedurer för att migrera en grundläggande ASP.NET AJAX-tjänst till en motsvarande AJAX-aktiverad WCF-tjänst (Windows Communication Foundation). Den visar hur du skapar en funktionellt likvärdig WCF-version av en ASP.NET AJAX-tjänst. De två tjänsterna kan sedan användas sida vid sida, eller så kan WCF-tjänsten användas för att ersätta den ASP.NET AJAX-tjänsten.

Om du migrerar en befintlig ASP.NET AJAX-tjänst till en WCF AJAX-tjänst får du följande fördelar:

  • Du kan exponera AJAX-tjänsten som en SOAP-tjänst med minimal extra konfiguration.

  • Du kan dra nytta av WCF-funktioner som spårning och så vidare.

Följande procedurer förutsätter att du använder Visual Studio 2012.

Koden som är resultatet av de procedurer som beskrivs i det här avsnittet finns i exemplet som följer procedurerna.

Mer information om hur du exponerar en WCF-tjänst via en AJAX-aktiverad slutpunkt finns i artikeln Så här använder du konfiguration för att lägga till en ASP.NET AJAX-slutpunkt .

Skapa och testa ASP.NET-webbtjänstprogrammet

  1. Öppna Visual Studio 2012.

  2. På menyn Arkiv väljer du Nytt, sedan Projekt, sedan Webb och sedan ASP.NET webbtjänstprogram.

  3. Namnge projektet ASPHello och klicka på OK.

  4. Ta bort kommentaren till raden i den Service1.asmx.cs fil som innehåller System.Web.Script.Services.ScriptService] för att aktivera AJAX för den här tjänsten.

  5. På menyn Skapa väljer du Skapa lösning.

  6. På menyn Felsöka väljer du Starta utan felsökning.

  7. Välj åtgärden på HelloWorld den webbsida som genereras.

  8. Klicka på knappen AnropaHelloWorld testsidan. Du bör få följande XML-svar.

    <?xml version="1.0" encoding="utf-8" ?>
    <string xmlns="http://tempuri.org/">Hello World</string>
    
  9. Det här svaret bekräftar att du nu har en fungerande ASP.NET AJAX-tjänsten och i synnerhet att tjänsten nu har exponerat en slutpunkt på Service1.asmx/HelloWorld som svarar på HTTP POST-begäranden och returnerar XML.

    Nu är du redo att konvertera den här tjänsten till att använda en WCF AJAX-tjänst.

Skapa ett motsvarande WCF AJAX-tjänstprogram

  1. Högerklicka på ASPHello-projektet och välj Lägg till, sedan Nytt objekt och sedan AJAX-aktiverad WCF-tjänst.

  2. Namnge tjänsten WCFHello och klicka på Lägg till.

  3. Öppna filen WCFHello.svc.cs.

  4. Kopiera följande implementering av HelloWorld åtgärden från Service1.asmx.cs.

    public string HelloWorld()
    {
        return "Hello World";
    }
    
  5. Klistra in för att kopiera implementeringen av HelloWorld åtgärden till den WCFHello.svc.cs filen i stället för följande kod.

    public void DoWork()
    {
          // Add your operation implementation here
          return;
    }
    
  6. Ange attributet Namespace för ServiceContractAttribute som WCFHello.

    [ServiceContract(Namespace="WCFHello")]
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
    public class WCFHello
    { … }
    
  7. WebInvokeAttribute Lägg till i åtgärden HelloWorld och ange ResponseFormat egenskapen för att returnera Xml. Observera att om den inte anges är Jsonstandardreturtypen .

    [OperationContract]
    [WebInvoke(ResponseFormat=WebMessageFormat.Xml)]
    public string HelloWorld()
    {
        return "Hello World";
    }
    
  8. På menyn Skapa väljer du Skapa lösning.

  9. Öppna filen WCFHello.svc och välj Starta utan felsökningfelsökningsmenyn.

  10. Tjänsten exponerar nu en slutpunkt på , som svarar på WCFHello.svc/HelloWorldHTTP POST-begäranden. DET går inte att testa HTTP POST-begäranden från webbläsaren, men slutpunkten returnerar XML efter XML.

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
    
  11. Slutpunkterna WCFHello.svc/HelloWorldService1.aspx/HelloWorld och är nu funktionellt likvärdiga.

Exempel

Koden som är resultatet av de procedurer som beskrivs i det här avsnittet finns i följande exempel.

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

Typen XmlDocument stöds inte av DataContractJsonSerializer eftersom den inte kan serialiseras av XmlSerializer. Du kan använda antingen en XDocument typ eller serialisera i DocumentElement stället.

Om ASMX-webbtjänster uppgraderas och migreras sida vid sida till WCF-tjänster bör du undvika att mappa två typer till samma namn på klienten. Detta orsakar ett undantag i serialiserare om samma typ används i en WebMethodAttribute och en ServiceContractAttribute:

  • Om WCF-tjänsten läggs till först orsakar anrop av metoden på ASMX-webbtjänsten undantag eftersom ConvertValue(Object, Type, String) WCF-formatdefinitionen för ordningen i proxyn har företräde.

  • Om ASMX-webbtjänsten läggs till först orsakar anropande metod på WCF-tjänsten undantag eftersom DataContractJsonSerializer webbtjänstformatdefinitionen för ordningen i proxyn har företräde.

Det finns betydande skillnader i beteendet mellan DataContractJsonSerializer och ASP.NET AJAX JavaScriptSerializer. Till exempel DataContractJsonSerializer representerar en ordlista som en matris med nyckel/värde-par, medan ASP.NET AJAX JavaScriptSerializer representerar en ordlista som faktiska JSON-objekt. Så följande är ordlistan som representeras i ASP.NET AJAX.

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

Den här ordlistan representeras i JSON-objekt enligt följande lista:

Är DataContractJsonSerializer kraftfullare i den meningen att den kan hantera ordlistor där nyckeltypen inte är sträng, medan den JavaScriptSerializer inte kan. Men det senare är mer JSON-vänligt.

De betydande skillnaderna mellan dessa serialiserare sammanfattas i följande tabell.

Kategori av skillnader DataContractJsonSerializer ASP.NET AJAX JavaScriptSerializer
Deserialisera den tomma bufferten (ny byte[0]) till Object (eller Uri, eller några andra klasser). SerializationException NULL
Serialisering av Value {} (eller {"__type":"#System"}) Null
Serialisering av de privata medlemmarna i [Serializable]-typer. Serialiserad inte serialiserad
Serialisering av offentliga egenskaper för ISerializable typer. inte serialiserad Serialiserad
"Tillägg" för JSON Följer JSON-specifikationen, som kräver citattecken på objektmedlemsnamn ({"a":"hello"}). Stöder namnen på objektmedlemmar utan citattecken ({a:"hello"}).
DateTime Samordnad universell tid (UTC) Stöder inte formatet "\/Date(123456789U)\/" eller "\/Date\(\d+(U|( \+\-[\d{4}]))?\)\\\/)". Stöder formatet "\/Date(123456789U)\/" och "\/Date\(\d+(U|( \+\-[\d{4}]))?\)\\/)" som DateTime-värden.
Representation av ordlistor En matris med KeyValuePair<K,V> hanterar nyckeltyper som inte är strängar. Som faktiska JSON-objekt – men hanterar bara nyckeltyper som är strängar.
Undantagna tecken Alltid med ett escape forward-snedstreck (/); tillåter aldrig ogiltiga JSON-tecken som inte är undantagna, till exempel "\n". Med ett escape forward-snedstreck (/) för DateTime-värden.

Se även