Введение в веб-службыIntroduction to Web Services

В этом руководстве показано, как использовать технологии разных веб-служб. Рассматриваются связи со службами REST, SOAP служб и служб Windows Communication Foundation.This guide demonstrates how to consume different web service technologies. Topics covered include communicating with REST services, SOAP services, and Windows Communication Foundation services.

Для правильной работы многих мобильных приложениях, зависящих от облака, и поэтому интеграция веб-служб в мобильные приложения — распространенный сценарий.To function correctly, many mobile applications are dependent on the cloud, and so integrating web services into mobile applications is a common scenario. Платформы Xamarin поддерживает использование различных веб-службы технологии и включает поддержку встроенных и сторонних поставщиков для работы со службами RESTful, ASMX и Windows Communication Foundation (WCF).The Xamarin platform supports consuming different web service technologies, and includes in-built and third-party support for consuming RESTful, ASMX, and Windows Communication Foundation (WCF) services.

Для клиентов, использующих Xamarin.Forms, есть полные примеры использования каждого из этих технологий в Xamarin.Forms веб-служб документации.For customers using Xamarin.Forms, there are complete examples using each of these technologies in the Xamarin.Forms Web Services documentation.

Важно!

В iOS 9 приложение Transport Security (ATS) обеспечивает безопасных соединений между Интернет-ресурсов (например, server серверной части приложения) и приложения, тем самым предотвращая случайное раскрытие конфиденциальной информации.In iOS 9, App Transport Security (ATS) enforces secure connections between internet resources (such as the app's back-end server) and the app, thereby preventing accidental disclosure of sensitive information. Поскольку ATS включена по умолчанию в приложениях, созданных для iOS 9, все подключения будут применяться требования к безопасности ATS.Since ATS is enabled by default in apps built for iOS 9, all connections will be subject to ATS security requirements. Если соединения не удовлетворяют этим требованиям, они вызовут сбой с исключением.If connections do not meet these requirements, they will fail with an exception.

Вы можете отказаться от ATS Если невозможно использовать HTTPS протокола и безопасный обмен данными для Интернет-ресурсов.You can opt-out of ATS if it is not possible to use the HTTPS protocol and secure communication for internet resources. Это достигается путем обновления приложения Info.plist файла.This can be achieved by updating the app's Info.plist file. Дополнительные сведения см. в разделе безопасность транспорта приложения.For more information see App Transport Security.

RESTREST

Representational State Transfer (REST) представляет собой архитектурный стиль для построения веб-служб.Representational State Transfer (REST) is an architectural style for building web services. REST запросы выполняются по протоколу HTTP, используя те же глаголы HTTP, использующих веб-браузеры для получения веб-страниц и для отправки данных на серверы.REST requests are made over HTTP using the same HTTP verbs that web browsers use to retrieve web pages and to send data to servers. Ниже приведены команды.The verbs are:

  • ПОЛУЧИТЬ — эта операция используется для получения данных из веб-службы.GET – this operation is used to retrieve data from the web service.
  • POST — эта операция используется для создания нового элемента данных на веб-службы.POST – this operation is used to create a new item of data on the web service.
  • ПОМЕСТИТЕ — эта операция используется для обновления элемента данных на веб-службы.PUT – this operation is used to update an item of data on the web service.
  • ИСПРАВЛЕНИЕ — эта операция используется для обновления элемента данных на веб-службы, описывающий набор инструкций о том, как изменить элемент.PATCH – this operation is used to update an item of data on the web service by describing a set of instructions about how the item should be modified. Эта команда не используется в примере приложения.This verb is not used in the sample application.
  • Удалить — эта операция используется для удаления элемента данных на веб-службы.DELETE – this operation is used to delete an item of data on the web service.

Веб-служба, вызываются API-интерфейсов RESTful API-интерфейсы, которые соответствуют REST и определяются с помощью:Web service APIs that adhere to REST are called RESTful APIs, and are defined using:

  • Базовый URI.A base URI.
  • Методы HTTP, такие как GET, POST, PUT, PATCH или DELETE.HTTP methods, such as GET, POST, PUT, PATCH, or DELETE.
  • Тип носителя для данных, таких как JavaScript Object Notation (JSON).A media type for the data, such as JavaScript Object Notation (JSON).

Простота REST сделала его основной метод для доступа к веб-служб в мобильных приложениях.The simplicity of REST has helped make it the primary method for accessing web services in mobile applications.

Использование служб RESTConsuming REST Services

Существует несколько библиотек и классы, которые могут использоваться для использования служб REST, а в следующих подразделах описываются их.There are a number of libraries and classes that can be used to consume REST services, and the following subsections discuss them. Дополнительные сведения об использовании службы REST, см. в разделе использовать RESTful веб-службу.For more information about consuming a REST service, see Consume a RESTful Web Service.

HttpClientHttpClient

Клиентских библиотек HTTP Майкрософт предоставляет HttpClient класс, который используется для отправки и получения запросов по протоколу HTTP.The Microsoft HTTP Client Libraries provides the HttpClient class, which is used to send and receive requests over HTTP. Он предоставляет функциональные возможности для отправки запросов HTTP и получения ответов HTTP с определенным URI-адресом ресурса.It provides functionality for sending HTTP requests and receiving HTTP responses from a URI-identified resource. Каждый запрос отправляется в качестве асинхронной операции.Each request is sent as an asynchronous operation. Дополнительные сведения об асинхронных операциях см. в разделе обзор поддержки асинхронного.For more information about asynchronous operations, see Async Support Overview.

HttpResponseMessage Класс представляет сообщение ответа HTTP, полученные из веб-службы, после HTTP-запроса.The HttpResponseMessage class represents an HTTP response message received from the web service after an HTTP request has been made. Он содержит сведения об ответе, включая код состояния, заголовки и текст.It contains information about the response, including the status code, headers, and body. HttpContent Класс представляет тело HTTP и заголовки содержимого, таких как Content-Type и Content-Encoding.The HttpContent class represents the HTTP body and content headers, such as Content-Type and Content-Encoding. Можно прочитать содержимое с помощью любого из ReadAs методы, такие как ReadAsStringAsync и ReadAsByteArrayAsync, в зависимости от формата данных.The content can be read using any of the ReadAs methods, such as ReadAsStringAsync and ReadAsByteArrayAsync, depending upon the format of the data.

Дополнительные сведения о HttpClient , представлена в разделе создания объекта HTTPClient.For more information about the HttpClient class, see Creating the HTTPClient Object.

HTTPWebRequestHTTPWebRequest

Вызов веб-служб с HTTPWebRequest включает в себя:Calling web services with HTTPWebRequest involves:

  • Создание экземпляра запроса для определенного URI.Creating the request instance for a particular URI.
  • Настройка различных свойств HTTP для экземпляра запроса.Setting various HTTP properties on the request instance.
  • Извлечение HttpWebResponse из запроса.Retrieving an HttpWebResponse from the request.
  • Чтение данных из ответа.Reading data out of the response.

Например следующий код извлекает данные из США. Национальный библиотеки веб-службы:For example, the following code retrieves data from the U.S. National Library of Medicine web service:

var rxcui = "198440";
var request = HttpWebRequest.Create(string.Format(@"http://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);
  }
}

В приведенном выше примере создается HttpWebRequest , возвращает данные в формате JSON.The above example creates an HttpWebRequest that will return data formatted as JSON. Данные возвращаются в HttpWebResponse, из которого StreamReader можно получить для чтения данных.The data is returned in an HttpWebResponse, from which a StreamReader can be obtained to read the data.

RestSharpRestSharp

Использует другой подход для использования служб REST RestSharp библиотеки.Another approach to consuming REST services is using the RestSharp library. RestSharp инкапсулирует HTTP-запросов, включая поддержку для получения результатов, как содержимое необработанную строку или как десериализованные C# объекта.RestSharp encapsulates HTTP requests, including support for retrieving results either as raw string content or as a deserialized C# object. Например следующий код выполняет запрос в США Строка с отформатированной национальных библиотеки веб-службы, а затем извлекает результаты как JSON-ФАЙЛ:For example, the following code makes a request to the U.S. National Library of Medicine web service, and retrieves the results as a JSON formatted string:

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 — Это метод, который займет необработанную строку JSON из RestSharp.RestResponse.Content свойство и преобразовать его в C# объекта.DeserializeRxTerm is a method that will take the raw JSON string from the RestSharp.RestResponse.Content property and convert it into a C# object. Далее в этой статье рассматривается десериализации данные, возвращенные из веб-служб.Deserializing data returned from web services is discussed later in this article.

NSUrlConnectionNSUrlConnection

Помимо классов, доступных в базе Mono библиотека классов (BCL), такие как HttpWebRequestи указанной третьей стороной C# библиотек, таких как RestSharp, классы, зависящие от платформы также доступны для использования веб-служб.In addition to classes available in the Mono base class library (BCL), such as HttpWebRequest, and third party C# libraries, such as RestSharp, platform-specific classes are also available for consuming web services. Например, в iOS NSUrlConnection и NSMutableUrlRequest классы могут использоваться.For example, in iOS, the NSUrlConnection and NSMutableUrlRequest classes can be used.

В следующем примере кода показано, как вызвать США Национальный веб-служба библиотеки с помощью классов iOS:The following code example shows how to call the U.S. National Library of Medicine web service using iOS classes:

var rxcui = "198440";
var request = new NSMutableUrlRequest(new NSUrl(string.Format("http://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();
       }
}

Как правило, классы, зависящие от платформы для использования веб-служб должна выполняться только для сценариев, где машинного кода переносится в C#.Generally, platform-specific classes for consuming web services should be limited to scenarios where native code is being ported to C#. Где это возможно, таким образом, он может быть общей кросс платформенного кода доступа к веб-службы должны быть переносимыми.Where possible, web service access code should be portable so that it can be shared cross-platform.

ServiceStackServiceStack

Другой вариант для вызова веб-служб — стека службы библиотеки.Another option for calling web services is the Service Stack library. Например, приведенный ниже показано использование стека службы IServiceClient.GetAsync метод для выдачи запроса на обслуживание:For example, the following code shows how to use Service Stack’s IServiceClient.GetAsync method to issue a service request:

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

Важно!

Хотя средства, такие как ServiceStack и RestSharp позволяют легко вызывать и использовать REST служб, иногда бывает не так просто использовать XML или JSON, который не соответствует стандарту DataContract соглашения о сериализации.While tools like ServiceStack and RestSharp make it easy to call and consume REST services, it is sometimes non-trivial to consume XML or JSON that does not conform to the standard DataContract serialization conventions. При необходимости вызвать запрос и обрабатывать соответствующий сериализацию явным образом с помощью библиотеки ServiceStack.Text, о котором рассказывается ниже.If necessary, invoke the request and handle the appropriate serialization explicitly using the ServiceStack.Text library discussed below.

Использование данных RESTfulConsuming RESTful Data

Сообщения JSON обычно использовать веб-служб rESTful для возврата данных клиенту.RESTful web services typically use JSON messages to return data to the client. JSON — это основанные на тексте формат обмена данными, создает compact полезных данных, что приводит к ограниченной пропускной способности при отправке данных.JSON is a text-based, data-interchange format that produces compact payloads, which results in reduced bandwidth requirements when sending data. В этом разделе будут проверены механизмы для использования RESTful ответы в JSON и Plain Old XML (POX).In this section, mechanisms for consuming RESTful responses in JSON and Plain-Old-XML (POX) will be examined.

System.JSONSystem.JSON

Платформа Xamarin поставляется с поддержкой JSON без дополнительной настройки.The Xamarin platform ships with support for JSON out of the box. С помощью JsonObject, результаты могут быть получены, как показано в следующем примере кода:By using a JsonObject, results can be retrieved as shown in the following code example:

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

Тем не менее важно Имейте в виду, что System.Json средства загрузки полностью данные в память.However, it’s important to be aware that the System.Json tools load the entirety of the data into memory.

JSON.NETJSON.NET

Библиотеки NewtonSoft JSON.NET — это широко используемый библиотека для сериализации и десериализации сообщений JSON.The NewtonSoft JSON.NET library is a widely used library for serializing and deserializing JSON messages. В следующем примере кода показано, как использовать JSON.NET для десериализации сообщения JSON в C# объекта:The following code example shows how to use JSON.NET to deserialize a JSON message into a C# object:

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.TextServiceStack.Text

ServiceStack.Text — это библиотека сериализации JSON, разработанные для работы с библиотекой ServiceStack.ServiceStack.Text is a JSON serialization library designed to work with the ServiceStack library. В следующем примере кода показано, как выполнить синтаксический анализ JSON с помощью ServiceStack.Text.JsonObject:The following code example shows how to parse JSON using a 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.LinqSystem.Xml.Linq

В случае использования в веб-службе REST на основе XML, LINQ to XML можно использовать для анализа кода XML и заполнения C# объекта линейно, как показано в следующем примере кода:In the event of consuming an XML-based REST web service, LINQ to XML can be used to parse the XML and populate a C# object inline, as demonstrated in the following code example:

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 (ASMX)ASP.NET Web Service (ASMX)

ASMX предоставляет возможность создавать веб-служб, которые отправляют сообщения, используя Simple Object Access Protocol (SOAP).ASMX provides the ability to build web services that send messages using the Simple Object Access Protocol (SOAP). SOAP — это протокол независимо от платформы и независимый от языка, для создания и вызова веб-служб.SOAP is a platform-independent and language-independent protocol for building and accessing web services. Потребителям службы ASMX не нужно ничего знать об используемой платформе, объектной модели или язык программирования, используемый для реализации службы.Consumers of an ASMX service do not need to know anything about the platform, object model, or programming language used to implement the service. Они должны понять, как отправлять и получать сообщения SOAP.They only need to understand how to send and receive SOAP messages.

Сообщение SOAP — это документ XML, содержащий следующие элементы:A SOAP message is an XML document containing the following elements:

  • Корневой элемент с именем конверт , идентифицирующий XML-документа, как сообщение SOAP.A root element named Envelope that identifies the XML document as a SOAP message.
  • Необязательный заголовок элемент, содержащий сведения о приложении, такие как данные проверки подлинности.An optional Header element that contains application-specific information such as authentication data. Если заголовок присутствует элемент он должен быть первый дочерний элемент элемента конверт элемент.If the Header element is present it must be the first child element of the Envelope element.
  • Обязательный текст элемент, содержащий сообщение SOAP, предназначенное для получателя.A required Body element that contains the SOAP message intended for the recipient.
  • Необязательный сбоя элемент, который используется для указания сообщения об ошибках.An optional Fault element that's used to indicate error messages. Если сбоя элемент присутствует, он должен быть дочерним элементом элемента текст элемент.If the Fault element is present, it must be a child element of the Body element.

SOAP может работать много транспортных протоколов, включая HTTP, SMTP, TCP и UDP.SOAP can operate over many transport protocols, including HTTP, SMTP, TCP, and UDP. Тем не менее службы ASMX могут работать только по протоколу HTTP.However, an ASMX service can only operate over HTTP. Платформа Xamarin поддерживает стандартные реализации SOAP 1.1 по протоколу HTTP, и он также поддерживает многие из стандартных конфигураций службы ASMX.The Xamarin platform supports standard SOAP 1.1 implementations over HTTP, and this includes support for many of the standard ASMX service configurations.

Создание учетной записи-посредникаGenerating a Proxy

Объект прокси должен быть создан использовать службу ASMX, что позволяет приложению для подключения к службе.A proxy must be generated to consume an ASMX service, which allows the application to connect to the service. Прокси создается с помощью много метаданных службы, определяющий методы и связанные службы конфигурации.The proxy is constructed by consuming service metadata that defines the methods and associated service configuration. Эти метаданные предоставляются как документ языка описания служб (WSDL), который создается веб-службой.This metadata is exposed as a Web Services Description Language (WSDL) document that is generated by the web service. Прокси создается с помощью Visual Studio для Mac или Visual Studio для добавления в проекты под конкретные платформы веб-ссылки для веб-службы.The proxy is built by using Visual Studio for Mac or Visual Studio to add a web reference for the web service to the platform-specific projects.

URL веб-службы может быть размещенной удаленного источника или ресурса локальной файловой системы, доступных с помощью file:/// префикс пути, например:The web service URL can either be a hosted remote source or local file system resource accessible via the file:/// path prefix, for example:

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

Это приводит к возникновению ошибки прокси-сервера в папке ссылок на службы или веб-проекта.This generates the proxy in the Web or Service References folder of the project. Так как прокси-сервер создается код, не должен быть изменен.Since a proxy is generated code, it should not be modified.

Добавление учетной записи-посредника в проект вручнуюManually Adding a Proxy to a Project

При наличии существующего прокси-сервера, созданный с использованием совместимых инструментов, эти выходные данные могут потребляться включены как часть проекта.If you have an existing proxy that has been generated using compatible tools, this output can be consumed when included as part of your project. В Visual Studio для Mac использовать добавить файлы...In Visual Studio for Mac, use the Add files… пункт меню, чтобы добавить прокси-сервер.menu option to add the proxy. Кроме того, для этого требуется System.Web.Services.dll ссылаться явным образом с помощью Добавление ссылок...In addition, this requires System.Web.Services.dll to be referenced explicitly using the Add References… диалоговое окно.dialog.

Использование прокси-сервераConsuming the Proxy

Созданный прокси-классы предоставляют методы для использования веб-службы, использующих шаблон проектирования модели асинхронного программирования (APM).The generated proxy classes provide methods for consuming the web service that use the Asynchronous Programming Model (APM) design pattern. В этом шаблоне асинхронную операцию реализуется в виде двух методов с именем BeginOperationName и EndOperationName, который начинают и завершают асинхронную операцию.In this pattern an asynchronous operation is implemented as two methods named BeginOperationName and EndOperationName, which begin and end the asynchronous operation.

BeginOperationName метод начинает асинхронную операцию и возвращает объект, реализующий IAsyncResult интерфейс.The BeginOperationName method begins the asynchronous operation and returns an object that implements the IAsyncResult interface. После вызова метода BeginOperationName, приложение может продолжить выполнение инструкций в вызывающем потоке, пока асинхронная операция выполняется в потоке пула потоков.After calling BeginOperationName, an application can continue executing instructions on the calling thread, while the asynchronous operation takes place on a thread pool thread.

Для каждого вызова BeginOperationName, приложение также должно вызвать EndOperationName для получения результатов операции.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation. Возвращаемое значение EndOperationName имеет тот же тип, возвращаемый методом синхронной веб-службы.The return value of EndOperationName is the same type returned by the synchronous web service method. В следующем примере кода показан пример этого:The following code example shows an example of this:

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

Библиотека параллельных задач (TPL) можно упростить процесс потребляет пару методов begin и end APM инкапсуляция асинхронных операций в том же Task объекта.The Task Parallel Library (TPL) can simplify the process of consuming an APM begin/end method pair by encapsulating the asynchronous operations in the same Task object. Такая инкапсуляция предоставляется несколько перегрузок Task.Factory.FromAsync метод.This encapsulation is provided by multiple overloads of the Task.Factory.FromAsync method. Этот метод создает Task , выполняющего TodoService.EndGetTodoItems метод один раз TodoService.BeginGetTodoItems завершения метода с null параметр, указывающий, что данные не передается в BeginGetTodoItems делегировать.This method creates a Task that executes the TodoService.EndGetTodoItems method once the TodoService.BeginGetTodoItems method completes, with the null parameter indicating that no data is being passed into the BeginGetTodoItems delegate. Наконец, значение TaskCreationOptions перечисление указывает, что следует использовать поведение по умолчанию для создания и выполнения задач.Finally, the value of the TaskCreationOptions enumeration specifies that the default behavior for the creation and execution of tasks should be used.

Дополнительные сведения о APM, см. в разделе модели асинхронного программирования и TPL и традиционное .NET Framework асинхронное программирование на сайте MSDN.For more information about APM, see Asynchronous Programming Model and TPL and Traditional .NET Framework Asynchronous Programming on MSDN.

Дополнительные сведения об использовании службы ASMX, см. в разделе использовать службы ASP.NET Web (ASMX).For more information about consuming an ASMX service, see Consume an ASP.NET Web Service (ASMX).

Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)

WCF — это унифицированная платформа корпорации Microsoft для построения сервисноориентированных приложений.WCF is Microsoft's unified framework for building service-oriented applications. Он позволяет разработчикам создавать безопасные, надежные, с поддержкой транзакций с возможностью взаимодействия распределенных приложений.It enables developers to build secure, reliable, transacted, and interoperable distributed applications.

WCF описывает службу, с различными разные контракты, в том числе следующие:WCF describes a service with a variety of different contracts which include the following:

  • Контракты данных — определение структуры данных, которые формируют основу для содержимого сообщения.Data contracts – define the data structures that form the basis for the content within a message.
  • Контракты сообщений — создания сообщений из контракты данных.Message contracts – compose messages from existing data contracts.
  • Контракты сбоя — разрешить пользовательских ошибок SOAP указать.Fault contracts – allow custom SOAP faults to be specified.
  • Контракты службы — определить операции, которые поддерживают службы и сообщения, необходимые для взаимодействия с каждой операцией.Service contracts – specify the operations that services support and the messages required for interacting with each operation. Они также определяют любое поведение пользовательской ошибки, которое может быть связан с операциями с каждой службы.They also specify any custom fault behavior that can be associated with operations on each service.

Существуют различия между ASP.NET Web Services (ASMX) и WCF, но важно понимать, что WCF поддерживает те же возможности, которые предоставляет ASMX-сообщений SOAP по протоколу HTTP.There are differences between ASP.NET Web Services (ASMX) and WCF, but it is important to understand that WCF supports the same capabilities that ASMX provides – SOAP messages over HTTP.

Важно!

Поддержка платформы Xamarin WCF ограничена кодировкой текста сообщений SOAP по сравнению с использованием HTTP/HTTPS BasicHttpBinding класса.The Xamarin platform support for WCF is limited to text-encoded SOAP messages over HTTP/HTTPS using the BasicHttpBinding class. Кроме того поддержка WCF требует применения средств доступно только в среде Windows для создания прокси-сервера.In addition, WCF support requires the use of tools only available in a Windows environment to generate the proxy.

Создание учетной записи-посредникаGenerating a Proxy

Объект прокси должен быть создан для использования службы WCF, что позволяет приложению для подключения к службе.A proxy must be generated to consume a WCF service, which allows the application to connect to the service. Прокси создается с помощью много метаданных службы, определяющий методы и связанные службы конфигурации.The proxy is constructed by consuming service metadata that define the methods and associated service configuration. Эти метаданные предоставляются в виде документа языка описания служб (WSDL), который создается веб-службой.This metadata is exposed in the form of a Web Services Description Language (WSDL) document that is generated by the web service. Прокси-сервер может быть построен с помощью Microsoft WCF Web Service Reference Provider в Visual Studio 2017 для добавления ссылки на службу веб-службы в библиотеку .NET Standard.The proxy can be built by using the Microsoft WCF Web Service Reference Provider in Visual Studio 2017 to add a service reference for the web service to a .NET Standard Library.

Вместо создания прокси с помощью Microsoft WCF Web Service Reference Provider в Visual Studio 2017 является использование ServiceModel Metadata Utility Tool (svcutil.exe).An alternative to creating the proxy using the Microsoft WCF Web Service Reference Provider in Visual Studio 2017 is to use the ServiceModel Metadata Utility Tool (svcutil.exe). Дополнительные сведения см. в разделе ServiceModel Metadata Utility Tool (Svcutil.exe).For more information, see ServiceModel Metadata Utility Tool (Svcutil.exe).

Настройка прокси-сервераConfiguring the Proxy

Настройка созданного прокси обычно займет два аргумента конфигурации (в зависимости от SOAP 1.1/ASMX или WCF) во время инициализации: EndpointAddress и/или связанные сведения о привязке, как показано в следующем примере:Configuring the generated proxy will generally take two configuration arguments (depending on SOAP 1.1/ASMX or WCF) during initialization: the EndpointAddress and/or the associated binding information, as shown in the example below:

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

Привязка используется для указания транспорта, кодировки и протокола, требуемых для приложений и служб для взаимодействия друг с другом.A binding is used to specify the transport, encoding, and protocol details required for applications and services to communicate with each other. BasicHttpBinding Указывает, что по транспортному протоколу HTTP будет отправляться кодировке текста сообщений SOAP.The BasicHttpBinding specifies that text-encoded SOAP messages will be sent over the HTTP transport protocol. Задание адреса конечной точки позволяет приложению подключаться к различным экземплярам службы WCF, при условии, что несколько экземпляров, опубликованных.Specifying an endpoint address enables the application to connect to different instances of the WCF service, provided that there are multiple published instances.

Использование прокси-сервераConsuming the Proxy

Созданный прокси-классы предоставляют методы для использования веб-служб, использующих шаблон проектирования модели асинхронного программирования (APM).The generated proxy classes provide methods for consuming the web services that use the Asynchronous Programming Model (APM) design pattern. В этом случае асинхронная операция реализуется как два метода с именем BeginOperationName и EndOperationName, который начинают и завершают асинхронную операцию.In this pattern, an asynchronous operation is implemented as two methods named BeginOperationName and EndOperationName, which begin and end the asynchronous operation.

BeginOperationName метод начинает асинхронную операцию и возвращает объект, реализующий IAsyncResult интерфейс.The BeginOperationName method begins the asynchronous operation and returns an object that implements the IAsyncResult interface. После вызова метода BeginOperationName, приложение может продолжить выполнение инструкций в вызывающем потоке, пока асинхронная операция выполняется в потоке пула потоков.After calling BeginOperationName, an application can continue executing instructions on the calling thread, while the asynchronous operation takes place on a thread pool thread.

Для каждого вызова BeginOperationName, приложение также должно вызвать EndOperationName для получения результатов операции.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation. Возвращаемое значение EndOperationName имеет тот же тип, возвращаемый методом синхронной веб-службы.The return value of EndOperationName is the same type returned by the synchronous web service method. В следующем примере кода показан пример этого:The following code example shows an example of this:

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

Библиотека параллельных задач (TPL) можно упростить процесс потребляет пару методов begin и end APM инкапсуляция асинхронных операций в том же Task объекта.The Task Parallel Library (TPL) can simplify the process of consuming an APM begin/end method pair by encapsulating the asynchronous operations in the same Task object. Такая инкапсуляция предоставляется несколько перегрузок Task.Factory.FromAsync метод.This encapsulation is provided by multiple overloads of the Task.Factory.FromAsync method. Этот метод создает Task , выполняющего TodoServiceClient.EndGetTodoItems метод один раз TodoServiceClient.BeginGetTodoItems завершения метода с null параметр, указывающий, что данные не передается в BeginGetTodoItems делегировать.This method creates a Task that executes the TodoServiceClient.EndGetTodoItems method once the TodoServiceClient.BeginGetTodoItems method completes, with the null parameter indicating that no data is being passed into the BeginGetTodoItems delegate. Наконец, значение TaskCreationOptions перечисление указывает, что следует использовать поведение по умолчанию для создания и выполнения задач.Finally, the value of the TaskCreationOptions enumeration specifies that the default behavior for the creation and execution of tasks should be used.

Дополнительные сведения о APM, см. в разделе модели асинхронного программирования и TPL и традиционное .NET Framework асинхронное программирование на сайте MSDN.For more information about APM, see Asynchronous Programming Model and TPL and Traditional .NET Framework Asynchronous Programming on MSDN.

Дополнительные сведения об использовании службы WCF см. в разделе использовать веб-службы Windows Communication Foundation (WCF).For more information about consuming a WCF service, see Consume a Windows Communication Foundation (WCF) Web Service.

Использование безопасности транспортаUsing Transport Security

Службы WCF могут использовать безопасность на транспортном уровне для защиты от перехвата сообщений.WCF Services may employ transport level security to protect against interception of messages. Платформа Xamarin поддерживает привязки, в которых используется безопасность на транспортном уровне с помощью протокола SSL.The Xamarin platform supports bindings that employ transport level security using SSL. Однако возможны ситуации, в которых стека может потребоваться проверить сертификат, который приводит к непредвиденного поведения.However, there may be cases in which the stack may need to validate the certificate, which results in unanticipated behavior. Проверку можно переопределить, зарегистрировав ServerCertificateValidationCallback делегат перед вызовом службы, как показано в следующем примере кода:The validation can be overridden by registering a ServerCertificateValidationCallback delegate before invoking the service, as demonstrated in the following code example:

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

Это позволяет поддерживать шифрование транспорта, игнорируя проверку сертификата на сервере.This maintains transport encryption while ignoring the server-side certificate validation. Тем не менее этот подход фактически не учитывает вопросы доверия, связанный с сертификатом и может не подойти.However, this approach effectively disregards the trust concerns associated with the certificate and may not be appropriate. Дополнительные сведения см. в разделе с помощью доверенных корневых ЦС уважительно на mono-project.com.For more information, see Using Trusted Roots Respectfully on mono-project.com.

С помощью учетных данных Client SecurityUsing Client Credential Security

Службы WCF может также потребоваться клиентов службы для проверки подлинности с использованием учетных данных.WCF services may also require the service clients to authenticate using credentials. Платформа Xamarin не поддерживает протокол WS-Security, который позволяет клиентам отправлять учетные данные в конверте SOAP сообщения.The Xamarin platform does not support the WS-Security Protocol, which allows clients to send credentials inside the SOAP message envelope. Тем не менее, платформа Xamarin поддерживает возможность передавать учетные данные обычной проверки подлинности HTTP на сервер, указав соответствующие ClientCredentialType:However, the Xamarin platform does support the ability to send HTTP Basic Authentication credentials to the server by specifying the appropriate ClientCredentialType:

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

Затем можно указать учетные данные обычной проверки подлинности:Then, basic authentication credentials can be specified:

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

В приведенном выше примере, если сообщение об ошибке «Не хватило trampolines типа 0» можно увеличить число trampolines типа 0, добавив –aot “trampolines={number of trampolines}” аргумент для сборки.In the example above, if you get the message “Ran out of trampolines of type 0” you can increase the number of type 0 trampolines by adding the –aot “trampolines={number of trampolines}” argument to the build. Дополнительные сведения см. в руководстве по устранению неполадок.For more information, see Troubleshooting.

Дополнительные сведения о базовой аутентификации HTTP, несмотря на то что в контексте веб-службы REST, см. в разделе проверки подлинности веб-службы RESTful.For more information about HTTP basic authentication, although in the context of a REST web service, see Authenticating a RESTful Web Service.