Wprowadzenie do usług internetowych

W tym przewodniku pokazano, jak korzystać z różnych technologii usług internetowych. Omówione tematy obejmują komunikację z usługami REST, usługami SOAP i usługami Windows Communication Foundation.

Aby prawidłowo działać, wiele aplikacji mobilnych jest zależnych od chmury, dlatego integrowanie usług internetowych z aplikacjami mobilnymi jest typowym scenariuszem. Platforma Xamarin obsługuje korzystanie z różnych technologii usług internetowych i obejmuje wbudowaną i inną obsługę korzystania z usług RESTful, ASMX i Windows Communication Foundation (WCF).

W przypadku klientów korzystających z zestawu narzędzi Xamarin.Forms dostępne są kompletne przykłady użycia każdej z tych technologii w dokumentacji usług sieci Web platformy Xamarin.Forms.

Ważne

W systemie iOS 9 usługa App Transport Security (ATS) wymusza bezpieczne połączenia między zasobami internetowymi (takimi jak serwer zaplecza aplikacji) i aplikacją, co uniemożliwia przypadkowe ujawnienie poufnych informacji. Ponieważ usługa ATS jest domyślnie włączona w aplikacjach utworzonych dla systemu iOS 9, wszystkie połączenia będą objęte wymaganiami dotyczącymi zabezpieczeń usługi ATS. Jeśli połączenia nie spełniają tych wymagań, zakończy się niepowodzeniem z wyjątkiem.

Możesz zrezygnować z usługi ATS, jeśli nie można używać HTTPS protokołu i bezpiecznej komunikacji dla zasobów internetowych. Można to osiągnąć, aktualizując plik Info.plist aplikacji. Aby uzyskać więcej informacji, zobacz App Transport Security.

REST

Representational State Transfer (REST) to styl architektury do tworzenia usług internetowych. Żądania REST są wykonywane za pośrednictwem protokołu HTTP przy użyciu tych samych czasowników HTTP, których przeglądarki internetowe używają do pobierania stron internetowych i wysyłania danych do serwerów. Czasowniki to:

  • GET — ta operacja służy do pobierania danych z usługi internetowej.
  • POST — ta operacja służy do tworzenia nowego elementu danych w usłudze internetowej.
  • PUT — ta operacja służy do aktualizowania elementu danych w usłudze internetowej.
  • PATCH — ta operacja służy do aktualizowania elementu danych w usłudze internetowej, opisując zestaw instrukcji dotyczących sposobu modyfikacji elementu. To zlecenie nie jest używane w przykładowej aplikacji.
  • DELETE — ta operacja służy do usuwania elementu danych w usłudze internetowej.

Interfejsy API usługi internetowej, które są zgodne z interfejsem REST, są nazywane interfejsami API RESTful i są definiowane przy użyciu:

  • Podstawowy identyfikator URI.
  • Metody HTTP, takie jak GET, POST, PUT, PATCH lub DELETE.
  • Typ nośnika danych, taki jak JavaScript Object Notation (JSON).

Prostota interfejsu REST pomogła uczynić ją podstawową metodą uzyskiwania dostępu do usług internetowych w aplikacjach mobilnych.

Korzystanie z usług REST

Istnieje wiele bibliotek i klas, które mogą służyć do korzystania z usług REST, a w poniższych podsekcjach omówiono je. Aby uzyskać więcej informacji na temat korzystania z usługi REST, zobacz Korzystanie z usługi internetowej RESTful.

HttpClient

Biblioteki klienta HTTP firmy Microsoft udostępniają klasę HttpClient , która służy do wysyłania i odbierania żądań za pośrednictwem protokołu HTTP. Zapewnia ona funkcje wysyłania żądań HTTP i odbierania odpowiedzi HTTP z zasobu zidentyfikowanego przez identyfikator URI. Każde żądanie jest wysyłane jako operacja asynchroniczna. Aby uzyskać więcej informacji na temat operacji asynchronicznych, zobacz Async Support Overview (Omówienie asynchronicznej pomocy technicznej).

Klasa HttpResponseMessage reprezentuje komunikat odpowiedzi HTTP odebrany z usługi internetowej po wykonaniu żądania HTTP. Zawiera informacje o odpowiedzi, w tym kod stanu, nagłówki i treść. Klasa HttpContent reprezentuje treść HTTP i nagłówki zawartości, takie jak Content-Type i Content-Encoding. Zawartość może być odczytywana przy użyciu dowolnej z ReadAs metod, takich jak ReadAsStringAsync i ReadAsByteArrayAsync, w zależności od formatu danych.

