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
Otevřete Visual Studio 2012.
V nabídce Soubor vyberte Nový, Potom Project, Pak Web a pak vyberte ASP.NET Aplikace webové služby.
Pojmenujte projekt
ASPHello
a klikněte na TLAČÍTKO OK.Odkomentujte řádek v souboru Service1.asmx.cs, který obsahuje
System.Web.Script.Services.ScriptService]
povolení AJAX pro tuto službu.V nabídce Sestavení vyberte Sestavit řešení.
V nabídce Ladit vyberte Spustit bez ladění.
Na vygenerované webové stránce vyberte
HelloWorld
operaci.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>
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
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.
Pojmenujte službu
WCFHello
a klikněte na Přidat.Otevřete soubor WCFHello.svc.cs.
Z Service1.asmx.cs zkopírujte následující implementaci
HelloWorld
operace.public string HelloWorld() { return "Hello World"; }
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; }
Namespace
Zadejte atribut pro ServiceContractAttribute hodnotuWCFHello
.[ServiceContract(Namespace="WCFHello")] [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)] public class WCFHello { … }
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"; }
V nabídce Sestavení vyberte Sestavit řešení.
Otevřete soubor WCFHello.svc a v nabídce Ladění vyberte Spustit bez ladění.
Služba teď zveřejňuje koncový bod, který
WCFHello.svc/HelloWorld
reaguje 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>
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:
[{"Klíč":"one","Hodnota":1},{"Klíč":"two";"Hodnota":2}] podle DataContractJsonSerializer
{"one":1,"two":2} ASP.NET AJAX JavaScriptSerializer
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. |