Sabun web servisleri hangi yılda ortaya çıktı? PersonServiceImpl sınıfının listelenmesi

İnternetin gelişmesiyle birlikte dağıtık uygulamalar oluşturmaya ihtiyaç duyulmuştur. Bir bilgisayara yüklenen uygulamalar genellikle üzerinde bulunan kitaplıkları kullanır. Birkaç program bir kitaplığı kullanabilir. Farklı sitelerin onları arayabilmesi için kütüphane analogları İnternette yayınlanabilir mi? Anlaşıldı, evet.

İşletmeler sayfalarında çeşitli bilgiler sağlar. Örneğin, Ford şirketi http://www.Ford.com web sitesinde modeller ve fiyatlar hakkında bilgi yayınlamaktadır. Bu şirketin bayisi de bu bilgilerin web sitesinde olmasını istiyor. Web hizmeti, bir tüketici sitesinin bir sağlayıcı sitesinden bilgi almasına izin verir. Tüketici sitesi, bu bilgileri sayfalarında görüntüler. Bu bilgiyi oluşturacak kod bir kez yazılır ancak birçok tüketici tarafından kullanılabilir. Veriler düz metin olarak sunulur, bu nedenle platformdan bağımsız olarak kullanılabilir.

Web servisleri hem Masaüstü hem de İnternet uygulamalarında yaygın olarak kullanılmaktadır. Uygulamaların kendileri değil, uygulamalar için veri kaynaklarıdır. Onlar özlüyorlar Kullanıcı arayüzü... Web servislerinin ağ üzerinden kullanılması gerekmez - kullanıldıkları projenin bir parçası olabilirler.

Web hizmetleri, standart protokoller ve veri biçimleri aracılığıyla hizmetlerle etkileşime giren harici uygulamalar tarafından kullanılmak üzere sağlanan işlevsellik ve verilerdir. Web servisleri tamamen dil ve platform bağımsızdır. Web hizmetleri teknolojisi, Microsoft'un programlama modelinin temel taşıdır. AĞ.

o Daha fazla gelişme bileşen programlama CORBA ve DCOM. Ancak bu tür bileşenlerin kullanılabilmesi için tüketicinin sistemine kayıt edilmesi gerekmektedir. Bu, web servisleri için gerekli değildir. Bileşenler yerel alan ağlarında iyi çalışır. HTTP, bir uzaktan yordam çağrısı (RPC) protokolü değildir. Aynı kurum içinde bile farklı işletim sistemi bu yalnızca HTTP üzerinden iletişim kurabilir.

Heterojen sistemler - DCOM, CORBA, RMI, IIOP arasında bir iletişim dili oluşturmak için birkaç girişimde bulunulmuştur. Her biri farklı üreticiler tarafından tanıtıldığı ve bu nedenle belirli bir üreticinin teknolojilerine bağlı olduğu için genel dağıtım almadılar. Kimse bir başkasının standardını kabul etmek istemedi. Bu ikilemin üstesinden gelmek için birkaç şirket, HTTP üzerinden mesajlaşma için satıcıdan bağımsız bir standart geliştirmeyi kabul etti. Mayıs 2000'de IBM, Microsoft, HP, Lotus, SAP, UserLand ve diğerleri W3C'ye yaklaştı ve SOAP'ı böyle bir standart için aday olarak ortaya koydu. SOAP, HTTP ve XML olmak üzere iki İnternet standardını birleştirerek uygulama geliştirmede devrim yarattı.

SABUN

Web servisleriyle etkileşimde bulunmak için XML tabanlı SOAP protokolü kullanılır. Yalnızca XML kullanabilirsiniz, ancak bu, her belgenin aslında kendi dilini oluşturduğu çok gevşek bir biçimdir. SABUN bir XML belgesinin biçimi, içindeki belirli öğelerin ve ad alanlarının varlığı hakkında bir kuraldır.

SOAP, DataSet gibi karmaşık veri yapılarını yayınlamanıza ve tüketmenize olanak tanır. Aynı zamanda öğrenmesi de kolaydır. Şimdiki versiyonu SABUN - 1.2.

SOAP, Basit Nesne Erişim Protokolü anlamına gelir. SOAP, uygulamaların HTTP üzerinden iletişim kurmasını kolaylaştırmak için tasarlanmıştır. İnternet üzerinden platformdan bağımsız belirli bir mesajlaşma formatıdır. SOAP mesajı, normal bir XML belgesidir. Standart

Lirik kısım.

Dışarıdan erişilebilir olması gereken belirli bir sistemi uyguladığınızı veya uygulamakta olduğunuzu hayal edin. Onlar. iletişim kurmanız gereken belirli bir sunucu var. Örneğin bir web sunucusu.

Bu sunucu, birçok işlemi gerçekleştirebilir, veritabanı ile çalışabilir, diğer sunuculara bazı üçüncü taraf istekleri gerçekleştirebilir, bir tür hesaplama yapabilir, vb. iyi bilinen senaryosuna göre yaşar ve muhtemelen gelişir (yani geliştiricilerin senaryosuna göre). Bir kişi böyle bir sunucuyla iletişim kurmakla ilgilenmez, çünkü resimler ve diğer kullanıcı dostu içeriklerle güzel sayfalar veremeyebilir / vermeyebilir. Çalışmak ve isteklere veri vermek için yazılır ve çalışır, insan tarafından okunabilir olmalarına dikkat etmeden müşteri bunlarla kendisi ilgilenecektir.

Bu sunucuya atıfta bulunan diğer sistemler, bu sunucudan alınan verileri kendi takdirlerine göre - işlemek, biriktirmek, istemcilerine vermek vb. için - zaten imha edebilir.

Eh, bu tür sunucularla iletişim kurma seçeneklerinden biri SOAP'tır. SOAP xml mesajlaşma protokolü.

Pratik kısım.

Bir web hizmeti (bu, sunucunun sağladığı ve istemcilerin kullandığı şeydir), sunucuyla açık bir şekilde yapılandırılmış mesajlarla iletişim kurmayı mümkün kılar. Gerçek şu ki, web servisi herhangi bir veri kabul etmiyor. Kurallara uymayan herhangi bir mesaj web servisi tarafından hata ile cevaplanacaktır. Bu arada hata, açık bir yapıya sahip xml biçiminde de olacaktır (mesajın metni için doğru değildir).

WSDL (Web Hizmetleri Açıklama Dili). Web hizmeti için mesajların derlendiği kurallar, aşağıdakilerle aynı şekilde açıklanmıştır. xml kullanarak ve ayrıca net bir yapıya sahiptir. Onlar. Bir web hizmeti bir yöntemi çağırma yeteneği sağlıyorsa, istemcilerin bu yöntem için hangi parametrelerin kullanıldığını bilmesini sağlamalıdır. Web hizmeti, Metod1 yöntemi için parametre olarak bir dize bekliyorsa ve dizenin Param1 olarak adlandırılması gerekiyorsa, bu kurallar web hizmeti açıklamasında belirtilecektir.

Parametre olarak, yalnızca basit türler değil, aynı zamanda nesneler, nesne koleksiyonları da iletilebilir. Nesnenin açıklaması, nesnenin her bir bileşeninin açıklamasına indirgenir. Bir nesne birkaç alandan oluşuyorsa, her alanın türü, adı (hangi olası değerler) açıklanır. Alanlar ayrıca karmaşık tipte olabilir ve türlerin tanımı basit olanlarla bitene kadar böyle devam eder - string, boolean, number, date ... Bununla birlikte, bazı spesifik tipler basit olabilir, istemcilerin bunu yapabilmesi önemlidir. İçlerinde hangi değerlerin bulunabileceğini anlayın.