Aby uzyskać więcej informacji na temat HttpClient klasy, zobacz Creating the HTTPClient Object (Tworzenie obiektu HTTPClient).

HTTPWebRequest

Wywoływanie usług internetowych za pomocą HTTPWebRequest programu obejmuje:

  • Tworzenie wystąpienia żądania dla określonego identyfikatora URI.
  • Ustawianie różnych właściwości PROTOKOŁU HTTP w wystąpieniu żądania.
  • Pobieranie elementu HttpWebResponse z żądania.
  • Odczytywanie danych z odpowiedzi.

Na przykład poniższy kod pobiera dane z amerykańskiej narodowej biblioteki internetowej Medicine:

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);
  }
}

Powyższy przykład tworzy obiekt HttpWebRequest , który zwróci dane sformatowane jako JSON. Dane są zwracane w HttpWebResponseobiekcie , z którego StreamReader można uzyskać dane w celu odczytania danych.

RestSharp

Innym podejściem do korzystania z usług REST jest użycie biblioteki RestSharp . RestSharp hermetyzuje żądania HTTP, w tym obsługę pobierania wyników jako nieprzetworzonej zawartości ciągu lub jako deserializacji obiektu języka C#. Na przykład poniższy kod wysyła żądanie do usługi internetowej Narodowej Biblioteki Medycyny USA i pobiera wyniki jako ciąg sformatowany w formacie JSON:

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 to metoda, która przejmie nieprzetworzone ciąg JSON z RestSharp.RestResponse.Content właściwości i przekonwertuje go na obiekt C#. Deserializowanie danych zwracanych z usług internetowych zostało omówione w dalszej części tego artykułu.

NSUrl Połączenie ion

Oprócz klas dostępnych w bibliotece klas bazowych Mono (BCL), takich jak i biblioteki języka C# innych firm, takie jak HttpWebRequestRestSharp, klasy specyficzne dla platformy są również dostępne do korzystania z usług internetowych. Na przykład w systemie iOS NSUrlConnection można użyć klas i NSMutableUrlRequest .

W poniższym przykładzie kodu pokazano, jak wywołać usługę internetową Us National Library of Medicine przy użyciu klas systemu iOS:

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();
       }
}

Ogólnie rzecz biorąc, klasy specyficzne dla platformy do korzystania z usług internetowych powinny być ograniczone do scenariuszy, w których kod natywny jest przenoszony do języka C#. Jeśli to możliwe, kod dostępu do usługi internetowej powinien być przenośny, aby można było udostępnić go międzyplatformowo.

ServiceStack

Inną opcją wywoływania usług internetowych jest biblioteka usługi Service Stack . Na przykład poniższy kod pokazuje, jak używać metody usługi Service Stack IServiceClient.GetAsync do wystawiania żądania obsługi:

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

Ważne

Narzędzia takie jak ServiceStack i RestSharp ułatwiają wywoływanie i korzystanie z usług REST, ale czasami nie jest proste do korzystania z plików XML lub JSON, które nie są zgodne ze standardową konwencją serializacji DataContract . W razie potrzeby wywołaj żądanie i obsłuż odpowiednią serializacji jawnie przy użyciu biblioteki ServiceStack.Text omówionej poniżej.

Korzystanie z danych RESTful

Usługi internetowe RESTful zwykle używają komunikatów JSON do zwracania danych do klienta. JSON to oparty na tekście format wymiany danych, który generuje kompaktowe ładunki, co powoduje zmniejszenie wymagań dotyczących przepustowości podczas wysyłania danych. W tej sekcji zostaną zbadane mechanizmy korzystania z odpowiedzi RESTful w formatach JSON i Plain-Old-XML (POX).

System.JSON

Platforma Xamarin jest dostarczana z obsługą gotowego kodu JSON. Korzystając z elementu JsonObject, wyniki można pobrać, jak pokazano w poniższym przykładzie kodu:

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"];

Należy jednak pamiętać, że System.Json narzędzia ładują całe dane do pamięci.

JSON.NET

Biblioteka NewtonSoft JSON.NET jest powszechnie używaną biblioteką do serializacji i deserializacji komunikatów JSON. W poniższym przykładzie kodu pokazano, jak używać JSON.NET do deserializacji komunikatu JSON do obiektu C#:

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 to biblioteka serializacji JSON przeznaczona do pracy z biblioteką ServiceStack. Poniższy przykład kodu przedstawia sposób analizowania kodu JSON przy użyciu elementu 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

