Sdílet prostřednictvím


Postupy: Migrace webových služeb ASP.NET s podporou AJAXu na službu WCF

Toto téma popisuje postupy migrace základní služby ASP.NET AJAX do ekvivalentní služby WINDOWS Communication Foundation (WCF) s podporou AJAX. Ukazuje, jak vytvořit funkčně ekvivalentní verzi WCF služby ASP.NET AJAX. Tyto dvě služby je pak možné používat vedle sebe nebo lze službu WCF použít k nahrazení služby ASP.NET AJAX.

Migrace existující služby ASP.NET AJAX do služby WCF AJAX nabízí následující výhody:

  • Službu AJAX můžete zveřejnit jako službu SOAP s minimální další konfigurací.

  • Výhody funkcí WCF, jako je trasování atd., můžete využít.

Následující postupy předpokládají, že používáte Visual Studio 2012.

Kód, který je výsledkem postupů popsaných v tomto tématu, je uvedený v příkladu následujících postupů.

Další informace o zveřejnění služby WCF prostřednictvím koncového bodu s podporou AJAX najdete v tématu Postupy: Použití konfigurace k přidání tématu o koncovém bodu ajax ASP.NET.

Vytvoření a otestování aplikace webové služby ASP.NET

  1. Otevřete Visual Studio 2012.

  2. V nabídce Soubor vyberte Nový, Potom Project, Pak Web a pak vyberte ASP.NET Aplikace webové služby.

  3. Pojmenujte projekt ASPHello a klikněte na TLAČÍTKO OK.

  4. Odkomentujte řádek v souboru Service1.asmx.cs, který obsahuje System.Web.Script.Services.ScriptService] povolení AJAX pro tuto službu.

  5. V nabídce Sestavení vyberte Sestavit řešení.

  6. V nabídce Ladit vyberte Spustit bez ladění.

  7. Na vygenerované webové stránce vyberte HelloWorld operaci.

  8. Klikněte na tlačítko Vyvolat na HelloWorld testovací stránce. Měla by se zobrazit následující odpověď XML.

    <?xml version="1.0" encoding="utf-8" ?>
    <string xmlns="http://tempuri.org/">Hello World</string>
    
  9. Tato odpověď potvrzuje, že teď máte funkční službu ASP.NET AJAX a zejména že služba vydala koncový bod na webu Service1.asmx/HelloWorld, který reaguje na požadavky HTTP POST a vrací KÓD XML.

    Nyní jste připraveni tuto službu převést tak, aby používala službu WCF AJAX.

Vytvoření ekvivalentní aplikace služby WCF AJAX

  1. Klikněte pravým tlačítkem myši na projekt ASPHello a vyberte Přidat, pak Novou položku a potom SLUŽBU WCF s podporou AJAX.

  2. Pojmenujte službu WCFHello a klikněte na Přidat.

  3. Otevřete soubor WCFHello.svc.cs.

  4. Z Service1.asmx.cs zkopírujte následující implementaci HelloWorld operace.

    public string HelloWorld()
    {
        return "Hello World";
    }
    
  5. Vložte zkopírovanou implementaci HelloWorld operace do souboru WCFHello.svc.cs místo následujícího kódu.

    public void DoWork()
    {
          // Add your operation implementation here
          return;
    }
    
  6. Namespace Zadejte atribut pro ServiceContractAttribute hodnotu WCFHello.

    [ServiceContract(Namespace="WCFHello")]
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
    public class WCFHello
    { … }
    
  7. WebInvokeAttribute Přidejte do HelloWorld operace a nastavte ResponseFormat vlastnost tak, aby se vrátila Xml. Všimněte si, že pokud není nastavena, výchozí návratový typ je Json.

    [OperationContract]
    [WebInvoke(ResponseFormat=WebMessageFormat.Xml)]
    public string HelloWorld()
    {
        return "Hello World";
    }
    
  8. V nabídce Sestavení vyberte Sestavit řešení.

  9. Otevřete soubor WCFHello.svc a v nabídce Ladění vyberte Spustit bez ladění.

  10. Služba teď zveřejňuje koncový bod, který WCFHello.svc/HelloWorldreaguje na požadavky HTTP POST. Požadavky HTTP POST nelze testovat z prohlížeče, ale koncový bod vrátí XML následující XML.

    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
    
  11. Service1.aspx/HelloWorld Koncové WCFHello.svc/HelloWorld body jsou teď funkčně ekvivalentní.