Müşteriler için web hizmetinin url'sini bilmek yeterlidir, wsdl her zaman orada olacaktır, bu web hizmetinin sağladığı yöntemler ve parametreleri hakkında fikir edinebilirsiniz.

Tüm bu çan ve ıslıkların avantajları nelerdir:

  • Çoğu sistemde, yöntemlerin ve türlerin tanımı şurada gerçekleşir: otomatik mod... Onlar. sunucudaki programcının bunu söylemesi yeterli Bu method bir web hizmeti aracılığıyla çağrılabilir ve wsdl açıklaması otomatik olarak oluşturulur.
  • İyi yapılandırılmış bir açıklama, herhangi bir sabun müşterisi tarafından okunabilir. Onlar. web hizmeti ne olursa olsun, müşteri web hizmetinin hangi verileri kabul ettiğini anlayacaktır. Bu açıklamaya göre, müşteri, sözde nesne sınıflarının kendi iç yapısını oluşturabilir. bağlayıcı "ve. Sonuç olarak, web hizmetini kullanan programcının (sözde kod) gibi bir şey yazması gerekir:

    NewUser: = TSoapUser.Create ("Vasya", "Pupkin", "odmin"); soap.AddUser (YeniKullanıcı);

  • Otomatik doğrulama.

    • xml doğrulama. xml iyi biçimlendirilmiş olmalıdır. geçersiz xml - müşteriye hemen bir hata, onun çözmesine izin verin.
    • şema doğrulama. xml belirli bir yapıya sahip olmalıdır. xml şemaya uymuyor - hemen müşteriye bir hata, anlamasına izin verin.
    • veri doğrulaması sabun sunucusu tarafından gerçekleştirilir, böylece veri türleri, kısıtlamalar açıklamaya karşılık gelir.
  • Yetkilendirme ve kimlik doğrulama uygulanabilir ayrı yöntem... doğal olarak. veya http yetkilendirmesini kullanarak.
  • Web servisleri hem sabun protokolü üzerinden hem de http üzerinden yani get istekleri üzerinden çalışabilir. Yani, parametreler basit verilerse (yapı yok), o zaman olağan get www.site.com/users.asmx/GetUser?Name=Vasia'yı çağırabilir veya gönderebilirsiniz. Ancak, bu her yerde ve her zaman değil.
  • ... wikipedia'ya bakın

Ayrıca birçok eksi var:

  • Makul olmayan büyük mesaj boyutu. Pekala, burada xml'nin doğası öyledir ki, format gereksizdir, daha fazla etiket, daha fazla yararsız bilgidir. Ayrıca, sabun kendi fazlalığını ekler. İntranet sistemleri için trafik sorunu internete göre daha az akuttur, bu nedenle sabun yerel bölge ağlarıözellikle daha fazla talep gören Sharepoint, başarılı bir şekilde (ve bazı kısıtlamalarla) iletişim kurabileceğiniz bir sabun web hizmetine sahiptir.
  • Bir web hizmetinin tanımını otomatik olarak değiştirmek tüm istemcileri bozabilir. Eh, herhangi bir sistemde olduğu gibi, eski yöntemlerle geriye dönük uyumluluk desteklenmiyorsa, her şey düşecek ...
  • Eksi değil, dezavantaj. Çağırma yöntemleri için tüm eylemler atomik olmalıdır. Örneğin, bir alt bölümle çalışırken bir işlem başlatabilir, birkaç istek yürütebilir, ardından geri alabilir veya taahhüt edebiliriz. Sabunlarda işlem yoktur. Bir istek, bir yanıt, konuşma biter.
  • Sunucu tarafında ne olduğunu (her şey benim tarafımdan doğru bir şekilde anlatılıyor mu?), İstemcide ne olduğunu (burada bana ne yazıldı?) açıklamasını anlamak oldukça zor olabilir. İstemci tarafıyla uğraşmak ve sunucu programcısını verilerinin yanlış tanımlandığına ikna etmek zorunda kaldığım birkaç kez oldu ve hiçbir şey anlayamadı, çünkü otomatik oluşturma ve o, olduğu gibi, yapmamalı, bu bir yazılım işi. Ve hata doğal olarak yöntemin kodundaydı, programcı onu görmedi.
  • Uygulama, web hizmetleri geliştiricilerinin bu web hizmetlerini kullanan insanlardan çok uzak olduğunu göstermektedir. Herhangi bir isteğe yanıt olarak (dışarıdan geçerli) anlaşılmaz bir "Hata 5. Her şey kötü" hatası gelebilir. Her şey geliştiricilerin vicdanına bağlı :)
  • Muhtemelen hala bir şey hatırlamadım ...

Örnek olarak, açık web hizmeti belavia var:

  • http://86.57.245.235/TimeTable/Service.asmx - giriş noktası, ayrıca üçüncü taraf geliştiriciler için yöntemlerin bir metin açıklaması vardır.
  • http://86.57.245.235/TimeTable/Service.asmx?WSDL - wsdl alınan ve döndürülen verilerin yöntemlerinin ve türlerinin açıklaması.
  • http://86.57.245.235/TimeTable/Service.asmx?op=GetAirportsList - bir xml isteği ve bir xml yanıtı örneği ile belirli bir yöntemin açıklaması.

Manuel olarak aşağıdaki gibi bir istek oluşturabilir ve gönderebilirsiniz:

POST /TimeTable/Service.asmx HTTP / 1.1 Ana Bilgisayar: 86.57.245.235 İçerik Türü: metin / xml; karakter kümesi = utf-8 İçerik Uzunluğu: uzunluk SOAPAction: "http://webservices.belavia.by/GetAirportsList" ru

cevap gelecek:

HTTP / 1.1 200 Tamam Tarih: 30 Eylül 2013 Pazartesi 00:06:44 GMT Sunucusu: Microsoft-IIS / 6.0 X-Powered-By: ASP.NET X-AspNet-Sürüm: 4.0.30319 Önbellek Kontrolü: özel, maks -yaş = 0 İçerik-Türü: metin / xml; karakter kümesi = utf-8 İçerik Uzunluğu: 2940

Shl Daha önce, Aeroflot web hizmeti açıktı, ancak 1C, 8k'ye sabun desteği ekledikten sonra, bir grup 1c beta test cihazı onu başarıyla indirdi. Şimdi orada bir şeyler değişti (adresleri bilmiyorum, ilgilenirseniz arayabilirsiniz).
ZZY Sorumluluk Reddi. Bana hane düzeyinde söyledi. Tekme atabilirsin.

Sorumluluk Reddi:Bu konuyla ilgili birçok makale yazıldı ve elbette tahmin ettiğiniz gibi, bu bir sonraki. Belki ondan yeni bir şey öğreneceksiniz, ancak Google'da kendiniz yapamayacağınız süper gizli hiçbir şey burada açıklanmadı. Sadece kişisel deneyimden notlar.

Tanıtım

Durumu yalnızca üçüncü taraf bir web hizmeti olduğunda ve görev veri alışverişini kurmak olduğunda ele alacağız.

Hizmetin yapısı dosyada açıklanmıştır WSDL(İngilizce Web Hizmetleri Açıklama Dili)

