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

  1. Visual Studio 2012'i açın.

  2. Dosya menüsünden Yeni'yi, Proje'yi ve sonra Web'i ve ardından Web Hizmeti Uygulaması'nı ASP.NET seçin.

  3. Projeyi ASPHello adlandırın ve Tamam'a tıklayın.

  4. 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.

  5. Derle menüsünden Çözüm Derle'yi seçin.

  6. Hata Ayıkla menüsünden Hata Ayıklama Olmadan Başlat’ı seçin.

  7. Oluşturulan Web sayfasında işlemi seçin HelloWorld .

  8. 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>
    
  9. 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

  1. ASPHello projesine sağ tıklayın ve Ekle'yi, ardından Yeni Öğe'yi ve ardından AJAX özellikli WCF Hizmeti'ni seçin.

  2. Hizmeti WCFHello adlandırın ve Ekle'ye tıklayın.

  3. WCFHello.svc.cs dosyasını açın.

  4. Service1.asmx.cs aşağıdaki işlemin uygulamasını HelloWorld kopyalayın.

    public string HelloWorld()
    {
        return "Hello World";
    }
    
  5. İş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;
    }
    
  6. özniteliğini NamespaceServiceContractAttribute olarak WCFHellobelirtin.

    [ServiceContract(Namespace="WCFHello")]
    [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
    public class WCFHello
    { … }
    
  7. 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";
    }
    
  8. Derle menüsünden Çözüm Derle'yi seçin.

  9. WCFHello.svc dosyasını açın ve Hata Ayıklama menüsünden Hata Ayıklama Olmadan Başlat'ı seçin.

  10. Hizmet artık http POST isteklerine yanıt veren konumunda WCFHello.svc/HelloWorldbir 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>
    
  11. WCFHello.svc/HelloWorld ve Service1.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:

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.

Ayrıca bkz.