Web Hizmetlerine Giriş

Bu kılavuzda, farklı Web hizmeti teknolojilerinin nasıl kullanılacağı gösterilmektedir. kapsanan konular, REST hizmetleri, SOAP hizmetleri ve Windows Communication Foundation hizmetleriyle iletişim kurmaya dahildir.

Düzgün çalışması için, birçok mobil uygulama buluta bağımlıdır ve Web hizmetlerini mobil uygulamalarla tümleştirmek yaygın bir senaryodur. Xamarin platformu farklı web hizmeti teknolojilerinin kullanılmasını destekler ve, restkala, ASMX ve Windows Communication Foundation (WCF) hizmetleri için yerleşik ve üçüncü taraf destek içerir.

Xamarin. Forms kullanan müşteriler için Xamarin. Forms Web Hizmetleri belgelerindeki bu teknolojilerin her birini kullanan tüm örnekler vardır.

Önemli

İOS 9 ' da, uygulama taşıma güvenliği (ATS), internet kaynakları (örneğin, uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantıları uygular ve bu sayede hassas bilgilerin yanlışlıkla açıklanmasını önler. ATS, iOS 9 için oluşturulmuş uygulamalarda varsayılan olarak etkinleştirildiğinden, tüm bağlantılar ATS güvenlik gereksinimlerine tabi olacaktır. Bağlantılar bu gereksinimleri karşılamıyorsa, bir özel durumla başarısız olur.

HTTPSProtokolü kullanmak ve internet kaynakları için güvenli iletişim sağlamak mümkün değilse, ATS ' nin bağlantısını devre dışı bırakabilirsiniz. Bu, uygulamanın Info. plist dosyası güncelleştirilerek elde edilebilir. Daha fazla bilgi için bkz. uygulama taşıma güvenliği.

REST

Temsili durum aktarımı (REST), Web hizmetleri oluşturmak için bir mimari stillidir. Web tarayıcılarının Web sayfalarını almak ve sunuculara veri göndermek için kullandığı HTTP yüklemleri kullanılarak REST istekleri HTTP üzerinden yapılır. Fiiller şunlardır:

  • Get – bu işlem, Web hizmetinden verileri almak için kullanılır.
  • Post – bu işlem, Web hizmetinde yeni bir veri öğesi oluşturmak için kullanılır.
  • PUT – bu işlem, Web hizmetindeki bir veri öğesini güncelleştirmek için kullanılır.
  • Patch – bu işlem, öğenin nasıl değiştirileceği hakkında bir dizi yönerge açıklayarak Web hizmetindeki bir veri öğesini güncelleştirmek için kullanılır. Bu fiil örnek uygulamada kullanılmaz.
  • Sil – bu işlem, Web hizmetindeki bir veri öğesini silmek için kullanılır.

REST 'e bağlı Web hizmeti API 'Lerine, yeniden kullanılabilir API 'Ler denir ve kullanılarak tanımlanmıştır:

  • Temel URI.
  • GET, POST, PUT, PATCH veya DELETE gibi HTTP yöntemleri.
  • Veriler için JavaScript Nesne Gösterimi (JSON) gibi bir medya türü.

REST 'in basitliği, Mobil uygulamalardaki Web hizmetlerine erişmek için birincil yöntem haline getirme konusunda yardımcı oldu.

REST hizmetlerini kullanma

REST hizmetlerini tüketmek için kullanılabilecek birçok kitaplık ve sınıf vardır ve aşağıdaki alt bölümlerde bunları tartışın. REST hizmetini kullanma hakkında daha fazla bilgi için bkz. Restsize bir Web hizmetikullanma.

HttpClient

MICROSOFT http Istemci kitaplıkları , http üzerinden istek göndermek ve almak için kullanılan sınıfını sağlar. HTTP istekleri göndermek ve URI tanımlı bir kaynaktan HTTP yanıtlarını almak için işlevsellik sağlar. Her istek zaman uyumsuz bir işlem olarak gönderilir. Zaman uyumsuz işlemler hakkında daha fazla bilgi için bkz. zaman uyumsuz desteğe genel bakış.

