Instrukcje: Migrowanie usług sieci Web obsługujących technologię AJAX i opartych na platformie ASP.NET do programu WCF
W tym temacie opisano procedury migracji podstawowej usługi AJAX ASP.NET do równoważnej usługi Windows Communication Foundation (WCF) z obsługą technologii AJAX. Pokazano w nim, jak utworzyć funkcjonalnie równoważną wersję usługi WCF ASP.NET AJAX. Te dwie usługi można następnie używać obok siebie lub usługi WCF można użyć do zastąpienia usługi ASP.NET AJAX.
Migrowanie istniejącej usługi AJAX ASP.NET do usługi WCF AJAX zapewnia następujące korzyści:
Możesz uwidocznić usługę AJAX jako usługę SOAP z minimalną dodatkową konfiguracją.
Możesz korzystać z funkcji WCF, takich jak śledzenie itd.
Poniższe procedury zakładają, że używasz programu Visual Studio 2012.
Kod, który wynika z procedur opisanych w tym temacie, znajduje się w przykładzie poniżej procedur.
Aby uzyskać więcej informacji na temat uwidaczniania usługi WCF za pośrednictwem punktu końcowego z obsługą technologii AJAX, zobacz temat How to Use Configuration to Add an ASP.NET AJAX Endpoint (Instrukcje: używanie konfiguracji do dodawania punktu końcowego AJAX ASP.NET AJAX).
Aby utworzyć i przetestować aplikację usługi sieci Web ASP.NET
Otwórz program Visual Studio 2012.
W menu Plik wybierz pozycję Nowy, a następnie pozycję Projekt, Sieć Web, a następnie wybierz pozycję ASP.NET Aplikacja usługi sieci Web.
Nadaj projektowi
ASPHello
nazwę i kliknij przycisk OK.Usuń komentarz z wiersza w pliku Service1.asmx.cs, który zawiera
System.Web.Script.Services.ScriptService]
, aby włączyć funkcję AJAX dla tej usługi.W menu Kompilacja wybierz pozycję Kompiluj rozwiązanie.
Z menu Debuguj wybierz pozycję Uruchom bez debugowania.
Na wygenerowanej stronie sieci Web wybierz operację
HelloWorld
.Kliknij przycisk Wywołaj na
HelloWorld
stronie testu. Powinna zostać wyświetlona następująca odpowiedź XML.<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://tempuri.org/">Hello World</string>
Ta odpowiedź potwierdza, że masz teraz działającą usługę ASP.NET AJAX, a w szczególności, że usługa uwidoczniła punkt końcowy w usłudze Service1.asmx/HelloWorld, który odpowiada na żądania HTTP POST i zwraca kod XML.
Teraz możesz przystąpić do konwertowania tej usługi w celu korzystania z usługi WCF AJAX.
Aby utworzyć równoważną aplikację usługi WCF AJAX
Kliknij prawym przyciskiem myszy projekt ASPHello i wybierz polecenie Dodaj, a następnie pozycję Nowy element, a następnie usługę WCF z obsługą technologii AJAX.
Nadaj usłudze
WCFHello
nazwę i kliknij przycisk Dodaj.Otwórz plik WCFHello.svc.cs.
Z Service1.asmx.cs skopiuj następującą implementację
HelloWorld
operacji.public string HelloWorld() { return "Hello World"; }
Wklej, aby skopiować implementację
HelloWorld
operacji do pliku WCFHello.svc.cs zamiast następującego kodu.public void DoWork() { // Add your operation implementation here return; }
Namespace
Określ atrybut jako ServiceContractAttributeWCFHello
.[ServiceContract(Namespace="WCFHello")] [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)] public class WCFHello { … }
Dodaj element WebInvokeAttribute do
HelloWorld
operacji i ustaw ResponseFormat właściwość , aby zwrócić Xmlwartość . Należy pamiętać, że jeśli nie zostanie ustawiona, domyślnym typem zwracania jest Json.[OperationContract] [WebInvoke(ResponseFormat=WebMessageFormat.Xml)] public string HelloWorld() { return "Hello World"; }
W menu Kompilacja wybierz pozycję Kompiluj rozwiązanie.
Otwórz plik WCFHello.svc, a następnie z menu Debuguj wybierz pozycję Rozpocznij bez debugowania.
Usługa uwidacznia teraz punkt końcowy w adresie
WCFHello.svc/HelloWorld
, który odpowiada na żądania HTTP POST. Nie można przetestować żądań HTTP POST z przeglądarki, ale punkt końcowy zwraca kod XML po kodzie XML.<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
Punkty
WCFHello.svc/HelloWorld
końcowe iService1.aspx/HelloWorld
są teraz funkcjonalnie równoważne.
Przykład
Kod, który wynika z procedur opisanych w tym temacie, znajduje się w poniższym przykładzie.
//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 nie jest obsługiwany przez element , DataContractJsonSerializer ponieważ nie można go serializować przez element XmlSerializer. Można użyć XDocument typu lub serializować DocumentElement zamiast tego.
Jeśli usługi sieci Web ASMX są uaktualniane i migrowane obok siebie do usług WCF, unikaj mapowania dwóch typów na tę samą nazwę na klienta. Powoduje to wyjątek w serializatorach, jeśli ten sam typ jest używany w obiekcie WebMethodAttribute i ServiceContractAttribute:
Jeśli usługa WCF zostanie dodana jako pierwsza, wywołanie metody w usłudze sieci Web ASMX powoduje wyjątek, ConvertValue(Object, Type, String) ponieważ definicja stylu WCF kolejności na serwerze proxy ma pierwszeństwo.
Jeśli usługa sieci Web ASMX zostanie dodana jako pierwsza, wywołanie metody w usłudze WCF powoduje wyjątek DataContractJsonSerializer , ponieważ definicja stylu usługi sieci Web kolejności na serwerze proxy ma pierwszeństwo.
Istnieją znaczące różnice w zachowaniu DataContractJsonSerializer między a ASP.NET AJAX JavaScriptSerializer. Na przykład DataContractJsonSerializer obiekt reprezentuje słownik jako tablicę par klucz/wartość, natomiast ASP.NET AJAX JavaScriptSerializer reprezentuje słownik jako rzeczywiste obiekty JSON. Poniżej przedstawiono słownik reprezentowany w ASP.NET AJAX.
Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("one", 1);
d.Add("two", 2);
Ten słownik jest reprezentowany w obiektach JSON, jak pokazano na poniższej liście:
[{"Key":"one","Value":1},{"Key":"two","Value":2}] przez DataContractJsonSerializer
{"one":1,"two":2} przez ASP.NET AJAX JavaScriptSerializer
Jest DataContractJsonSerializer bardziej zaawansowany w tym sensie, że może obsługiwać słowniki, w których typ klucza nie jest ciągiem, podczas gdy JavaScriptSerializer nie może. Ale ten ostatni jest bardziej przyjazny dla formatu JSON.
Istotne różnice między tymi serializatorami zostały podsumowane w poniższej tabeli.
Kategoria różnic | Datacontractjsonserializer | ASP.NET AJAX JavaScriptSerializer |
---|---|---|
Deserializowanie pustego buforu (nowy bajt[0]) do Object (lub Uri, lub innych klas). | Serializationexception | null |
Serializacja Value | {} (lub {"__type":"#System"}) | Null (zero) |
Serializacja prywatnych elementów członkowskich typów [Serializable]. | Szeregowane | nie serializowane |
Serializacja właściwości ISerializable publicznych typów. | nie serializowane | Szeregowane |
"Rozszerzenia" w formacie JSON | Jest zgodna ze specyfikacją JSON, która wymaga cudzysłowów w nazwach elementów członkowskich obiektu ({"a":"hello"}). | Obsługuje nazwy elementów członkowskich obiektów bez cudzysłowów ({a:"hello"}). |
DateTime Uniwersalny czas koordynowany (UTC) | Nie obsługuje formatu "\/Date(123456789U)\/" ani "\/Date\(\d+(U|( \+\-[\d{4}]))?\)\\/)". | Obsługuje format "\/Date(123456789U)\/" i "\/Date\(\d+(U|( \+\-[\d{4}]))\)\\/)" jako wartości DateTime. |
Reprezentacja słowników | Tablica keyValuePair<K,V> obsługuje typy kluczy, które nie są ciągami. | Jako rzeczywiste obiekty JSON — ale obsługuje tylko typy kluczy, które są ciągami. |
Znaki ucieczki | Zawsze z ukośnikiem ucieczki do przodu (/); nigdy nie zezwala na nieprawidłowe znaki JSON, takie jak "\n". | Z ukośnikiem ucieczki (/) dla wartości DateTime. |