W przypadku korzystania z usługi internetowej REST opartej na języku XML można użyć linQ to XML do analizowania kodu XML i wypełniania wbudowanego obiektu języka C#, jak pokazano w poniższym przykładzie kodu:

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,
       });

usługa internetowa ASP.NET (ASMX)

Usługa ASMX umożliwia tworzenie usług internetowych, które wysyłają komunikaty przy użyciu protokołu SIMPLE Object Access Protocol (SOAP). Soap to niezależny od platformy i niezależny od języka protokół do tworzenia i uzyskiwania dostępu do usług internetowych. Konsumenci usługi ASMX nie muszą wiedzieć nic o platformie, modelu obiektów lub języku programowania używanym do implementowania usługi. Muszą tylko zrozumieć, jak wysyłać i odbierać komunikaty PROTOKOŁU SOAP.

Komunikat PROTOKOŁU SOAP to dokument XML zawierający następujące elementy:

  • Element główny o nazwie Koperta identyfikujący dokument XML jako komunikat PROTOKOŁU SOAP.
  • Opcjonalny element Nagłówek zawierający informacje specyficzne dla aplikacji, takie jak dane uwierzytelniania. Jeśli element Nagłówek jest obecny, musi być pierwszym elementem podrzędnym elementu Koperta.
  • Wymagany element Treść zawierający komunikat SOAP przeznaczony dla adresata.
  • Opcjonalny element błędu używany do wskazywania komunikatów o błędach. Jeśli element Fault jest obecny, musi być elementem podrzędnym elementu Body.

Protokół SOAP może działać za pośrednictwem wielu protokołów transportowych, w tym HTTP, SMTP, TCP i UDP. Jednak usługa ASMX może działać tylko za pośrednictwem protokołu HTTP. Platforma Xamarin obsługuje standardowe implementacje protokołu SOAP 1.1 za pośrednictwem protokołu HTTP i obejmuje obsługę wielu standardowych konfiguracji usługi ASMX.

Generowanie serwera proxy

Aby korzystać z usługi ASMX, należy wygenerować serwer proxy , który umożliwia aplikacji łączenie się z usługą. Serwer proxy jest konstruowany przez używanie metadanych usługi, które definiują metody i skojarzoną konfigurację usługi. Te metadane są udostępniane jako dokument WSDL (Web Services Description Language), który jest generowany przez usługę internetową. Serwer proxy jest kompilowany przy użyciu Visual Studio dla komputerów Mac lub programu Visual Studio w celu dodania odwołania do sieci Web dla usługi internetowej do projektów specyficznych dla platformy.

Adres URL usługi sieci Web może być hostowanym źródłem zdalnym lub lokalnym zasobem systemu plików dostępnym za pośrednictwem prefiksu file:/// ścieżki, na przykład:

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

The web service URL can either be a hosted remote source or local file system resource accessible via the file path prefix

Spowoduje to wygenerowanie serwera proxy w folderze Web lub Service References projektu. Ponieważ serwer proxy jest generowany kod, nie należy go modyfikować.

Ręczne dodawanie serwera proxy do projektu

Jeśli masz istniejący serwer proxy, który został wygenerowany przy użyciu zgodnych narzędzi, te dane wyjściowe mogą być używane w ramach projektu. W Visual Studio dla komputerów Mac użyj opcji menu Dodaj pliki... w celu dodania serwera proxy. Ponadto wymaga to jawnego odwołania System.Web.Services.dll przy użyciu okna dialogowego Dodawanie odwołań...

Korzystanie z serwera proxy

Wygenerowane klasy serwera proxy udostępniają metody korzystania z usługi internetowej korzystającej ze wzorca projektowego modelu programowania asynchronicznego (APM). W tym wzorcu operacja asynchroniczna jest implementowana jako dwie metody o nazwach BeginOperationName i EndOperationName, które rozpoczynają i kończą operację asynchroniczną.

Metoda BeginOperationName rozpoczyna operację asynchroniczną i zwraca obiekt implementujący IAsyncResult interfejs. Po wywołaniu metody BeginOperationName aplikacja może kontynuować wykonywanie instrukcji w wątku wywołującym, podczas gdy operacja asynchroniczna odbywa się w wątku puli wątków.

