Nasıl yapılır: AJAX Etkinleştirilmiş ASP.NET Web Hizmetlerini WCF'ye Taşıma
Bu konuda, temel ASP.NET AJAX hizmetini eşdeğer bir AJAX özellikli Windows Communication Foundation (WCF) hizmetine geçirme yordamları özetlenmiştir. ASP.NET AJAX hizmetinin işlevsel olarak eşdeğer bir WCF sürümünün nasıl oluşturulacağını gösterir. İki hizmet yan yana kullanılabilir veya WCF hizmeti ASP.NET AJAX hizmetini değiştirmek için kullanılabilir.
Mevcut ASP.NET AJAX hizmetini WCF AJAX hizmetine geçirmek size aşağıdaki avantajları sağlar:
Minimum ek yapılandırma ile AJAX hizmetinizi SOAP hizmeti olarak kullanıma sunmanız gerekir.
İzleme gibi WCF özelliklerinden yararlanabilirsiniz.
Aşağıdaki yordamlarda Visual Studio 2012 kullandığınız varsayılır.
Bu konuda özetlenen yordamlardan elde edilen kod, aşağıdaki yordamlarda verilen örnekte verilmiştir.
AJAX özellikli uç nokta aracılığıyla WCF hizmetini kullanıma açma hakkında daha fazla bilgi için Bkz . Nasıl yapılır: ASP.NET AJAX Uç Noktası Eklemek için Yapılandırmayı Kullanma.
ASP.NET Web hizmeti uygulamasını oluşturmak ve test etmek için
Visual Studio 2012'i açın.
Dosya menüsünden Yeni'yi, Proje'yi ve sonra Web'i ve ardından Web Hizmeti Uygulaması'nı ASP.NET seçin.
Projeyi
ASPHello
adlandırın ve Tamam'a tıklayın.Bu hizmet için AJAX'ı etkinleştirmek için içeren
System.Web.Script.Services.ScriptService]
Service1.asmx.cs dosyasındaki satırın açıklamasını kaldırın.Derle menüsünden Çözüm Derle'yi seçin.
Hata Ayıkla menüsünden Hata Ayıklama Olmadan Başlat’ı seçin.
Oluşturulan Web sayfasında işlemi seçin
HelloWorld
.Test sayfasında Çağır düğmesine
HelloWorld
tıklayın. Aşağıdaki XML yanıtını almanız gerekir.<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://tempuri.org/">Hello World</string>
Bu yanıt, artık AJAX hizmetine ASP.NET bir işleve sahip olduğunuzu ve özellikle hizmetin artık Http POST isteklerine yanıt veren ve XML döndüren Service1.asmx/HelloWorld'de bir uç nokta ortaya çıkardığını onaylar.
Artık bu hizmeti WCF AJAX hizmetini kullanacak şekilde dönüştürmeye hazırsınız.
Eşdeğer bir WCF AJAX hizmet uygulaması oluşturmak için
ASPHello projesine sağ tıklayın ve Ekle'yi, ardından Yeni Öğe'yi ve ardından AJAX özellikli WCF Hizmeti'ni seçin.
Hizmeti
WCFHello
adlandırın ve Ekle'ye tıklayın.WCFHello.svc.cs dosyasını açın.
Service1.asmx.cs aşağıdaki işlemin uygulamasını
HelloWorld
kopyalayın.public string HelloWorld() { return "Hello World"; }
İşlemin
HelloWorld
kopyalanan uygulamasını aşağıdaki kodun yerine WCFHello.svc.cs dosyasına yapıştırın.public void DoWork() { // Add your operation implementation here return; }
özniteliğini
Namespace
ServiceContractAttribute olarakWCFHello
belirtin.[ServiceContract(Namespace="WCFHello")] [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)] public class WCFHello { … }
WebInvokeAttribute işlemine
HelloWorld
öğesini ekleyin ve özelliğini döndürecek Xmlşekilde ayarlayınResponseFormat. Ayarlanmadıysa varsayılan dönüş türünün olduğunu Jsonunutmayın.[OperationContract] [WebInvoke(ResponseFormat=WebMessageFormat.Xml)] public string HelloWorld() { return "Hello World"; }
Derle menüsünden Çözüm Derle'yi seçin.
WCFHello.svc dosyasını açın ve Hata Ayıklama menüsünden Hata Ayıklama Olmadan Başlat'ı seçin.
Hizmet artık http POST isteklerine yanıt veren konumunda
WCFHello.svc/HelloWorld
bir uç nokta kullanıma sunar. HTTP POST istekleri tarayıcıdan test edilemez, ancak uç nokta XML'den sonra XML döndürür.<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
WCFHello.svc/HelloWorld
veService1.aspx/HelloWorld
uç noktaları artık işlevsel olarak eşdeğerdir.
Örnek
Bu konuda özetlenen yordamlardan elde edilen kod aşağıdaki örnekte verilmiştir.
//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].
}
}
türü XmlDocument tarafından DataContractJsonSerializer serileştirilebilir XmlSerializerolmadığından tarafından desteklenmez. Bunun yerine bir XDocument tür kullanabilir veya seri hale getirebilirsiniz DocumentElement .
ASMX Web hizmetleri yan yana WCF hizmetlerine yükseltiliyor ve geçiriliyorsa, istemcide iki türü aynı ada eşlemekten kaçının. Bu, ve içinde aynı tür kullanılıyorsa seri hale getiricilerde WebMethodAttributeServiceContractAttributebir özel duruma neden olur:
İlk olarak WCF hizmeti eklenirse, ara sunucudaki sıranın WCF stil tanımı öncelikli olduğundan ASMX Web Hizmeti'nde yöntemini çağırmak içinde özel duruma ConvertValue(Object, Type, String) neden olur.
İlk olarak ASMX Web Hizmeti eklenirse, ara sunucudaki sıranın Web Hizmeti stil tanımı öncelikli olduğundan WCF hizmetindeki çağırma yöntemi içinde özel duruma DataContractJsonSerializer neden olur.
ve ASP.NET AJAX JavaScriptSerializerarasındaki DataContractJsonSerializer davranışta önemli farklılıklar vardır. Örneğin, DataContractJsonSerializer bir sözlüğü anahtar/değer çiftleri dizisi olarak temsil ederken, ASP.NET AJAX JavaScriptSerializer gerçek JSON nesneleri olarak bir sözlüğü temsil eder. Bu nedenle, ASP.NET AJAX'ta temsil edilen sözlük aşağıdadır.
Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("one", 1);
d.Add("two", 2);
Bu sözlük, aşağıdaki listede gösterildiği gibi JSON nesnelerinde temsil edilir:
[{"Key":"one","Value":1},{"Key":"two","Value":2}] tarafından DataContractJsonSerializer
AJAX tarafından ASP.NET {"one":1,"two":2} JavaScriptSerializer
DataContractJsonSerializer, anahtar türünün dize JavaScriptSerializer olmadığı sözlükleri işleyebildiği ve işleyemediği için daha güçlüdür. Ancak ikincisi daha JSON dostudur.
Bu serileştiriciler arasındaki önemli farklar aşağıdaki tabloda özetlenir.
Fark kategorisi | DataContractJsonSerializer | ASP.NET AJAX JavaScriptSerializer |
---|---|---|
Boş arabelleğin seri durumdan çıkarılması (yeni bayt[0]) içine Object (veya Uriveya başka sınıflar). | Serializationexception | boş |
Seri hale getirme Value | {} (veya {"__type":"#System"}) | Boş |
[Serializable] türlerinin özel üyelerinin seri hale getirilmesi. | Seri | serileştirilmemiş |
Türlerin genel özelliklerinin seri ISerializable hale getirilmesi. | serileştirilmemiş | Seri |
JSON'un "Uzantıları" | Nesne üye adlarında ({"a":"hello"}) tırnak işareti gerektiren JSON belirtimine bağlı kalmaktadır. | Tırnak işareti olmayan nesne üyelerinin adlarını destekler ({a:"hello"}). |
DateTime Eşgüdümlü Evrensel Saat (UTC) | "\/Date(123456789U)\/" veya "\/Date\(\d+(U|( biçimini desteklemez \+\-[\d{4}]))?\)\\/)". | "\/Date(123456789U)\/" ve "\/Date\(\d+(U|( biçimini destekler \+\-[\d{4}]))?\)\\/)" tarih saat değerleri olarak. |
Sözlüklerin gösterimi | KeyValuePair<K,V> dizisi, dize olmayan anahtar türlerini işler. | Gerçek JSON nesneleri olarak - ancak yalnızca dize olan anahtar türlerini işler. |
Kaçış karakterleri | Her zaman bir kaçış eğik çizgiyle (/); hiçbir zaman "\n" gibi kaçışsız geçersiz JSON karakterlerine izin vermez. | DateTime değerleri için bir kaçış eğik çizgi (/) ile. |