HttpResponseMessageSınıfı, BIR http isteği yapıldıktan sonra Web hizmetinden alınan BIR http yanıt iletisini temsil eder. Durum kodu, üst bilgiler ve gövde dahil olmak üzere yanıt hakkındaki bilgileri içerir. HttpContentSınıfı, ve gıbı http gövdesini ve içerik üstbilgilerini temsil eder Content-TypeContent-Encoding . İçerik, ReadAsReadAsStringAsync verilerin biçimine bağlı olarak, ve gibi yöntemlerden herhangi birini kullanarak okunabilir ReadAsByteArrayAsync .

Sınıfı hakkında daha fazla bilgi için HttpClient bkz. HttpClient.

HTTPWebRequest

Web hizmetlerini ile çağırma HTTPWebRequest şunları içerir:

  • Belirli bir URI için istek örneği oluşturuluyor.
  • İstek örneğinde çeşitli HTTP özellikleri ayarlanıyor.
  • İstekten alma HttpWebResponse .
  • Yanıttan veri okunuyor.

Örneğin, aşağıdaki kod ABD Ulusal Ilaç Web hizmeti kitaplığındaki verileri alır:

var rxcui = "198440";
var request = HttpWebRequest.Create(string.Format(@"https://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui));
request.ContentType = "application/json";
request.Method = "GET";

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
  if (response.StatusCode != HttpStatusCode.OK)
     Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
  using (StreamReader reader = new StreamReader(response.GetResponseStream()))
  {
               var content = reader.ReadToEnd();
               if(string.IsNullOrWhiteSpace(content)) {
                       Console.Out.WriteLine("Response contained empty body...");
               }
               else {
                       Console.Out.WriteLine("Response Body: \r\n {0}", content);
               }

               Assert.NotNull(content);
  }
}

Yukarıdaki örnek, HttpWebRequest JSON olarak biçimlendirilen verileri döndüren bir oluşturur. Veriler bir içinde döndürülür HttpWebResponse , bu, StreamReader verileri okumak için bir tarafından elde edilebilir.

RestSharp

REST hizmetlerini tüketmeye yönelik başka bir yaklaşım ise Restsharp kitaplığını kullanmaktır. RestSharp, ham dize içeriği veya serisi kaldırılan C# nesnesi olarak sonuçları alma desteği dahil olmak üzere HTTP isteklerini kapsüller. Örneğin, aşağıdaki kod ABD Ulusal Ilaç Web hizmeti kitaplığı için bir istek yapar ve sonuçları JSON biçimli bir dize olarak alır:

var request = new RestRequest(string.Format("{0}/allinfo", rxcui));
request.RequestFormat = DataFormat.Json;
var response = Client.Execute(request);
if(string.IsNullOrWhiteSpace(response.Content) || response.StatusCode != System.Net.HttpStatusCode.OK) {
       return null;
}
rxTerm = DeserializeRxTerm(response.Content);

DeserializeRxTerm , özelliğinden ham JSON dizesini alacak RestSharp.RestResponse.Content ve bunu C# nesnesine dönüştürecek bir yöntemdir. Web hizmetlerinden döndürülen verilerin serisini kaldırma, bu makalenin ilerleyen kısımlarında ele alınmıştır.

NSUrlConnection

Mono temel sınıf kitaplığı 'nda (BCL) kullanılabilen sınıfların yanı sıra, örneğin HttpWebRequest ve RestSharp gibi üçüncü taraf C# kitaplıkları, Web hizmetlerini kullanmak için de kullanılabilir. Örneğin, iOS 'ta, NSUrlConnection ve NSMutableUrlRequest sınıfları kullanılabilir.

Aşağıdaki kod örneği, iOS sınıflarını kullanarak ABD Ulusal Ilaç Web hizmeti kitaplığı 'nın nasıl çağrılacağını göstermektedir:

var rxcui = "198440";
var request = new NSMutableUrlRequest(new NSUrl(string.Format("https://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui)),
       NSUrlRequestCachePolicy.ReloadRevalidatingCacheData, 20);
request["Accept"] = "application/json";

var connectionDelegate = new RxTermNSURLConnectionDelegate();
var connection = new NSUrlConnection(request, connectionDelegate);
connection.Start();

public class RxTermNSURLConnectionDelegate : NSUrlConnectionDelegate
{
       StringBuilder _ResponseBuilder;
       public bool IsFinishedLoading { get; set; }
       public string ResponseContent { get; set; }

       public RxTermNSURLConnectionDelegate()
               : base()
       {
               _ResponseBuilder = new StringBuilder();
       }

       public override void ReceivedData(NSUrlConnection connection, NSData data)
       {
               if(data != null) {
                       _ResponseBuilder.Append(data.ToString());
               }
       }
       public override void FinishedLoading(NSUrlConnection connection)
       {
               IsFinishedLoading = true;
               ResponseContent = _ResponseBuilder.ToString();
       }
}

Genellikle, Web hizmetlerini tüketen platforma özgü sınıflar, yerel kodun C# ' a aktarılmakta olduğu senaryolarla sınırlandırılmalıdır. Mümkün olduğunda, Web hizmeti erişim kodu taşınabilir olmalıdır ve bu sayede platformlar arası paylaşılan bir platform olabilir.

ServiceStack

Service Stack kitaplığı, Web hizmetlerini çağırmaya yönelik başka bir seçenektir. Örneğin, aşağıdaki kod Service Stack 'in IServiceClient.GetAsync bir hizmet isteği vermek için nasıl kullanılacağını gösterir:

client.GetAsync<CustomersResponse>("",
          (response) => {
               foreach(var c in response.Customers) {
                       Console.WriteLine(c.CompanyName);
               }
       },
       (response, ex) => {
               Console.WriteLine(ex.Message);
       });

Önemli

ServiceStack ve RestSharp gibi araçlar, REST hizmetlerinin nasıl çağrılacağını ve tüketilmesini kolaylaştırır, ancak standart DataContract serileştirme KURALLARıNA uymayan XML veya JSON kullanmak bazen önemsiz değildir. Gerekirse, isteği çağırın ve aşağıda açıklanan ServiceStack. Text kitaplığını kullanarak uygun serileştirme öğesini açıkça işleyin.

Yeniden veri tüketme

Yeniden yapılan Web Hizmetleri, verileri istemciye döndürmek için genellikle JSON iletileri kullanır. JSON, veri gönderirken daha düşük bant genişliği gereksinimlerine neden olan Compact yükleri üreten metin tabanlı bir veri değişim biçimidir. Bu bölümde, JSON ve düz eski-XML (POX) içinde yeniden yanıt yanıtlarının tüketilmesine yönelik mekanizmalar incelenmeyecektir.

System. JSON

Xamarin Platformu, çıkış için hazır olan JSON desteğiyle birlikte gelir. Bir kullanarak JsonObject , aşağıdaki kod örneğinde gösterildiği gibi bir sonuç elde edilebilir:

var obj = JsonObject.Parse(json);
var properties = obj["rxtermsProperties"];
term.BrandName = properties["brandName"];
term.DisplayName = properties["displayName"];
term.Synonym = properties["synonym"];
term.FullName = properties["fullName"];
term.FullGenericName = properties["fullGenericName"];
term.Strength = properties["strength"];

Ancak, System.Json araçların verilerin tamamını belleğe yüklediğinden emin olmanız önemlidir.

JSON.NET

Newtonsoft JSON.net KITAPLıĞı JSON iletilerini serileştirmek ve seri durumdan çıkarmak için yaygın olarak kullanılan bir kitaplıktır. Aşağıdaki kod örneği, bir JSON iletisinin bir C# nesnesine serisini kaldırmak için JSON.NET 'in nasıl kullanılacağını gösterir:

var term = new RxTerm();
var properties = JObject.Parse(json)["rxtermsProperties"];
term.BrandName = properties["brandName"].Value<string>();
term.DisplayName = properties["displayName"].Value<string>();
term.Synonym = properties["synonym"].Value<string>();;
term.FullName = properties["fullName"].Value<string>();;
term.FullGenericName = properties["fullGenericName"].Value<string>();;
term.Strength = properties["strength"].Value<string>();
term.RxCUI = properties["rxcui"].Value<string>();

ServiceStack. Text

ServiceStack. Text, ServiceStack kitaplığıyla çalışacak şekilde tasarlanan bir JSON serileştirme kitaplığıdır. Aşağıdaki kod örneği, kullanarak JSON 'nin nasıl ayrıştıralınacağını gösterir ServiceStack.Text.JsonObject :

var result = JsonObject.Parse(json).Object("rxtermsProperties")
       .ConvertTo(x => new RxTerm {
               BrandName = x.Get("brandName"),
               DisplayName = x.Get("displayName"),
               Synonym = x.Get("synonym"),
               FullName = x.Get("fullName"),
               FullGenericName = x.Get("fullGenericName"),
               Strength = x.Get("strength"),
               RxTermDoseForm = x.Get("rxtermsDoseForm"),
               Route = x.Get("route"),
               RxCUI = x.Get("rxcui"),
               RxNormDoseForm = x.Get("rxnormDoseForm"),
       });

System.Xml. Sorgusunda

xml tabanlı REST web hizmeti kullanan bir olayda, aşağıdaki kod örneğinde gösterildiği gibi, xml 'i ayrıştırmak ve bir C# nesnesini satır içi doldurmak için LINQ to XML kullanılabilir:

var doc = XDocument.Parse(xml);
var result = doc.Root.Descendants("rxtermsProperties")
.Select(x=> new RxTerm()
       {
               BrandName = x.Element("brandName").Value,
               DisplayName = x.Element("displayName").Value,
               Synonym = x.Element("synonym").Value,
               FullName = x.Element("fullName").Value,
               FullGenericName = x.Element("fullGenericName").Value,
               //bind more here...
               RxCUI = x.Element("rxcui").Value,
       });

ASP.NET Web hizmeti (ASMX)

ASMX basit nesne erişim Protokolü (SOAP) kullanarak ileti gönderen Web Hizmetleri oluşturma yeteneği sağlar. SOAP, Web hizmetleri oluşturmak ve bunlara erişmek için platformdan bağımsız ve dilden bağımsız bir protokoldür. Bir ASMX hizmetinin tüketicilerinin, hizmeti uygulamak için kullanılan platform, nesne modeli veya programlama dili ile ilgili herhangi bir şeyi bilmeleri gerekmez. Yalnızca SOAP iletilerinin nasıl gönderileceğini ve alınacağını anlamalıdır.

SOAP iletisi, aşağıdaki öğeleri içeren bir XML belgesidir:

  • XML belgesini SOAP iletisi olarak tanımlayan Envelope adlı bir kök öğe.
  • Kimlik doğrulama verileri gibi uygulamaya özgü bilgileri içeren isteğe bağlı bir üstbilgi öğesi. Üstbilgi öğesi mevcutsa, Envelope öğesinin ilk alt öğesi olmalıdır.
  • Alıcı için tasarlanan SOAP iletisini içeren gerekli bir Body öğesi.
  • Hata iletilerini göstermek için kullanılan isteğe bağlı bir hata öğesi. Hata öğesi varsa, gövde öğesinin bir alt öğesi olmalıdır.

SOAP, HTTP, SMTP, TCP ve UDP gibi birçok Aktarım Protokolü üzerinde çalışabilir. Ancak, bir ASMX hizmeti yalnızca HTTP üzerinden çalışabilir. Xamarin Platformu, HTTP üzerinden standart SOAP 1,1 uygulamalarını destekler ve bu, standart ASMX hizmeti yapılandırmalarının birçoğu için destek içerir.

Proxy oluşturma

Uygulamanın hizmete bağlanmasına izin veren bir ASMX hizmetini kullanmak için bir Ara sunucu oluşturulmalıdır. Proxy, yöntemleri ve ilişkili hizmet yapılandırmasını tanımlayan hizmet meta verileri aracılığıyla oluşturulur. Bu meta veriler, Web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi olarak sunulur. proxy, web hizmetine platforma özgü projelere web başvurusu eklemek için Mac için Visual Studio veya Visual Studio kullanılarak oluşturulur.

Web hizmeti URL 'SI, yol ön eki aracılığıyla erişilebilen bir barındırılan uzak kaynak veya yerel dosya sistemi kaynağı olabilir file:/// , örneğin:

file:///Users/myUserName/projects/MyProjectName/service.wsdl

Web hizmeti URL 'SI, bir barındırılan uzak kaynak veya dosya yolu ön eki aracılığıyla erişilebilen yerel dosya sistemi kaynağı olabilir

Bu, proxy 'yi projenin Web veya hizmet başvuruları klasöründe oluşturur. Bir ara sunucu oluşturulduğundan kod değiştirilmemelidir.

Project bir proxy 'yi el ile ekleme

Uyumlu araçlar kullanılarak oluşturulmuş mevcut bir proxy 'niz varsa, bu çıkış projenizin bir parçası olarak dahil edildiğinde tüketilebilir. Mac için Visual Studio, proxy 'yi eklemek için dosya ekle... menü seçeneğini kullanın. Buna ek olarak, bu System.Web.Services.dllBaşvuru Ekle... iletişim kutusu kullanılarak açıkça başvurulmasına gerek duyar.

Proxy 'yi kullanma

Oluşturulan proxy sınıfları, zaman uyumsuz programlama modeli (APM) tasarım modelini kullanan Web hizmetini tüketmeye yönelik yöntemler sağlar. Bu düzende zaman uyumsuz bir işlem, zaman uyumsuz işlemi başlayıp sona erdirmek üzere Beginoperationname ve Endoperationnameadlı iki yöntem olarak uygulanır.

Beginoperationname yöntemi zaman uyumsuz işlemi başlatır ve arabirimi uygulayan bir nesne döndürür . Beginoperationnameçağrıldıktan sonra, bir uygulama çağıran iş parçacığı üzerinde yönergeleri yürütmeye devam edebilir, ancak zaman uyumsuz işlem bir iş parçacığı havuzu iş parçacığı üzerinde gerçekleşir.

Her Beginoperationnameçağrısı için, uygulamanın sonuçlarını almak Için de Endoperationname çağrısı yapılmalıdır. Endoperationname dönüş değeri, zaman uyumlu Web hizmeti yöntemi tarafından döndürülen türdür. Aşağıdaki kod örneğinde buna bir örnek gösterilmektedir:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync<ASMXService.TodoItem[]> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);
  ...
}

Görev paralel kitaplığı (TPL), aynı nesnedeki zaman uyumsuz işlemleri kapsülleyerek APM başlangıç/bitiş yöntemi çiftini kullanma sürecini basitleştirebilir Task . Bu kapsülleme, yöntemin birden fazla aşırı yüklemesi tarafından sağlanır Task.Factory.FromAsync . Bu yöntem, yöntemi TaskTodoService.EndGetTodoItems tamamlandıktan sonra yöntemi yürüten, bir TodoService.BeginGetTodoItemsnull veri temsilciye geçirilmediğini belirten BeginGetTodoItems bir oluşturur. Son olarak, numaralandırmanın değeri, TaskCreationOptions görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

APM hakkında daha fazla bilgi için bkz. zaman uyumsuz programlama modeli ve TPL ve geleneksel .NET Framework zaman uyumsuz programlama MSDN.

ASMX hizmetini kullanma hakkında daha fazla bilgi için bkz. ASP.NET Web hizmeti kullanma (ASMX).

Windows Communication Foundation (WCF)

WCF, Microsoft 'un hizmet yönelimli uygulamalar oluşturmaya yönelik Birleşik çerçevedir. Geliştiricilerin güvenli, güvenilir, işlem temelli ve birlikte çalışabilen dağıtılmış uygulamalar oluşturmalarına olanak sağlar.

WCF, aşağıdakiler dahil olmak üzere çeşitli farklı sözleşmelere sahip bir hizmeti açıklar:

  • Veri sözleşmeleri – bir ileti içindeki içeriğin temelini oluşturan veri yapılarını tanımlayın.
  • İleti sözleşmeleri – mevcut veri sözleşmelerinden ileti oluşturun.
  • Hata sözleşmeleri – özel SOAP hatalarının belirtilmesine izin verir.
  • Hizmet sözleşmeleri – hizmetlerin desteklediği işlemleri ve her işlemle etkileşim kurmak için gereken iletileri belirtin. Ayrıca, her bir hizmette işlemlerle ilişkilendirilebilen özel bir hata davranışı da belirtir.

ASP.NET Web hizmetleri (asmx) ve WCF arasında farklılıklar vardır ancak wcf 'nin, HTTP üzerinden SOAP iletileri sağlayan aynı özellikleri desteklediğini anlamak önemlidir.

Önemli

WCF için Xamarin platform desteği, sınıfını kullanarak HTTP/HTTPS üzerinden metin kodlu SOAP iletileriyle sınırlıdır BasicHttpBinding . ayrıca, WCF desteği, proxy oluşturmak için yalnızca bir Windows ortamda kullanılabilen araçların kullanılmasını gerektirir.

Proxy oluşturma

Uygulamanın hizmete bağlanmasına izin veren bir WCF hizmetini kullanmak için bir Ara sunucu oluşturulmalıdır. Proxy, yöntemleri ve ilişkili hizmet yapılandırmasını tanımlayan hizmet meta verileri aracılığıyla oluşturulur. Bu meta veriler, Web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi biçiminde gösterilir. proxy, bir .NET Standard kitaplığına Web hizmetine bir hizmet başvurusu eklemek için Visual Studio 2017 ' deki Microsoft WCF Web Service Reference Provider kullanılarak oluşturulabilir.

Visual Studio 2017 ' deki Microsoft WCF Web Service Reference Provider kullanarak proxy oluşturma alternatifi, ServiceModel meta veri yardımcı programı aracını (svcutil.exe) kullanmaktır. Daha fazla bilgi için bkz. ServiceModel Metadata Utility aracı (Svcutil.exe).

Proxy 'yi yapılandırma

Oluşturulan proxy 'yi yapılandırmak, başlatma sırasında genellikle iki yapılandırma bağımsız değişkeni (SOAP 1.1/ASMX veya WCF 'ye bağlı olarak) alır: EndpointAddress Aşağıdaki örnekte gösterildiği gibi, ve/veya ilişkili bağlama bilgileri:

var binding = new BasicHttpBinding () {
       Name= "basicHttpBinding",
       MaxReceivedMessageSize = 67108864,
};

binding.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas() {
       MaxArrayLength = 2147483646,
       MaxStringContentLength = 5242880,
};

var timeout = new TimeSpan(0,1,0);
binding.SendTimeout= timeout;
binding.OpenTimeout = timeout;
binding.ReceiveTimeout = timeout;

client = new Service1Client (binding, new EndpointAddress ("http://192.168.1.100/Service1.svc"));

Bir bağlama, uygulamalar ve hizmetlerin birbirleriyle iletişim kurması için gereken aktarım, kodlama ve protokol ayrıntılarını belirtmek için kullanılır. , BasicHttpBinding Metin kodlu SOAP ILETILERININ http Aktarım Protokolü üzerinden gönderileceğini belirtir. Bir uç nokta adresi belirtmek, uygulamanın birden çok yayımlanmış örnek olması şartıyla, WCF hizmetinin farklı örneklerine bağlanmasına olanak sağlar.

Proxy 'yi kullanma

Oluşturulan proxy sınıfları, zaman uyumsuz programlama modeli (APM) tasarım modelini kullanan Web hizmetlerini kullanmak için yöntemler sağlar. Bu düzende, zaman uyumsuz bir işlem, zaman uyumsuz işlemi başlayıp sona erdirmek üzere Beginoperationname ve Endoperationnameadlı iki yöntem olarak uygulanır.