Dosyaya en çok web hizmetinin giriş noktasının bulunduğu bağlantıdan erişilebilir. İstisnalar olduğu için "en sık" yazdım. Örneğin, SAP tabanlı bir web hizmeti wsdl'yi yayınlamaz ve yalnızca uygulamanın kendisinden kaldırılarak elde edilebilir.

Ve böylece, web hizmeti, giriş, şifre hakkında bir açıklamamız var. Bağlanalım.

// URLServiceNameSpace ayarlarını tanımlayın = "http://Somesite.ru"; KullanıcıAdı = "TestKullanıcısı"; Şifre = "q1w2e3"; LocationWSDL = "https://Somesite.ru/WebService/Some?wsdl"; HizmetAdı = "Bir HizmetAdı"; ConnectionPointName = "SomeService_Port"; // SSL Bağlantısı Oluştur = Yeni SecureConnection OpenSSL (); WSDefinition = Yeni WSDefinition (LocationWSDL, SSL); WSProxy = Yeni WSProxy (WSDefinition, ServiceNameSpace URL, ServiceName, ConnectionPointName, SSL); WSProxy.User = KullanıcıAdı; WSProxy.Password = Parola;

İyi! Web servisine bağlandık! Teoride, bu, herhangi bir değişim seçeneğinin temelidir, çünkü yaratmanıza izin verir. veri yapısı nesnesi wsdl'ye dayalıdır ve böyle bir nesneyle çalışmak bir zevktir.

SoapUI'nin bize verdiği XML'i düşünün

357 121212 m 19900111 Mercedes GLS audi TT

Şimdi bunu programlı olarak tanımlayalım

// Bir nesne oluşturun ve onu verilerle doldurun XDTOFactory = WSDefinition.XDTOFactory; RootType = CustomXDTO.Type (ServiceNameSpace URL'si, "GÖNDERİM"); RootObject = MyXDTOFactory.Create (RootType); RootObject.ID = "4356"; ClientType = CustomXDTO.Type (ServiceNameSpace URL'si, "MÜŞTERİ"); ClientObject = OwnXDTOFactory.Create (ClientType); ClientObject.CLIENT_ID = "121212"; ClientObject.SEX = "M"; // F - kadın, M - erkek ClientObject.CLIENT_BIRTHDAY = "19900111"; // İstemci arabaları AutoType = OwnFactoryXDTO.Type (URLServiceNameSpace, "CARS"); AutoObject = OwnXDTOFactory.Create (AutoType); AutoObject.CLASS = "Mercedes"; AutoObject.MODEL = "GLS"; ClientObject.CARS.Add (Otomatik Nesne); AutoObject = OwnXDTOFactory.Create (AutoType); AutoObject.CLASS = "Audi"; AutoObject.MODEL = "TT"; ClientObject.CARS.Add (Otomatik Nesne); RootObject.CUSTOMER.Add (ClientObject);

Veriler başarıyla doldurulmuştur. Şimdi onları göndermeniz gerekiyor.

Şu anda, birçok nüans ortaya çıkıyor. Her birini düşünmeye çalışalım.

Tarif 1. Tüm XDTO nesnesini gönderme

Sonuç = WSProxy.AddCustomers (RootObject);

Sadece hizmetin bize geri verdiği sonucu işlemek için kalır ve bu kadar. Bunun çok uygun olduğunu kabul edin!

Ancak pratikte, bu her zaman böyle değildir. Örneğin 1c, kök etiketin ad alanı çocuklarınkinden farklı olduğunda, xml içinde belirli etiketlerin ön ekiyle anlaşamaz. Bu gibi durumlarda sabunu manuel olarak toplamanız gerekir. Ayrıca parametre olarak saf xml bekleyen web servisleriyle de uğraşmak zorunda kaldım. Delilik, ama yine de bu çok zor değil.

Reçete 2. Parametre olarak temiz xml gönderme

XMLWriteParameters = Yeni XMLWriterParameters ("UTF-8", "1.0", Doğru); MyXML = Yeni XML Kaydı; MyXML.SetString (XMLWriter Seçenekleri); MyXML.WriteXMLDeclaration(); MyXDTOFactory.WriteXML (MyXML, RootObject); XML Dizesi = MyXML.Close (); Eğer DeleteNamespaceDescription ise FirstTagVSRow Denemesi = StrGetString (XMLString, 2); RootTagName = RootObject.Type().Ad; XMLString = StringReplace (XMLString, FirstTagVS dizesi, "<"+ИмяКорневогоТэга+">"); İstisna // DescriptionErrors () EndTry; EndIf; Sonuç = WSProxy.AddCustomers (XML String);

1c'nin varsayılan olarak eklediği ad alanını kaldırmazsanız, 5 satırdan fazla kod haline geldi. Genellikle birden fazla yöntem çağırdığım için xml dönüşümünü bir işleve sararım.

Tarif 3. Yerel HTTP İsteği Gönderme.

StringSOAP = " | | | "+ XML Dizesi +" | |"; // HTTP isteğinin başlıklarını açıklayın Headers = New Match; Headers.Insert (" Content-Type "," text / xml; charset = UTF-8 "); Headers.Insert (" SOAPAction "," http: // sap.com/xi/WebService/soap1.1 "); Headers.Insert (" Yetkilendirme "," Temel "+ GetBase64AuthorizationHeader (Kullanıcı Adı, Şifre)); // DİKKAT !!! // Programlı olarak dolduramazsınız aşağıdaki başlıklar, çünkü bu bir hataya yol açar // Platform bunları doğru bir şekilde dolduracaktır // Başlıklar. ЧГ = ")); // mesaj uzunluğu // Başlıklar. Ekle ("Host", "Somesite.ru:8001") ; // Başlıklar. Ekle ("Bağlantı "," Canlı Tut "); // Başlıklar. Ekle ("User-Agent", "Apache-HttpClient / 4.1.1 (Java 1.5)"); // site. Connection = New HTTPConnection ("Somesite.ru/WebService/Some", Kullanıcı Adı, Parola, SSL, False); // Adres https'siz olmalıdır: // // Kök sayfanın metnini POST isteği ile alın .HTTP İsteği c = Yeni HTTPRequest ("/ GetCustomer", Başlıklar); HTTPRequest.SetBodyFromString (StringSOAP); Sonuç = Connection.CallHTTPMethod ("POST", HTTPRequest);

Bu durumda sabunu manuel olarak toplamamız gerekecek. Aslında, tarif 2'deki xml'yi bir sabun kabuğuna sarıyoruz, burada web hizmetinin gereksinimlerine bağlı olarak sabunumuzu istediğimiz gibi değiştirebiliyoruz.

Ardından, belgelere göre başlıkları açıklıyoruz. Bazı hizmetler, talebimizi başlıklar olmadan sakince çiğneyecektir, burada belirli bir duruma bakmanız gerekir. Hangi başlıkları yazacağınızı bilmiyorsanız, o zaman en kolay yol, RAW sekmesine geçerek SoapUI'deki isteği gözetlemektir.

Base64 dizesini alma işlevi şöyle görünür (gözetlenir):

İşlev GetBase64AuthorizationHeader (Kullanıcı Adı, Parola) FileCoding = TextCode.UTF8; TemporaryFile = GetTemporaryFileName (); Kayıt = Yeni Metin Kaydı (GeçiciDosya, DosyaKodu); Record.Record (Kullanıcı adı + ":" + Şifre); Kaydet.Kapat (); DWData = Yeni BinaryData (GeçiciDosya); Sonuç = Base64String (DWData); DeleteFiles (GeçiciDosya); Sonuç = Ort (Sonuç, 5); Geri Ödeme Sonucu; EndFunction