Dla każdego wywołania beginOperationName aplikacja powinna również wywołać EndOperationName, aby uzyskać wyniki operacji. Zwracana wartość EndOperationName jest tym samym typem zwracanym przez synchroniczną metodę usługi internetowej. Poniższy przykład kodu przedstawia przykład tego:

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

Biblioteka równoległa zadań (TPL) może uprościć proces korzystania z pary metod rozpoczęcia/zakończenia APM, hermetyzując operacje asynchroniczne w tym samym Task obiekcie. Hermetyzacja jest dostarczana przez wiele przeciążeń Task.Factory.FromAsync metody. Ta metoda tworzy metodę Task , która wykonuje TodoService.EndGetTodoItems metodę po zakończeniu TodoService.BeginGetTodoItems metody z parametrem null wskazującym, że żadne dane nie są przekazywane do delegata BeginGetTodoItems . Na koniec wartość TaskCreationOptions wyliczenia określa, że należy użyć domyślnego zachowania podczas tworzenia i wykonywania zadań.

Aby uzyskać więcej informacji na temat APM, zobacz Asynchronous Programming Model (Model programowania asynchronicznego) oraz TPL (TPL) i Traditional .NET Framework Asynchronous Programming on MSDN (Programowanie asynchroniczne w witrynie MSDN).

Aby uzyskać więcej informacji na temat korzystania z usługi ASMX, zobacz Korzystanie z usługi internetowej ASP.NET (ASMX).

Windows Communication Foundation (WCF)

WCF to ujednolicona struktura firmy Microsoft służąca do tworzenia aplikacji zorientowanych na usługi. Umożliwia deweloperom tworzenie bezpiecznych, niezawodnych, transakcyjnych i współdziałalnych aplikacji rozproszonych.

WCF opisuje usługę z różnymi kontraktami, które obejmują następujące elementy:

  • Kontrakty danych — definiują struktury danych, które tworzą podstawę zawartości w komunikacie.
  • Kontrakty komunikatów — tworzą komunikaty z istniejących kontraktów danych.
  • Kontrakty błędów — umożliwiają określenie niestandardowych błędów protokołu SOAP.
  • Kontrakty usług — określają operacje obsługiwane przez usługi i komunikaty wymagane do interakcji z każdą operacją. Określają one również wszelkie niestandardowe zachowanie błędów, które można skojarzyć z operacjami w każdej usłudze.

Istnieją różnice między usługami ASP.NET Web Services (ASMX) i WCF, ale ważne jest, aby zrozumieć, że usługa WCF obsługuje te same możliwości, które zapewnia USŁUGA ASMX — komunikaty PROTOKOŁU SOAP za pośrednictwem protokołu HTTP.

Ważne

Obsługa platformy Xamarin dla usługi WCF jest ograniczona do komunikatów PROTOKOŁU SOAP zakodowanych tekstowo za pośrednictwem protokołu HTTP/HTTPS przy użyciu BasicHttpBinding klasy . Ponadto obsługa programu WCF wymaga użycia narzędzi dostępnych tylko w środowisku systemu Windows w celu wygenerowania serwera proxy.

Generowanie serwera proxy

Aby korzystać z usługi WCF, należy wygenerować serwer proxy , który umożliwia aplikacji łączenie się z usługą. Serwer proxy jest konstruowany przez używanie metadanych usługi, które definiują metody i skojarzoną konfigurację usługi. Te metadane są udostępniane w postaci dokumentu WSDL (Web Services Description Language), który jest generowany przez usługę internetową. Serwer proxy można utworzyć przy użyciu dostawcy odwołań usługi sieci Web programu Microsoft WCF w programie Visual Studio 2017, aby dodać odwołanie do usługi sieci Web do biblioteki .NET Standard.

Alternatywą do utworzenia serwera proxy przy użyciu dostawcy dokumentacji usług sieci Web WCF w programie Visual Studio 2017 jest użycie narzędzia ServiceModel Metadata Tool (svcutil.exe). Aby uzyskać więcej informacji, zobacz ServiceModel Metadata Utility Tool (Svcutil.exe).

Konfigurowanie serwera proxy

Skonfigurowanie wygenerowanego serwera proxy zwykle będzie przyjmować dwa argumenty konfiguracji (w zależności od protokołu SOAP 1.1/ASMX lub WCF) podczas inicjowania: i/lub skojarzone informacje o powiązaniu, jak pokazano w poniższym przykładzie:EndpointAddress

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"));