Beginoperationname yöntemi zaman uyumsuz işlemi başlatır ve arabirimi uygulayan bir nesne döndürür . Beginoperationnameçağrıldıktan sonra, bir uygulama çağıran iş parçacığı üzerinde yönergeleri yürütmeye devam edebilir, ancak zaman uyumsuz işlem bir iş parçacığı havuzu iş parçacığı üzerinde gerçekleşir.

Her Beginoperationnameçağrısı için, uygulamanın sonuçlarını almak Için de Endoperationname çağrısı yapılmalıdır. Endoperationname dönüş değeri, zaman uyumlu Web hizmeti yöntemi tarafından döndürülen türdür. Aşağıdaki kod örneğinde buna bir örnek gösterilmektedir:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);
  ...
}

Görev paralel kitaplığı (TPL), aynı nesnedeki zaman uyumsuz işlemleri kapsülleyerek APM başlangıç/bitiş yöntemi çiftini kullanma sürecini basitleştirebilir Task . Bu kapsülleme, yöntemin birden fazla aşırı yüklemesi tarafından sağlanır Task.Factory.FromAsync . Bu yöntem, yöntemi TaskTodoServiceClient.EndGetTodoItems tamamlandıktan sonra yöntemi yürüten, bir TodoServiceClient.BeginGetTodoItemsnull veri temsilciye geçirilmediğini belirten BeginGetTodoItems bir oluşturur. Son olarak, numaralandırmanın değeri, TaskCreationOptions görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