Önemli bir nokta var. HTTPConnection ile çalışırken, adresi "http://" ve "https://" protokollerini belirtmeden belirtin, aksi takdirde bariz bir hata arayarak zaman kaybetme riskini alırsınız.

Tarif 4. WinHttpRequest ile Gönderme

WinHttp = Yeni COMObject ("WinHttp.WinHttpRequest.5.1"); WinHttp.Option (2, "UTF-8"); WinHttp.Option (4, 13056); // intSslErrorIgnoreFlag WinHttp.Option (6, true); // blnEnableRedirects WinHttp.Option (12, doğru); // blnEnableHttpsToHttpWinHttp.Open Yönlendirmeleri ("POST", "https://Somesite.ru/WebService/Some/GetCustomer", 0); WinHttp.SetRequestHeader ("İçerik türü", "metin / xml"); WinHttp.SetCredentials (Kullanıcı Adı, Şifre, 0); WinHttp.Send (Dize SABUN); WinHttp.WaitForResponse (15); XMLResponse = WinHttp.ResponseText ();

Burada, özünde önceki sürümdekiyle aynı, ancak bir COM nesnesi ile çalışıyoruz. Bağlantı dizesini protokolle birlikte tam olarak belirtiriz. Yalnızca yoksayılan SSL sertifikası hata bayraklarına özel dikkat gösterilmelidir. SSL üzerinde çalışıyorsak, ancak belirli bir sertifika olmadan bunlar gereklidir, çünkü bu seçenekte yeni bir güvenli bağlantı oluşturmak mümkün değildir (veya nasıl olduğunu bilmiyorum). Mekanizmanın geri kalanı bir öncekine benzer.

Ayrıca, "WinHttp.WinHttpRequest.5.1"e ek olarak, "Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0", aniden geçmezse kullanabilirsiniz. WinHttp'de kapalı. Yöntemler hemen hemen aynıdır, sadece parametre sayısı farklıdır. Bu seçeneklerden birinin 1c HTTPRequest nesnesinin içinde kodlanmış olduğundan şüpheleniyorum.

Şimdilik elimdeki tüm tarifler bunlar. Yenileriyle karşılaşırsam, makaleyi kesinlikle ekleyeceğim.

Sonuç işleniyor

Tarif 1'de, çoğunlukla hazır bir XDTO nesnesi alırız ve onunla bir yapı ile çalışırız. Diğer tüm durumlarda, xml yanıtını bir XDTO'ya dönüştürebilirsiniz.

Result.StatusCode = 200 ise XMLReader = New XMLReader; ReadXML.SetString (Result.GetBodyAsString()); ObjectResponse = OwnXDTOFactory.ReadXML (ReadXML); Rapor (ObjectResponse.Body.Response.RESPONSE_ID); Rapor (ObjectResponse.Body.Response.RESPONSE_TEXT); EndIf;

Burada her şey basit.

Sonuç yerine

1. SoapUI programı ile web servisleri ile çalışmaya başlayın. Bu tür işler için tasarlanmıştır ve belirli bir hizmetin nasıl çalıştığını hızlı bir şekilde anlamanıza olanak tanır. Mastering için bir makale var

2. Hizmetle güvenli olmayan bir http kanalı üzerinden alışveriş yapıyorsanız ve mesajlarınızda 1c'nin tam olarak ne gönderdiği sorusu ortaya çıkarsa, Wireshark, Fiddler ve diğerleri gibi trafik algılayıcılarını kullanabilirsiniz. Sorun yalnızca bir ssl bağlantısı kullanıyorsanız ortaya çıkacaktır.

3. Yine de, web hizmeti https üzerinden iletişim kurarsa, uzak makineye (herhangi bir, asıl şey kendi başımıza değil) iletişim kuracağımız Nginx sunucusunu koyarız ve sırayla paketlenir https'deki her şeyi ve gerektiğinde gönderin ( ters proxy ) ve standart yapılandırmaya ekleyin:

Sunucu (dinle 0.0.0.0:8080; sunucu_adı MyServer; konum ~. * (Proxy_pass https://Somesite.ru:8001; proxy_set_header Host $ host; proxy_set_header Yetkilendirme "Temel "; proxy_pass_header Yetkilendirmesi;))

5. Kimlik doğrulama, tanımlama bilgilerinin kullanımını içeriyorsa, aşağıdaki bulundu

not Kodu geliştirmek için sorularınız, önerileriniz varsa, açıklananlardan farklı kendi tarifleriniz varsa, hatalar bulduysanız veya yazarın "ukala" olduğunu ve "1c'de yeri olmadığını" düşünüyorsanız, yorum yazın ve biz de yapalım. her şeyi tartışın.

Konu başlığı gerçekten bir soru çünkü Ben kendim ne olduğunu bilmiyorum ve ilk kez bu makale çerçevesinde onunla çalışmaya çalışacağım. Aşağıdaki kodun çalışacağını garanti edebileceğim tek şey, ancak cümlelerim, tüm bunları nasıl anladığıma dair varsayımlar ve tahminler olacak. O zaman hadi gidelim ...

Tanıtım

Web servisleri kavramının ne için yaratıldığı ile başlamamız gerekiyor. Bu kavram ortaya çıktığında, dünyada uygulamaların uzaktan etkileşime girmesine izin veren, bir programın başka bir programdaki bazı yöntemleri çağırabildiği, başka bir şehirde veya hatta bir ülkede bulunan bir bilgisayarda çalıştırılabilen teknolojiler zaten mevcuttu. Tüm bunlar RPC (Uzaktan Yordam Çağrısı) olarak kısaltılır. Örnekler arasında CORBA teknolojileri ve Java - RMI (Uzaktan Yöntem Çağırma) yer alır. Ve içlerinde her şey yolunda görünüyor, özellikle CORBA'da, tk. onunla herhangi bir programlama dilinde çalışabilirsiniz, ancak yine de bir şey eksikti. CORBA'nın dezavantajının, kendine özgü bazı özellikler aracılığıyla çalışması olduğuna inanıyorum. ağ protokolleri herhangi bir güvenlik duvarında gezinecek olan basit HTTP yerine. Web hizmetinin arkasındaki fikir, HTTP paketlerine yapışacak bir RPC oluşturmaktı. Standardın gelişimi böyle başladı. Bu standardın temel kavramları nelerdir:
  1. SABUN... Bir uzaktan prosedürü çağırmadan önce, bu aramayı şurada açıklamanız gerekir: XML dosyası e SABUN biçimi. SOAP, web hizmetlerinde kullanılan birçok XML işaretlemesinden yalnızca biridir. HTTP üzerinden bir yere göndermek istediğimiz her şey önce bir XML SOAP açıklamasına dönüştürülür, ardından bir HTTP paketine konur ve TCP/IP üzerinden ağ üzerindeki başka bir bilgisayara gönderilir.
  2. WSDL... Bir web servisi var, yani. yöntemleri uzaktan çağrılabilen bir program. Ancak standart, bu programa "evet, yanılmıyorsunuz - bu gerçekten bir web hizmetidir ve ondan bu tür yöntemleri çağırabilirsiniz" diyen bir açıklamanın eklenmesini gerektirir. Bu açıklama, WSDL gibi farklı bir biçime sahip başka bir XML dosyasıyla temsil edilir. Onlar. WSDL, bir web hizmeti için yalnızca bir XML açıklama dosyasıdır ve başka bir şey değildir.
Neden bu kadar kısa sordun? Daha fazla ayrıntı alamaz mısın? Muhtemelen yapabilirsiniz, ancak bunun için Mashnin T. "Java Web Servisleri" gibi kitaplara başvurmanız gerekiyor. İlk 200 sayfa için orada Detaylı Açıklama SOAP ve WSDL standartlarının her etiketi. Yapmalı mıyım? Bence, hayır, tk. tüm bunlar Java'da otomatik olarak oluşturulur ve tek yapmanız gereken uzaktan çağrılması gereken yöntemlerin içeriklerini yazmaktır. Yani Java'da JAX-RPC gibi bir API vardı. Bilmeyen varsa, Java'nın şöyle bir API'si olduğunu söylediklerinde, söz konusu teknolojiyi içine alan bir dizi sınıfa sahip bir paket olduğu anlamına gelir. JAX-RPC, uzun bir süre sürümden sürüme gelişti ve sonunda JAX-WS'ye dönüştü. WS açıkçası WebService anlamına gelir ve bunun RPC'nin bu günlerde popüler bir kelimeye basit bir şekilde yeniden adlandırılması olduğunu düşünebilirsiniz. durum böyle değil çünkü Artık web servisleri orijinal fikirden uzaklaştı ve sadece uzak yöntemleri çağırmanıza değil, aynı zamanda sadece SOAP formatında belge mesajları göndermenize de izin veriyor. Buna neden ihtiyaç duyuluyor, henüz bilmiyorum, cevabın "her ihtimale karşı, aniden ihtiyaç duyulacak" olması muhtemel değil. Ben kendim daha deneyimli yoldaşlardan öğrenmek istiyorum. Ve son olarak, sözde RESTful web servisleri için JAX-RS de vardı, ancak bu ayrı bir makalenin konusu. Bu noktada giriş sonlandırılabilir, çünkü sonra JAX-WS ile çalışmayı öğreneceğiz.

Genel yaklaşım

Web servislerinin her zaman bir istemcisi ve bir sunucusu vardır. Sunucu bizim web hizmetimizdir ve bazen uç nokta olarak adlandırılır (istemciden gelen SOAP mesajlarının gittiği uç nokta gibi). Aşağıdakileri yapmamız gerekiyor:
  1. Web servisimizin arayüzünü tanımlayın
  2. Bu arayüzü uygula
  3. Web hizmetimizi başlatın
  4. Bir istemci yazın ve gerekli web hizmeti yöntemini uzaktan çağırın
Web hizmeti başlatılabilir Farklı yollar: ya bir ana yöntemle bir sınıf ilan edin ve web hizmetini doğrudan bir sunucu olarak çalıştırın ya da Tomcat ya da her neyse gibi bir sunucuya dağıtın. İkinci durumda, kendimiz koşmuyoruz yeni sunucu ve bilgisayarda başka bir port açmayın, Tomcat sunucu uygulaması konteynerine "web servis sınıflarını buraya yazdık, yayınlayın, lütfen, böylece sizinle iletişime geçen herkes web servisimizi kullanabilsin" deyin. Web hizmetini başlatma yöntemi ne olursa olsun, aynı istemciye sahip olacağız.

sunucu

IDEA'yı başlatalım ve oluşturalım yeni proje Yeni Proje Oluştur... bir isim girelim MerhabaWeb Hizmeti ve düğmeye basın Sonraki, ardından düğme Bitiş... klasörde kaynak paket oluştur ru.javarush.ws... Bu pakette HelloWebService arayüzünü oluşturacağız: package ru. javarush. ws; // bunlar ek açıklamalardır, yani. sınıflarımızı ve yöntemlerimizi işaretlemenin bir yolu, // web servis teknolojisi ile ilgili olarak javax'ı içe aktarın. jws. WebYöntem; javax'ı içe aktarın. jws. İnternet servisi; javax'ı içe aktarın. jws. sabun. SABUN Bağlama; // Arayüzümüzün web servis olarak çalışacağını söylüyoruz@İnternet servisi // metotları çağırmak için web servisinin kullanılacağını söyle@SOAPBinding (stil = SOAPBinding. Style. RPC) genel arabirim HelloWebService ( // bu metodun uzaktan çağrılabileceğini söylüyoruz@WebMethod public String getHelloString (Dize adı); ) Bu kodda, WebService ve WebMethod sınıfları annotation olarak adlandırılır ve bizim arabirimimizi ve yöntemini bir web hizmeti olarak işaretlemekten başka bir şey yapmaz. Aynısı SOAPBinding sınıfı için de geçerlidir. Tek fark, SOAPBinding'in bir parametre açıklaması olmasıdır. V bu durumda style parametresi, web servisinin belge mesajları üzerinden değil, klasik bir RPC gibi çalışacağını söyleyen bir değerle kullanılır, yani. yöntemi çağırmak için. Arayüzümüzün mantığını uygulayalım ve paketimizde bir HelloWebServiceImpl sınıfı oluşturalım. Bu arada, Impl'deki sınıfın sonunun, arayüzlerin uygulanmasının bu şekilde gösterildiğine göre Java'da bir kural olduğunu not ediyorum (Impl - uygulama kelimesinden, yani uygulamadan). Bu bir gereklilik değildir ve sınıfı istediğiniz gibi adlandırmakta özgürsünüz, ancak iyi formun kuralları bunu gerektirir: paket ru. javarush. ws; // arayüzü tanımlarken olduğu gibi aynı açıklama, javax'ı içe aktarın. jws. İnternet servisi; // ancak burada endpointInterface parametresi ile kullanılır, // web servisimizin arayüzünün tam sınıf adının belirtilmesi@WebService (endpointInterface = "ru.javarush.ws.HelloWebService") genel sınıf HelloWebServiceImpl, HelloWebService'i uygular (@Override public String getHelloString (String name) ( // sadece bir selamlama döndür"Merhaba" + isim + "!" ; )) Web hizmetimizi bağımsız bir sunucu olarak başlatalım, yani. herhangi bir Tomcat ve uygulama sunucusunun katılımı olmadan (bu ayrı bir tartışma konusudur). Bunu yapmak için, klasördeki proje yapısında kaynak hadi bir ru.javarush.endpoint paketi oluşturalım ve bunun içinde ana yöntemle bir HelloWebServicePublisher sınıfı oluşturalım: ru paketi. javarush. uç nokta; // web servisleri ile bir web sunucusu başlatmak için sınıf javax'ı içe aktarın. xml. ws. uç nokta; // web servisimizin sınıfı ithalat ru. javarush. ws. HelloWebServiceImpl; genel sınıf HelloWebServicePublisher (genel statik geçersiz ana (String... args) ( // web sunucusunu 1986 bağlantı noktasında başlat // ve ilk argümanda belirtilen adreste, // ikinci argümanda iletilen web hizmetini başlat uç nokta. Yayınla ( "http: // localhost: 1986 / wss / merhaba", yeni HelloWebServiceImpl()); )) Şimdi bu sınıfı tıklayarak çalıştıralım Üst Karakter + F10... Konsolda hiçbir şey görünmüyor, ancak sunucu çalışıyor. Bunu tarayıcıya http: // localhost: 1986 / wss / merhaba? Wsdl satırını yazarak doğrulayabilirsiniz. Açılan sayfa, bir yandan bilgisayarımızda (localhost) bir web sunucusunun (http://) 1986 portunda başladığını kanıtlarken, diğer yandan web servisimizin WSDL açıklamasını gösterir. Uygulamayı durdurursanız, açıklamaya ve web hizmetinin kendisine erişilemez hale gelir, bu nedenle bunu yapmayacağız, ancak istemciyi yazmaya devam edeceğiz.

Müşteri

proje klasöründe kaynak ru.javarush.client paketini ve içinde HelloWebServiceClient sınıfını ana yöntemle oluşturun: ru paketi. javarush. müşteri; // wsdl açıklamasını almak için gerekli // web servisinin kendisine ulaş java'yı içe aktarın. ağ. URL; // bir URL nesnesiyle çalışırken böyle bir yürütme gerçekleşir java'yı içe aktarın. ağ. MalformedURLException; // wsdl açıklamasıyla xml-ku ayrıştırılacak sınıflar // ve içindeki servis etiketine ulaşın javax'ı içe aktarın. xml. ad alanı. QAd; javax'ı içe aktarın. xml. ws. Hizmet; // web servisimizin arayüzü (daha fazlasına ihtiyacımız var) ithalat ru. javarush. ws. MerhabaWebService; genel sınıf HelloWebServiceClient (genel statik geçersiz ana (String args) MalformedURLException'ı ( // wsdl açıklamasına bir bağlantı oluşturun url url'si= yeni URL ( "http: // localhost: 1986 / wss / merhaba? wsdl") ; // WSDL açıklamasının ilk etiketinde bir sonraki kurucunun parametrelerine bakarız - tanımlar // targetNamespace özelliğindeki 1. argümana bakın // name özelliğindeki 2. argümana bakın QName qname = new QName ("http: //ws.site/", "HelloWebServiceImplService"); // Artık wsdl açıklamasındaki servis etiketine ulaşabiliriz, servis hizmeti= Hizmet. oluştur (url, qname); // ve ardından yuvalanmış bağlantı noktası etiketine kadar, böylece // bizden uzaktaki bir web hizmeti nesnesine bağlantı alın HelloWebService merhaba = hizmet. getPort (HelloWebService. sınıfı); // Yaşasın! Artık uzak yöntemi çağırabilirsiniz. Sistem. dışarı. println (merhaba. getHelloString ("CodeGym")); )) Listedeki koda maksimum yorum yaptım. Ekleyecek bir şeyim yok, bu yüzden çalıştırın (Shift + F10). Konsoldaki metni görmeliyiz: Merhaba, CodeGym! Görmediyseniz, muhtemelen web hizmetini başlatmayı unuttunuz.

Çözüm

Bu konuda, web servislerine kısa bir gezi sunuldu. Yine, yazdıklarımın çoğu, nasıl çalıştığına dair tahminimdir ve bu nedenle çok fazla güvenilmemelidir. eğer minnettar olurum bilgili insanlar beni düzeltecekler, çünkü o zaman bir şeyler öğreneceğim. UPD.

Alexey Boyko

.Net Platformunda SOAP ve XML Web Servisleri

XML Web Servisleri, işletim sistemleri arasında bu düzeyde uyumluluk ve birlikte çalışabilirlik sunar.

daha önce mevcut olmayan platformlar ve diller.

Andrew Troelsen (MVP (Microsoft'taki En Değerli Profesyonel))

Henüz XML web servisleriyle çalışmadıysanız, muhtemelen “SOAP” kelimesini duymuşsunuzdur. Bu kavramlarla başa çıkmanın zamanı geldi.

giriş

İnternet veya daha küçük ağlarla ilgileniyorsanız, er ya da geç XML Web Servisleri ile karşılaşacaksınız. Bir XML web hizmeti, yalnızca bir tarayıcıya bilgi gönderebilen bir web uygulaması değildir. Bunun yerine, standart HTTP istekleri kullanılarak ağ üzerinden bir nesnenin yöntemlerinin ve özelliklerinin çağrılmasına izin veren bir uzaktan iletişim teknolojisidir.

Pratikte bu, böyle bir hizmetin istemcilerinin farklı dillerde ve farklı işletim sistemleri için yazılabileceği anlamına gelir.

Hizmet ve istemci arasında bir bilgi "taşıma" olarak HTTP GET veya POST yöntemlerini kullanabilirsiniz.

Ve bir protokol daha "kaplayabilirsiniz" - SOAP (Basit Nesne Erişim Protokolü). Bu genellikle yapılır, çünkü bu durumda karmaşık türleri (kullanıcı tanımlı olanlar dahil) geçmek mümkündür. Ve klasik GET ve POST yöntemleri yalnızca listeleri, basit dizileri ve dizeleri destekler.

Örnek SOAP Interop

SOAP mesajı, bir HTTP isteğinin gövdesine sarılmış bir XML belgesidir.

Liste 1. Bir SOAP mesajının yapısı

İstemci ve hizmet arasındaki etkileşim aşağıdaki gibidir:

  • istemci bir SOAP isteği oluşturur ve bunu hizmete gönderir;
  • hizmet uzak bilgisayar prosedürü yürütür ve bir SOAP yanıtı gönderir.

Örneğin, uzak bir XML web hizmetinin HelloWorld () yöntemini çağıran bir SOAP isteği şöyle görünebilir:

Liste 2. Örnek bir SOAP talebi

HelloWorld () yöntemi, beklendiği gibi, "Merhaba dünya!" dizesini döndürür:

Liste 3. Örnek SABUN yanıtı

Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema">

Selam Dünya!

.NET 2.0'da XML Web Hizmeti Oluşturma

bir hizmet oluşturabilirsiniz Farklı yollar, Visual Studio 2005 kullanacağız. "Dosya -> Yeni -> Web Sitesi" seçeneğine tıklayın, açılan pencerede "ASP.NET web Hizmeti" seçeneğini seçin. Oluşturma sırasında belirtilen adreste aşağıdaki dosya ve dizinleri bulacaksınız (bkz. Şekil 1).

Prensipte bir hizmet, * .asmx uzantılı yalnızca tek bir dosya içerebilir. (* .asmx uzantısı .Net web servislerini belirtmek için kullanılır.) Bu durumda durum böyle değil, Service.asmx dosyasının içeriğine bakın:

Liste 4. Service.asmx tanımlar harici dosya destek

<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" class="Service" %>

CodeBehind özniteliği, HelloWorld () yöntemini uygulayan kodu içeren App_Code klasöründe bulunan harici bir dosyayı belirtir:

Liste 5. Service.cs Dosyası HelloWorld () Yöntemini Uygulama

Sistemi kullanarak;

System.Web'i kullanarak;

System.Web.Services'i kullanarak;

Kamu hizmeti () (

"Merhaba Dünya" dönüşü;

Destek kodu olmadan aynı işlevselliğe sahip tek bir Service.asmx dosyası oluşturmak mümkündür:

Liste 6. Service.asmx harici destek kodu olmadan

<%@ WebService Language="C#" class="Service" %>

Sistemi kullanarak;

System.Web'i kullanarak;

System.Web.Services'i kullanarak;

System.Web.Services.Protocols kullanarak;

genel sınıf Hizmeti: System.Web.Services.WebService

Kamu hizmeti () (

Herkese açık dize HelloWorld () (

"Merhaba Dünya" dönüşü;

Buna ihtiyacımız yok ve bunu yapmayacağız.

Gördüğünüz gibi, web hizmetimizdeki tek yöntem, ASP.NET çalışma zamanına bu yöntemin gelen HTTP istekleri için kullanılabilir olduğunu bildiren bir öznitelik ile etiketlenmiştir. Bu öznitelikle tanımlanmayan üyeler, istemci programlarında kullanılamaz.

Bu kadar basit bir hizmet, deneylerimiz için oldukça uygundur, yalnızca yayınlamak için kalır.

IIS Kullanarak XML Web Hizmeti Yayınlama

İnternette yayınlamaktan değil, hizmetimizi yerel bir bilgisayarda test etmek için koşullar yaratmaktan bahsediyoruz.

İlk adım, IIS'yi (İnternet Bilgi Sunucusu) kurmaktır. Bunu yapmak için, "Program Ekle veya Kaldır" penceresini açın ve "Yükle" yi seçin. Windows bileşenleri". (Biraz Windows sürümleri Windows XP Home Edition gibi bir IIS yüklemesini içermez.)

Not: IIS sunucusu.Net Framework'ten daha erken yüklemek daha iyidir, aksi takdirde yardımcı programı çalıştırarak IIS'yi .Net uygulamalarını destekleyecek şekilde yapılandırmanız gerekir. Komut satırı aspnet_regiis.exe (/ i işaretli).

Sanal bir dizin oluşturun. Windows XP Pro kullanıyorsanız, "Denetim Masası -> Yönetimsel Araçlar -> İnternet Bilgi Servisleri"ne gidin. Açılan pencerede Eylem -> Oluştur -> Sanal Dizin'i seçin.

Yeni Sanal Dizin Sihirbazı başlayacaktır. Alias ​​​​Soap1 ve servisi yerleştirmek istediğiniz dizine giden yolu belirtin, örneğin C:\Soap1. Şimdi web servisimizin içeriğini oraya kopyalayın.

Tarayıcınızın adres çubuğuna http://localhost/soap1/Service.asmx yazın ve hizmet test sayfasını görmelisiniz (bkz. Şekil 2).

SOAP Mesajlarını Görüntüleme

Test sayfası, SOAP mesajlarının gönderilmesine ve okunmasına izin vermiyor. Bu nedenle üçüncü taraf geliştirme kullanmanız gerekecek, soapUI kullanmanızı öneririm. (Bu, http://www.soapui.org adresinde bulunan ücretsiz bir üründür.)

soapUI'yi kurduktan sonra, Initial WSDL alanını boş bırakarak soap1 adlı yeni bir proje oluşturun (bkz. Şekil 3).

Yeni oluşturulan projeye sağ tıklayın ve "URL'den WSDL Ekle" seçeneğini seçin. Açılan iletişim kutusuna http://localhost/soap1/Service.asmx? Artık servisimize SOAP istekleri gönderme ve alınan yanıtları görüntüleme olanağına sahibiz. (İstekler, soapUI tarafından otomatik olarak oluşturulacaktır.)

Bu WSDL nedir? WSDL belgesi, istemcilerin bir web hizmetiyle nasıl etkileşime girdiğini açıklar. Harici çağırma için hangi hizmet yöntemlerinin mevcut olduğunu, hangi parametreleri kabul ettiklerini ve ne döndürdüklerini ve ayrıca uzaktan iletişim için gerekli diğer bilgileri açıklar. Böyle bir belge manuel olarak derlenebilir veya oluşturulmasını sunucuya emanet edebilirsiniz, bunun için * .asmx dosyasını gösteren URL'ye Wsdl son ekini eklemek yeterlidir.

Hizmetimizin WSDL belgesini görüntülemek için tarayıcınıza http://localhost/soap1/Service.asmx?Wsdl girin. Bu belgedeki bilgiler, otomatik olarak SOAP istekleri oluşturmak için soapUI tarafından kullanılır.

SABUN Uzantıları

Fark etmiş olabileceğiniz gibi, bir XML web hizmeti (bir istemcinin yanı sıra) oluşturmak, SOAP mesajlarının görünümüyle ilgilenmek zorunda değildir. Gerekli yöntemleri bir öznitelikle işaretlemek yeterlidir ve ASP.NET çalışma zamanı gerekli formatta paketler oluşturur.

İncirde. 4, soapUI programı kullanılarak alınan web hizmetinin isteğini ve yanıtını gösterir.

Hadi bir kez daha yapalım. İstek, soapUI tarafından oluşturulur - hizmet için gerçek istemciler oluştururken ayrıca SOAP paketlerini manuel olarak biçimlendirmeniz gerekmez. Ayrıca hizmet yanıtının oluşturulmasına doğrudan katılmadık. Bütün bunlar otomatik olarak gerçekleşir.

Ancak, bu paketleri kendiniz değiştirmeniz gerekebilir. Örneğin, iletilen verileri sıkıştırın veya şifreleyin. SOAP Uzantılarının amacı budur.

SOAP Uzantıları, gönderdiğiniz ve aldığınız SOAP mesajlarını keyfi olarak değiştirmenize izin veren bir mekanizmadır.

SABUN mesajı "yol"

Programlamaya başlamak için, bir SOAP mesajının uygun yöntemle alınmadan ve işlenmeden önce izlediği yolu göz önünde bulundurmanız gerekir (bkz. Şekil 5).

Bir SOAP mesajı, bir ağ üzerinden iletilen bir nesneyi tanımlayan bir XML belgesi olarak düşünülebilir. Bu şekilde iletilen nesneyi kullanmadan önce, bu tanımdan restore edilmesi (veya dilerseniz monte edilmesi) gerekir. XML serileştirici bu amaca hizmet eder.

Gelen paketlerin serisi kaldırılır (bir nesnenin bir XML açıklamasından geri yüklenmesi) ve gönderilenler seri hale getirilir (bir nesnenin XML açıklamasının oluşturulması).

İncirde. Şekil 5, SOAP Uzantılarını kullanarak bir SOAP mesajını engelleyebileceğimiz dört noktayı (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) göstermektedir. Değiştirin ve daha fazla gönderin.

SOAP Uzantısı Uygulaması

Başlangıç ​​olarak, bir görev tanımlayalım: Diyelim ki web servisi tarafından gönderilen SOAP paketlerini Liste 7'de gösterildiği gibi değiştirmek istiyoruz:

Liste 7. Eski ve yeni XML web hizmeti yanıtları

Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema">

Selam Dünya

Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema">

şifre metni

SOAP Uzantısını uygulamak için eylem planı:

  • SoapExtension'dan miras alınan bir sınıfla bir dll oluşturun.
  • Bin klasörünü web servisimize ekleyin ve oluşturulan dll'yi oraya koyun.
  • Web.config dosyasını servise ekleyin ve gerekli değişiklikleri yapın.

Bin klasörünün ve web.config dosyasının rolünü daha sonra tartışacağız.

SOAP Uzantısı ile DLL Oluşturma

SoapExtensionLib adlı yeni bir "Sınıf Kitaplığı" projesi oluşturun. Bu projede sadece SOAP paketlerinde ihtiyacımız olan değişiklikleri gerçekleştirecek bir sınıf uygulamamız gerekiyor. Bu sınıf, SoapExtension sınıfından türetilmelidir.

Liste 8. SoapExtension'dan miras alan bir sınıf oluşturma

Sistemi kullanarak;

System.Web.Services'i kullanarak;

System.Web.Services.Protocols kullanarak;

System.IO kullanarak;

System.Net'i kullanarak;

System.Xml kullanarak;

Her SOAP Uzantısı, ağ üzerinden geçirilecek nesneyi içeren bir akışı parametre olarak alır (serileştirmeden önce veya sonra). Ve bir akış döndürmesi gerekir.

SOAP Uzantısı, Şekil 2'de gösterilen dört noktadan (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) birine veya tümüne yerleştirilebilen bir "kutu" olarak düşünülebilir. 5. Her noktada, herhangi bir sayıda bu tür "ekler" olabilir (bkz. Şekil 6).

Bu akışları almak için ChainStream yöntemi kullanılır.

Liste 9. ChainStream Yönteminin Uygulanması

public class TraceExtension: SoapExtension

Akış tel Akışı;

Uygulama akışı akışı;

// giriş parametresi olarak yöntem

// geçirilen nesneyi içeren bir akış alır

Genel geçersiz kılma Akış ChainStream (Akış akışı)

WireStream = akış;

AppStream = yeni MemoryStream();

appStream'i döndür;

BeforeDeserialize'da, wireStream ağdan alınan SOAP talebini içerir. Bu SOAP isteğinin uygulama akışına (appStream) iletilmesi gerekir.

Ve AfterSerialize noktasında, ağa gönderilen SOAP yanıtını appStream'e yerleştirilecek olan wireStream'e göndermeniz gerekir.

Dört noktanın her birinde iş parçacıklarıyla çalışmak için ProcessMessage yöntemini uygulamanız gerekir.

Liste 10. SOAP mesajlarını değiştirmeyen ProcessMessage yönteminin uygulanması

// ProcessMessage zorunlu kopyayı yapıyor

// iki noktada akışlar (BeforeDeserialize ve AfterSerialize)

Anahtar (mesaj.Sahne)

// BeforeDeserialize noktasında geçmelisiniz

// Ağ akışından SOAP isteği (wireStream)

// uygulama akışına (appStream)

Case SoapMessageStage.BeforeDeserialize:

Kopyala (wireStream, appStream);

AppStream.Position = 0;

Kırmak;

// AfterSerialize'ın geçilmesi gereken noktada

// Uygulama akışından ağ akışına SOAP yanıtı

AppStream.Position = 0;

Kırmak;

void Kopyalama (Şuradan akış, Şuraya akış)

TextReader okuyucu = yeni StreamReader (dan);

TextWriter yazar = yeni StreamWriter (to);

Writer.WriteLine (reader.ReadToEnd());

Writer.Flush();

Daha fazla deney için Liste 10'u boş olarak düşünün. ProcessMessage yönteminin bu uygulaması hiçbir anlam ifade etmez - giden SOAP yanıtı hiçbir şekilde değiştirilmez. Bunu düzeltelim:

Liste 11. SOAP Yanıtını Değiştirmek için ProcessMessage Yönteminin Uygulanması

public geçersiz kılma geçersiz ProcessMessage (SoapMessage mesajı)

Anahtar (mesaj.Sahne)

Case SoapMessageStage.AfterSerialize:

WriteOutput (mesaj);

Kırmak;

// yer kazanmak için kodun bir kısmı kesildi

// SOAP yanıtını yeniden yaz

public void WriteOutput (SoapMessage mesajı)

AppStream.Position = 0;

// akıştan bir XML belgesi oluştur

XmlDocument belgesi = yeni XmlDocument ();

Document.Load (appStream);

// XPath'i kullanmak için tanımlamanız gerekir

// Ad AlanıYöneticisi

XmlNamespaceManager nsmgr = yeni XmlNamespaceManager (document.NameTable);

Nsmgr.AddNamespace ("sabun", "http://schemas.xmlsoap.org/soap/envelope/");

XmlNode ResultNode = document.SelectSingleNode ("// sabun: Gövde", nsmgr);

// düğümün içeriğini değiştir

ResultNode.InnerText = "şifreli metin";

// akışı temizle ve ona yeni bir SOAP yanıtı yaz

AppStream.SetLength (0);

AppStream.Position = 0;

Document.Save (appStream);

// ZORUNLU İŞLEM

// uygulama akışından (appStream) SOAP yanıtını ilet

// ağ akışına (wireStream)

AppStream.Position = 0;

Kopyala (appStream, wireStream);

Ardından, bizim durumumuzda gerekli olmayan iki yöntem (biri aşırı yüklenmiş, yani farklı parametre kümeleriyle çağrılabilir) tanımlamanız gerekir. Ancak bunları SoapExtension sınıfından kalıtım kurallarına uygun olarak tanımlamalıyız.

Liste 12. Diğer Gerekli Yöntemler

// Miras kurallarına uygun olarak,

// bu metotları tanımlıyoruz ama hiçbir şekilde kullanmıyoruz

genel geçersiz kılma nesnesi?

GetInitializer (LogicalMethodInfo methodInfo, SoapExtensionAttribute niteliği)

null döndür;

genel geçersiz kılma nesnesi GetInitializer (Tür WebServiceType)

null döndür;

public override void Initialize (nesne başlatıcı)

Dönüş;

İşte bu, projeyi derliyoruz. Sonunda SOAP Extension ile bir dll aldık. SoapExtensionLib.dll dosyasının tam listesi derginin web sitesinde "Kaynak Kodu" bölümünde bulunabilir.

Bir Web Hizmetini SOAP Uzantısıyla Çalışacak Şekilde Yapılandırma

XML web servis projemizi Visual Studio ile tekrar açın. "WebSitesi -> Referans Ekle"ye tıklayın ve daha önce oluşturduğunuz SoapExtensionLib.dll dosyasını seçin.

Bin klasörü projeye otomatik olarak eklenecektir. Bin klasöründe bulunan * .dll dosyalarına uygulama tarafından otomatik olarak başvurulur.

Şimdi aşağıdaki içeriği web hizmeti dizinindeki Web.Config dosyasına koyun:

Liste 13. Web.Config Dosyası

Öncelik = "1"

Grup = "0" />

Şimdi hizmetimizin yapısı Şekil 1'de gösterilene benziyor. 7.

SoapExtensionLi.dll dosyasında bulunan TraceExtension sınıfında uygulanan XML Soap Extension'ı web hizmetine eklediğimizi ASP.NET çerçevesine Web.Config dosyasını kullanarak bildiriyoruz.

Liste 14. Web.Config Dosyasındaki webServices Bölümü

Öncelik = "1"

Grup = "0" />

Bildiğiniz gibi, birçok SOAP Uzantısı yapılabilir ve geçen nesneyi taşıyan akış (serileştirmeden önce veya sonra) her birinden geçecektir. Akışın çeşitli SOAP Uzantılarından aktığı sıra, öncelik ve grup öznitelikleri kullanılarak belirlenir.

Web.Config'i bu şekilde yapılandırarak, öznitelik ile işaretlenen hizmetin her yöntemi için SOAP Uzantımızın çağrılacağını ortama bildirdiğimizi belirtmekte fayda var. Kendi özniteliğinizi oluşturmak ve onunla yalnızca SOAP Uzantısını çağırmanız gereken yöntemleri işaretlemek mümkündür.

Liste 15. Özel bir öznitelik kullanma örneği

genel dize HelloWorld () (

"Merhaba Dünya" dönüşü;

Bunu yapmak için, SoapExtensionAttribute'den SoapExtensionLi.dll'ye devralınan bir sınıf ekleyin (bkz. Şekil 8).

Çözüm

Bu makale, .Net platformunda XML web servislerinin oluşturulması ve işletilmesinin ana noktalarını yansıtmaktadır. Sunulan materyalin yeterli olacağını umuyorum, böylece gerekirse konuyla ilgili daha derin bir çalışma yapabilirsiniz.


Temas halinde