Příklad

Kód, který je výsledkem postupů popsaných v tomto tématu, je uveden v následujícím příkladu.

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

Typ XmlDocument není podporován DataContractJsonSerializer , protože není serializovatelný XmlSerializer. Můžete použít buď XDocument typ, nebo serializovat DocumentElement místo toho.

Pokud se webové služby ASMX upgradují a migrují souběžně na služby WCF, vyhněte se mapování dvou typů na stejný název v klientovi. To způsobí výjimku v serializátorech, pokud je stejný typ použit v WebMethodAttribute a:ServiceContractAttribute

  • Pokud se služba WCF přidá jako první, vyvolání metody ve webové službě ASMX způsobí výjimku, ConvertValue(Object, Type, String) protože přednost má definice stylu WCF pořadí v proxy serveru.

  • Pokud je webová služba ASMX přidána jako první, vyvolání metody ve službě WCF způsobí výjimku, DataContractJsonSerializer protože definice stylu webové služby pořadí v proxy má přednost.

Existují významné rozdíly v chování mezi DataContractJsonSerializer a ASP.NET AJAX JavaScriptSerializer. DataContractJsonSerializer Například představuje slovník jako pole párů klíč/hodnota, zatímco ASP.NET AJAX JavaScriptSerializer představuje slovník jako skutečné objekty JSON. Proto je slovník reprezentovaný ve ASP.NET AJAX.

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

Tento slovník je reprezentován v objektech JSON, jak je znázorněno v následujícím seznamu:

Výkonnější DataContractJsonSerializer je v tom smyslu, že dokáže zpracovat slovníky, kde typ klíče není řetězec, zatímco JavaScriptSerializer nemůže. Ale ten druhý je přívětivější pro JSON.

Významné rozdíly mezi těmito serializátory jsou shrnuty v následující tabulce.

Kategorie rozdílů Datacontractjsonserializer ASP.NET AJAX JavaScriptSerializer
Deserializace prázdné vyrovnávací paměti (nový bajt[0]) do Object (nebo Uri, nebo některé jiné třídy). Serializationexception null
Serializace Value {} (nebo {"__type":"#System"}) Null
Serializace soukromých členů [Serializovatelných] typů. Serializovat serializováno
Serializace veřejných vlastností ISerializable typů. serializováno Serializovat
Rozšíření JSON Dodržuje specifikaci JSON, která vyžaduje uvozovky u názvů členů objektu ({"a":"hello"}). Podporuje názvy členů objektu bez uvozovek ({a:"hello"}).
DateTime Koordinovaný univerzální čas (UTC) Nepodporuje formát \/Date(123456789U)\/nebo \/Date\(\d+(U|( \+\\-[\d{4}])?\)\\/)". Podporuje formát \/Date(123456789U)\/" a "\/Date\(\d+(U|( \+\\-[\d{4}])?\)\\)" jako hodnoty DateTime.
Reprezentace slovníků Pole KeyValuePair<K,V> zpracovává typy klíčů, které nejsou řetězce. Jako skutečné objekty JSON – ale zpracovává pouze typy klíčů, které jsou řetězce.
Řídicí znaky Vždy s řídicím lomítkem (/); Nikdy nepoužívejte neplatné znaky JSON bez řídicího znaku, například \n. Pomocí řídicího lomítka (/) pro hodnoty DateTime.

Viz také