APM hakkında daha fazla bilgi için bkz. zaman uyumsuz programlama modeli ve TPL ve geleneksel .NET Framework zaman uyumsuz programlama MSDN.

WCF hizmeti kullanma hakkında daha fazla bilgi için bkz. Windows Communication Foundation (WCF) Web hizmetikullanma.

Taşıma güvenliğini kullanma

WCF Hizmetleri, iletilerin yakaına karşı korunmak için aktarım düzeyi güvenliği kullanabilir. Xamarin Platformu, SSL kullanarak aktarım düzeyi güvenliği kullanan bağlamaları destekler. Ancak, yığının sertifikayı doğrulaması gerekebileceği durumlar olabilir. bu durum, beklenmeyen davranışlara neden olur. ServerCertificateValidationCallbackAşağıdaki kod örneğinde gösterildiği gibi, hizmet çağırmadan önce bir temsilciyi kaydederek doğrulama geçersiz kılınabilir:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) => { return true; };

Bu, sunucu tarafı sertifika doğrulamasını yoksayarak aktarım şifrelemesini korur. Ancak, bu yaklaşım sertifikayla ilişkili güven kaygılarını etkili bir şekilde yoksayar ve uygun olmayabilir. Daha fazla bilgi için bkz. Mono-Project.comüzerinde güvenilir kökleri kullanma .

Istemci kimlik bilgileri güvenliğini kullanma

WCF Hizmetleri, hizmet istemcilerinin kimlik bilgilerini kullanarak kimlik doğrulaması yapmasını de gerektirebilir. Xamarin Platformu, istemcilerin kimlik bilgilerini SOAP iletisi zarfı içinde göndermesini sağlayan WS-Security protokolünü desteklemez. Ancak Xamarin Platformu, uygun olanını belirterek sunucuya HTTP temel kimlik doğrulama kimlik bilgileri gönderme özelliğini destekler ClientCredentialType :

basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

Ardından, temel kimlik doğrulama kimlik bilgileri belirtilebilir:

client.ClientCredentials.UserName.UserName = @"foo";
client.ClientCredentials.UserName.Password = @"mrsnuggles";

HTTP temel kimlik doğrulaması hakkında daha fazla bilgi için, REST Web hizmeti bağlamında, bkz. Restlebir Web hizmetinin kimlik doğrulaması.