Web Hizmetlerine Giriş
Bu kılavuzda farklı web hizmeti teknolojilerinin nasıl tükettiği gösterilmektedir. Kapsanan konular REST hizmetleri, SOAP hizmetleri ve Windows Communication Foundation hizmetleriyle iletişim kurmaktır.
Düzgün çalışması için birçok mobil uygulama buluta bağımlıdır ve bu nedenle web hizmetlerini mobil uygulamalarla tümleştirmek yaygın bir senaryodur. Xamarin platformu farklı web hizmeti teknolojilerinin tüketilmesine destek olur ve RESTful, ASMX ve Windows Communication Foundation (WCF) hizmetlerinin kullanımına yönelik yerleşik ve üçüncü taraf desteği içerir.
Xamarin.Forms kullanan müşteriler için, Xamarin.Forms Web Hizmetleri belgelerinde bu teknolojilerin her birini kullanan tam örnekler vardır.
Önemli
iOS 9'da, Uygulama Aktarım Güvenliği (ATS), İnternet kaynakları (uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantıları zorunlu kılarak hassas bilgilerin yanlışlıkla açıklanmasını önler. iOS 9 için oluşturulan uygulamalarda ATS 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.
İnternet kaynakları için protokolü ve güvenli iletişimi kullanmak HTTPS
mümkün değilse ATS'yi geri çevirebilirsiniz. Bu, uygulamanın Info.plist dosyası güncelleştirilerek elde edilebilir. Daha fazla bilgi için bkz . Uygulama Aktarım Güvenliği.
REST
Temsili Durum Aktarımı (REST), web hizmetleri oluşturmaya yönelik bir mimari stildir. REST istekleri, web tarayıcılarının web sayfalarını almak ve sunuculara veri göndermek için kullandığı HTTP fiilleri kullanılarak HTTP üzerinden yapılır. Fiiller şunlardır:
- GET – Bu işlem web hizmetinden veri 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ştirilmesi gerektiğiyle ilgili bir dizi yönerge açıklanarak web hizmetindeki bir veri öğesini güncelleştirmek için kullanılır. Bu fiil örnek uygulamada kullanılmaz.
- DELETE – Bu işlem web hizmetindeki bir veri öğesini silmek için kullanılır.
REST'e bağlı web hizmeti API'leri RESTful API'leri olarak adlandırılır ve aşağıdakiler kullanılarak tanımlanı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 uygulamalarda web hizmetlerine erişmek için birincil yöntem haline getirmesine yardımcı olmuştur.
REST Hizmetlerini Kullanma
REST hizmetlerini kullanmak için kullanılabilecek bir dizi kitaplık ve sınıf vardır ve aşağıdaki alt bölümlerde bunlar ele alınmaktadır. REST hizmeti kullanma hakkında daha fazla bilgi için bkz . RESTful Web Hizmeti Kullanma.
HttpClient
Microsoft HTTP İstemci KitaplıklarıHttpClient
, HTTP üzerinden istek göndermek ve almak için kullanılan sınıfını sağlar. HTTP istekleri göndermek ve URI tarafından tanımlanan bir kaynaktan HTTP yanıtları 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ış.
sınıfı, HttpResponseMessage
bir HTTP isteği yapıldıktan sonra web hizmetinden alınan http yanıt iletisini temsil eder. Durum kodu, üst bilgiler ve gövde dahil olmak üzere yanıt hakkındaki bilgileri içerir. sınıfı, HttpContent
VE gibi Content-Type
Content-Encoding
HTTP gövdesini ve içerik üst bilgilerini temsil eder. İçerik, verilerin biçimine bağlı olarak ve ReadAsByteArrayAsync
gibi ReadAsStringAsync
yöntemlerden ReadAs
herhangi biri kullanılarak okunabilir.
sınıfı hakkında HttpClient
daha fazla bilgi için bkz . HTTPClient Nesnesi Oluşturma.
HTTPWebRequest
ile web hizmetlerini çağırmak HTTPWebRequest
şunları içerir:
- Belirli bir URI için istek örneği oluşturma.
- İstek örneğinde çeşitli HTTP özelliklerini ayarlama.
- İstekten alma
HttpWebResponse
. - Yanıttan veri okuma.
Örneğin, aşağıdaki kod ABD Ulusal Tıp Kütüphanesi web hizmetinden veri 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, JSON olarak biçimlendirilmiş verileri döndürecek bir HttpWebRequest
oluşturur. Veriler, verileri okumak için alınabilecek bir StreamReader
içinde HttpWebResponse
döndürülür.
RestSharp
REST hizmetlerini kullanmaya yönelik bir diğer yaklaşım da RestSharp kitaplığını kullanmaktır. RestSharp, sonuçları ham dize içeriği olarak veya seri durumdan çıkarılmış bir C# nesnesi olarak alma desteği de dahil olmak üzere HTTP isteklerini kapsüller. Örneğin, aşağıdaki kod ABD Ulusal Tıp Kitaplığı web hizmetine bir istekte bulunur 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 RestSharp.RestResponse.Content
ham JSON dizesini alacak ve bir C# nesnesine dönüştürecek bir yöntemdir. Web hizmetlerinden döndürülen verilerin seri durumdan çıkarılması bu makalenin devamında ele alınmalıdır.
NSUrl Bağlan ion
Gibi Mono temel sınıf kitaplığında (BCL) ve RestSharp gibi HttpWebRequest
üçüncü taraf C# kitaplıklarında kullanılabilen sınıflara ek olarak, web hizmetlerini kullanmak için platforma özgü sınıflar da 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 Tıp Kitaplığı web hizmetinin nasıl çağrılğını gösterir:
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();
}
}
Genel olarak, web hizmetlerinin tüketilmesine yönelik platforma özgü sınıflar, yerel kodun C# konumuna geçirildiği senaryolarla sınırlı olmalıdır. Mümkün olduğunda, web hizmeti erişim kodu platformlar arası paylaşılabilmesi için taşınabilir olmalıdır.
ServiceStack
Web hizmetlerini çağırmak için bir diğer seçenek de Service Stack kitaplığıdır. Örneğin, aşağıdaki kod hizmet isteği göndermek için Service Stack'in IServiceClient.GetAsync
yönteminin 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 hizmetlerini çağırmayı ve tüketmeyi kolaylaştırırken, bazen standart DataContract serileştirme kurallarına uymayan XML veya JSON kullanmak önemsizdir. Gerekirse, isteği çağırın ve aşağıda açıklanan ServiceStack.Text kitaplığını kullanarak uygun serileştirmeyi açıkça işleyin.
RESTful Verilerini Kullanma
RESTful web hizmetleri genellikle istemciye veri döndürmek için JSON iletilerini kullanır. JSON, veri gönderirken bant genişliği gereksinimlerini azaltan, kompakt yükler üreten metin tabanlı, veri değişim biçimidir. Bu bölümde, JSON ve Düz Eski XML'de (POX) RESTful yanıtlarını kullanma mekanizmaları incelenecektir.
System.JSON
Xamarin platformu, JSON desteğiyle kullanıma hazır olarak sunulur. bir JsonObject
kullanılarak sonuçlar aşağıdaki kod örneğinde gösterildiği gibi alınabilir:
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, araçların verilerin tamamını belleğe yüklediğini System.Json
bilmeniz önemlidir.
JSON.NET
NewtonSoft JSON.NET kitaplığı, JSON iletilerini seri hale getirme ve seri durumdan çıkarma için yaygın olarak kullanılan bir kitaplıktır. Aşağıdaki kod örneği, bir JSON iletisini C# nesnesine seri durumdan çıkarmak için JSON.NET 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ışmak üzere tasarlanmış bir JSON serileştirme kitaplığıdır. Aşağıdaki kod örneğinde, kullanarak JSON ayrıştırma gösterilmektedir 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.Linq
XML tabanlı REST web hizmeti kullanılması durumunda LINQ to XML, aşağıdaki kod örneğinde gösterildiği gibi XML'yi ayrıştırmak ve satır içi bir C# nesnesini doldurmak için 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 olanağı sağlar. SOAP, web hizmetlerini 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 hakkında hiçbir şey bilmesi gerekmez. Yalnızca SOAP iletileri gönderip almayı anlamaları yeterlidir.
SOAP iletisi, aşağıdaki öğeleri içeren bir XML belgesidir:
- XML belgesini SOAP iletisi olarak tanımlayan Envelope adlı kök öğe.
- Kimlik doğrulama verileri gibi uygulamaya özgü bilgileri içeren isteğe bağlı bir Üst Bilgi öğesi. Header öğesi varsa, 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 Fault öğesi. Fault öğesi varsa, Body öğesinin alt öğesi olmalıdır.
SOAP, HTTP, SMTP, TCP ve UDP gibi birçok aktarım protokolü üzerinde çalışabilir. Ancak ASMX hizmeti yalnızca HTTP üzerinden çalışabilir. Xamarin platformu, HTTP üzerinden standart SOAP 1.1 uygulamalarını destekler ve bu, standart ASMX hizmet yapılandırmalarının birçoğu için destek içerir.
Ara Sunucu Oluşturma
Uygulamanın hizmete bağlanmasına olanak tanıyan 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 kullanılarak oluşturulur. Bu meta veriler, web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi olarak kullanıma sunulur. Ara sunucu, platforma özgü projelere web hizmeti için bir web başvurusu eklemek üzere Mac için Visual Studio veya Visual Studio kullanılarak oluşturulur.
Web hizmeti URL'si barındırılan bir uzak kaynak veya yol ön eki aracılığıyla file:///
erişilebilen yerel dosya sistemi kaynağı olabilir, örneğin:
file:///Users/myUserName/projects/MyProjectName/service.wsdl
Bu, proxy'yi projenin Web veya Hizmet Başvuruları klasöründe oluşturur. Bir ara sunucu kod oluşturulduğundan değiştirilmemelidir.
Projeye El ile Ara Sunucu Ekleme
Uyumlu araçlar kullanılarak oluşturulmuş bir ara sunucunuz varsa, bu çıkış projenizin bir parçası olarak eklendiğinde kullanılabilir. Mac için Visual Studio dosya ekle... menü seçeneğini kullanarak ara sunucuyu ekleyin. Buna ek olarak, System.Web.Services.dll Başvuru Ekle... iletişim kutusu kullanılarak açıkça başvurulmak gerekir.
Ara Sunucuyu Kullanma
Oluşturulan ara sunucu sınıfları, Zaman Uyumsuz Programlama Modeli (APM) tasarım desenini kullanan web hizmetini kullanmaya yönelik yöntemler sağlar. Bu düzende zaman uyumsuz bir işlem, zaman uyumsuz işlemi başlatan ve sonlandıran BeginOperationName ve EndOperationName adlı iki yöntem olarak uygulanır.
BeginOperationName yöntemi zaman uyumsuz işlemi başlatır ve arabirimini uygulayan IAsyncResult
bir nesne döndürür. BeginOperationName çağrıldıktan sonra, zaman uyumsuz işlem bir iş parçacığı havuzu iş parçacığında gerçekleşirken, bir uygulama çağıran iş parçacığında yönergeleri yürütmeye devam edebilir.
BeginOperationName çağrısının her biri için, uygulamanın işlemin sonuçlarını almak için EndOperationName'i de çağırması gerekir. EndOperationName değerinin dönüş değeri, zaman uyumlu web hizmeti yöntemi tarafından döndürülen türle aynıdır. Aşağıdaki kod örneği bunun bir örneğini gösterir:
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ı Task
nesnedeki zaman uyumsuz işlemleri kapsülleyerek APM başlangıç/bitiş yöntemi çiftini kullanma işlemini basitleştirebilir. Bu kapsülleme yöntemin birden çok aşırı yüklemesi Task.Factory.FromAsync
tarafından sağlanır. Bu yöntem, null
yöntem tamamlandıktan sonra TodoService.BeginGetTodoItems
yöntemini yürüten TodoService.EndGetTodoItems
bir Task
oluşturur ve parametresi temsilciye BeginGetTodoItems
veri geçirilmediğini gösterir. Son olarak, numaralandırmanın TaskCreationOptions
değeri, 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 . MSDN'de Zaman Uyumsuz Programlama Modeli ve TPL ve Geleneksel .NET Framework Zaman Uyumsuz Programlama .
ASMX hizmetini kullanma hakkında daha fazla bilgi için bkz . ASP.NET Web Hizmeti (ASMX) kullanma.
Windows Communication Foundation (WCF)
WCF, Microsoft'un hizmet odaklı uygulamalar oluşturmaya yönelik birleşik çerçevesidir. Geliştiricilerin güvenli, güvenilir, işlem yapılmış ve birlikte çalışabilen dağıtılmış uygulamalar oluşturmasını sağlar.
WCF, aşağıdakileri içeren çeşitli anlaşmalara sahip bir hizmeti açıklar:
- Veri sözleşmeleri – bir iletideki içeriğin temelini oluşturan veri yapılarını tanımlayın.
- İleti sözleşmeleri – Mevcut veri sözleşmelerinden iletiler oluşturma.
- 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 için gereken iletileri belirtin. Ayrıca, her hizmet üzerindeki işlemlerle ilişkilendirilebilen özel hata davranışlarını da belirtir.
ASP.NET Web Hizmetleri (ASMX) ile WCF arasında farklar vardır, ancak WCF'nin ASMX'in sağladığı özellikleri (HTTP üzerinden SOAP iletileri) desteklediğini anlamak önemlidir.
Önemli
WCF için Xamarin platform desteği, sınıfını kullanan HTTP/HTTPS üzerinden metin kodlanmış SOAP iletileriyle BasicHttpBinding
sınırlıdır. Ayrıca WCF desteği, ara sunucuyu oluşturmak için yalnızca Windows ortamında kullanılabilen araçların kullanılmasını gerektirir.
Ara Sunucu Oluşturma
Uygulamanın hizmete bağlanmasına olanak tanıyan bir WCF hizmeti 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 kullanılarak oluşturulur. Bu meta veriler, web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi biçiminde kullanıma sunulur. Ara sunucu, .NET Standart Kitaplığı'na web hizmeti için bir hizmet başvurusu eklemek üzere Visual Studio 2017'deki Microsoft WCF Web Hizmeti Başvuru Sağlayıcısı kullanılarak oluşturulabilir.
Visual Studio 2017'de Microsoft WCF Web Hizmeti Başvuru Sağlayıcısı'nı kullanarak ara sunucu oluşturmanın bir alternatifi, ServiceModel Meta Veri Yardımcı Programı Aracı'nı (svcutil.exe) kullanmaktır. Daha fazla bilgi için bkz. ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe).
Ara Sunucuyu Yapılandırma
Oluşturulan ara sunucuyu 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"));
Bağlama, uygulamaların ve hizmetlerin birbiriyle 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. Uç nokta adresi belirtmek, uygulamanın birden çok yayımlanmış örnek olması koşuluyla WCF hizmetinin farklı örneklerine bağlanmasına olanak tanır.
Ara Sunucuyu Kullanma
Oluşturulan ara sunucu sınıfları, Zaman Uyumsuz Programlama Modeli (APM) tasarım desenini kullanan web hizmetlerini kullanmaya yönelik yöntemler sağlar. Bu düzende, zaman uyumsuz bir işlem BeginOperationName ve EndOperationName adlı, zaman uyumsuz işlemi başlatan ve sonlandıran iki yöntem olarak uygulanır.
BeginOperationName yöntemi zaman uyumsuz işlemi başlatır ve arabirimini uygulayan IAsyncResult
bir nesne döndürür. BeginOperationName çağrıldıktan sonra, zaman uyumsuz işlem bir iş parçacığı havuzu iş parçacığında gerçekleşirken, bir uygulama çağıran iş parçacığında yönergeleri yürütmeye devam edebilir.
BeginOperationName çağrısının her biri için, uygulamanın işlemin sonuçlarını almak için EndOperationName'i de çağırması gerekir. EndOperationName değerinin dönüş değeri, zaman uyumlu web hizmeti yöntemi tarafından döndürülen türle aynıdır. Aşağıdaki kod örneği bunun bir örneğini gösterir:
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ı Task
nesnedeki zaman uyumsuz işlemleri kapsülleyerek APM başlangıç/bitiş yöntemi çiftini kullanma işlemini basitleştirebilir. Bu kapsülleme yöntemin birden çok aşırı yüklemesi Task.Factory.FromAsync
tarafından sağlanır. Bu yöntem, null
yöntem tamamlandıktan sonra TodoServiceClient.BeginGetTodoItems
yöntemini yürüten TodoServiceClient.EndGetTodoItems
bir Task
oluşturur ve parametresi temsilciye BeginGetTodoItems
veri geçirilmediğini gösterir. Son olarak, numaralandırmanın TaskCreationOptions
değeri, 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 . MSDN'de Zaman Uyumsuz Programlama Modeli ve TPL ve Geleneksel .NET Framework Zaman Uyumsuz Programlama .
WCF hizmeti kullanma hakkında daha fazla bilgi için bkz . Windows Communication Foundation (WCF) Web Hizmeti Kullanma.
Aktarım Güvenliğini Kullanma
WCF Hizmetleri, iletilerin kesilmesine karşı koruma sağlamak 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 ve bu da istenmeyen davranışlara neden olabilir. Doğrulama, aşağıdaki kod örneğinde gösterildiği gibi hizmeti çağırmadan önce bir ServerCertificateValidationCallback
temsilci kaydedilerek 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 endişelerini etkili bir şekilde göz ardı eder ve uygun olmayabilir. Daha fazla bilgi için bkz. mono-project.com üzerinde Güvenilen Kökleri Saygılı Bir Şekilde Kullanma.
İstemci Kimlik Bilgisi Güvenliğini Kullanma
WCF hizmetleri, hizmet istemcilerinin kimlik bilgilerini kullanarak kimlik doğrulamasını da gerektirebilir. Xamarin platformu, istemcilerin SOAP ileti zarfı içinde kimlik bilgileri göndermesine olanak tanıyan WS-Security Protokol'lerini desteklemez. Ancak Xamarin platformu, uygun ClientCredentialType
öğesini belirterek HTTP Temel Kimlik Doğrulaması kimlik bilgilerini sunucuya gönderme özelliğini destekler:
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
Ardından, temel kimlik doğrulaması kimlik bilgileri belirtilebilir:
client.ClientCredentials.UserName.UserName = @"foo";
client.ClientCredentials.UserName.Password = @"mrsnuggles";
REST web hizmeti bağlamında olsa da HTTP temel kimlik doğrulaması hakkında daha fazla bilgi için bkz . RESTful Web Hizmetinin Kimliğini Doğrulama.