Powiązanie służy do określania szczegółów transportu, kodowania i protokołu wymaganych dla aplikacji i usług do komunikowania się ze sobą. Określa BasicHttpBinding , że komunikaty PROTOKOŁU SOAP zakodowane tekstowo będą wysyłane za pośrednictwem protokołu transportu HTTP. Określenie adresu punktu końcowego umożliwia aplikacji łączenie się z różnymi wystąpieniami usługi WCF, pod warunkiem, że istnieje wiele opublikowanych wystąpień.

Korzystanie z serwera proxy

Wygenerowane klasy serwera proxy udostępniają metody korzystania z usług internetowych korzystających ze wzorca projektowego modelu programowania asynchronicznego (APM). W tym wzorcu operacja asynchroniczna jest implementowana jako dwie metody o nazwie BeginOperationName i EndOperationName, które rozpoczynają i kończą operację asynchroniczną.

Metoda BeginOperationName rozpoczyna operację asynchroniczną i zwraca obiekt implementujący IAsyncResult interfejs. Po wywołaniu metody BeginOperationName aplikacja może kontynuować wykonywanie instrukcji w wątku wywołującym, podczas gdy operacja asynchroniczna odbywa się w wątku puli wątków.

Dla każdego wywołania beginOperationName aplikacja powinna również wywołać EndOperationName, aby uzyskać wyniki operacji. Zwracana wartość EndOperationName jest tym samym typem zwracanym przez synchroniczną metodę usługi internetowej. Poniższy przykład kodu przedstawia przykład tego:

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

Biblioteka równoległa zadań (TPL) może uprościć proces korzystania z pary metod rozpoczęcia/zakończenia APM, hermetyzując operacje asynchroniczne w tym samym Task obiekcie. Hermetyzacja jest dostarczana przez wiele przeciążeń Task.Factory.FromAsync metody. Ta metoda tworzy metodę Task , która wykonuje TodoServiceClient.EndGetTodoItems metodę po zakończeniu TodoServiceClient.BeginGetTodoItems metody z parametrem null wskazującym, że żadne dane nie są przekazywane do delegata BeginGetTodoItems . Na koniec wartość TaskCreationOptions wyliczenia określa, że należy użyć domyślnego zachowania podczas tworzenia i wykonywania zadań.

Aby uzyskać więcej informacji na temat APM, zobacz Asynchronous Programming Model (Model programowania asynchronicznego) oraz TPL (TPL) i Traditional .NET Framework Asynchronous Programming on MSDN (Programowanie asynchroniczne w witrynie MSDN).

Aby uzyskać więcej informacji na temat korzystania z usługi WCF, zobacz Korzystanie z usługi internetowej Windows Communication Foundation (WCF).

Korzystanie z zabezpieczeń transportu

Usługi WCF mogą wykorzystywać zabezpieczenia na poziomie transportu w celu ochrony przed przechwytywaniem komunikatów. Platforma Xamarin obsługuje powiązania wykorzystujące zabezpieczenia na poziomie transportu przy użyciu protokołu SSL. Mogą jednak wystąpić przypadki, w których stos może wymagać weryfikacji certyfikatu, co powoduje nieoczekiwane zachowanie. Walidację można zastąpić, rejestrując pełnomocnika ServerCertificateValidationCallback przed wywołaniem usługi, jak pokazano w poniższym przykładzie kodu:

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

Zapewnia to szyfrowanie transportu podczas ignorowania weryfikacji certyfikatu po stronie serwera. Jednak takie podejście skutecznie lekceważy obawy dotyczące zaufania związane z certyfikatem i może nie być odpowiednie. Aby uzyskać więcej informacji, zobacz Używanie zaufanych korzeni z szacunkiem na mono-project.com.

Korzystanie z zabezpieczeń poświadczeń klienta

Usługi WCF mogą również wymagać od klientów usługi uwierzytelniania przy użyciu poświadczeń. Platforma Xamarin nie obsługuje protokołu WS-Security Protocol, który umożliwia klientom wysyłanie poświadczeń wewnątrz koperty komunikatu PROTOKOŁU SOAP. Jednak platforma Xamarin obsługuje możliwość wysyłania poświadczeń uwierzytelniania podstawowego HTTP do serwera przez określenie odpowiedniego ClientCredentialTypeelementu :

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

Następnie można określić podstawowe poświadczenia uwierzytelniania:

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

Aby uzyskać więcej informacji na temat uwierzytelniania podstawowego PROTOKOŁU HTTP, chociaż w kontekście usługi internetowej REST, zobacz Uwierzytelnianie usługi internetowej RESTful.