웹 서비스 소개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.ios를 사용 하는 고객의 경우 Xamarin.ios 웹 서비스 설명서에서 이러한 각 기술을 사용 하는 전체 예제가 있습니다.For customers using Xamarin.Forms, there are complete examples using each of these technologies in the Xamarin.Forms Web Services documentation.

중요

IOS 9에서 앱 전송 보안 (ATS)은 인터넷 리소스 (예: 앱의 백 엔드 서버)와 앱 간에 보안 연결을 적용 하 여 중요 한 정보가 실수로 공개 되는 것을 방지 합니다.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.

HTTPS 프로토콜을 사용 하 고 인터넷 리소스에 대 한 보안 통신을 할 수 없는 경우 ATS를 옵트아웃 (opt out) 할 수 있습니다.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

REST (Representational State Transfer)는 웹 서비스를 빌드하기 위한 아키텍처 스타일입니다.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 –이 작업은 웹 서비스에서 데이터를 검색 하는 데 사용 됩니다.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 –이 작업은 웹 서비스의 데이터 항목을 업데이트 하는 데 사용 됩니다.PUT – this operation is used to update an item of data on the web service.
  • PATCH –이 작업은 항목을 수정 하는 방법에 대 한 지침 집합을 설명 하 여 웹 서비스에서 데이터 항목을 업데이트 하는 데 사용 됩니다.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.

REST를 준수 하는 웹 서비스 Api는 RESTful Api 라고 하며 다음을 사용 하 여 정의 됩니다.Web service APIs that adhere to REST are called RESTful APIs, and are defined using:

  • 기본 URI입니다.A base URI.
  • GET, POST, PUT, PATCH 또는 DELETE와 같은 HTTP 메서드입니다.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.

REST 서비스 사용Consuming 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

MICROSOFT Http 클라이언트 라이브러리 는 http를 통해 요청을 보내고 받는 데 사용 되는 HttpClient 클래스를 제공 합니다.The Microsoft HTTP Client Libraries provides the HttpClient class, which is used to send and receive requests over HTTP. URI로 식별 된 리소스에서 http 요청을 보내고 HTTP 응답을 받기 위한 기능을 제공 합니다.It provides functionality for sending HTTP requests and receiving HTTP responses from a URI-identified resource. 각 요청은 비동기 작업으로 전송 됩니다.Each request is sent as an asynchronous operation. 비동기 작업에 대 한 자세한 내용은 Async 지원 개요를 참조 하세요.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-TypeContent-Encoding입니다.The HttpContent class represents the HTTP body and content headers, such as Content-Type and Content-Encoding. 데이터의 형식에 따라 ReadAsStringAsyncReadAsByteArrayAsync와 같은 ReadAs 방법 중 하나를 사용 하 여 콘텐츠를 읽을 수 있습니다.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(@"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);
  }
}

위의 예에서는 JSON으로 형식이 지정 된 데이터를 반환 하는 HttpWebRequest을 만듭니다.The above example creates an HttpWebRequest that will return data formatted as JSON. 데이터는 데이터를 읽기 위해 StreamReader 가져올 수 있는 HttpWebResponse으로 반환 됩니다.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는 원시 문자열 콘텐츠 또는 deserialize C# 된 개체로 결과를 검색 하는 지원을 포함 하 여 HTTP 요청을 캡슐화 합니다.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);

DeserializeRxTermRestSharp.RestResponse.Content 속성에서 원시 JSON 문자열을 사용 하 여 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. 웹 서비스에서 반환 된 데이터를 deserialize 하는 방법은이 문서의 뒷부분에 설명 되어 있습니다.Deserializing data returned from web services is discussed later in this article.

NSUrlConnectionNSUrlConnection

HttpWebRequest와 같이 Mono BCL (기본 클래스 라이브러리)에서 사용할 수 있는 클래스 외에도 RestSharp 등의 타사 C# 라이브러리를 사용 하 여 웹 서비스를 사용할 수도 있습니다.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에서는 NSUrlConnectionNSMutableUrlRequest 클래스를 사용할 수 있습니다.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("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();
       }
}

일반적으로 웹 서비스를 사용 하는 플랫폼별 클래스는 네이티브 코드가로 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 서비스를 쉽게 호출 하 고 사용할 수 있지만 표준 DataContract serialization 규칙을 따르지 않는 XML 또는 JSON을 사용 하는 것은 어려울 수 있습니다.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. 텍스트 라이브러리를 사용 하 여 적절 한 serialization을 명시적으로 처리 합니다.If necessary, invoke the request and handle the appropriate serialization explicitly using the ServiceStack.Text library discussed below.

RESTful 데이터 소비Consuming RESTful Data

RESTful 웹 서비스는 일반적으로 JSON 메시지를 사용 하 여 클라이언트에 데이터를 반환 합니다.RESTful web services typically use JSON messages to return data to the client. JSON은 압축 페이로드를 생성 하는 텍스트 기반 데이터 교환 형식으로, 데이터를 보낼 때 대역폭 요구 사항이 감소 합니다.JSON is a text-based, data-interchange format that produces compact payloads, which results in reduced bandwidth requirements when sending data. 이 섹션에서는 JSON 및 POX (RESTful)에서의 응답을 사용 하는 메커니즘을 검사 합니다.In this section, mechanisms for consuming RESTful responses in JSON and Plain-Old-XML (POX) will be examined.

시스템 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 JSON.NET 라이브러리 는 JSON 메시지를 serialize 및 deserialize 하는 데 널리 사용 되는 라이브러리입니다.The NewtonSoft JSON.NET library is a widely used library for serializing and deserializing JSON messages. 다음 코드 예제에서는 JSON.NET를 사용 하 여 JSON 메시지를 C# 개체로 deserialize 하는 방법을 보여 줍니다.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. 텍스트ServiceStack.Text

ServiceStack. Text는 ServiceStack 라이브러리와 함께 작동 하도록 설계 된 JSON serialization 라이브러리입니다.ServiceStack.Text is a JSON serialization library designed to work with the ServiceStack library. 다음 코드 예제에서는 ServiceStack.Text.JsonObject를 사용 하 여 JSON을 구문 분석 하는 방법을 보여 줍니다.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

XML 기반 REST 웹 서비스를 사용 하는 경우 다음 코드 예제에 나와 있는 것 처럼 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,
       });

ASMX (ASP.NET Web Service)ASP.NET Web Service (ASMX)

ASMX는 SOAP (Simple Object Access Protocol)를 사용 하 여 메시지를 보내는 웹 서비스를 빌드하는 기능을 제공 합니다.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 메시지로 식별 하는 Envelope 이라는 루트 요소입니다.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. Header 요소가 있으면 Envelope 요소의 첫 번째 자식 요소 여야 합니다.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. Fault 요소가 있으면 Body 요소의 자식 요소 여야 합니다.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 플랫폼은 HTTP를 통한 표준 SOAP 1.1 구현을 지원 하며, 여기에는 많은 표준 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. 프록시는 웹 서비스에 대 한 웹 참조를 플랫폼별 프로젝트에 추가 하기 위해 Mac용 Visual Studio 또는 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. Mac용 Visual Studio에서 파일 추가 ...를 사용 하 여In Visual Studio for Mac, use the Add files… 프록시를 추가 하는 메뉴 옵션입니다.menu option to add the proxy. 또한이를 위해 참조 추가 ... 를 사용 하 여 명시적으로 참조 해야 합니다.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. 이 패턴에서 비동기 작업은 비동기 작업을 시작 하 고 종료 하는 BeginoperationnameEndOperationName라는 두 개의 메서드로 구현 됩니다.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 (작업 병렬 라이브러리)은 동일한 Task 개체에 비동기 작업을 캡슐화 하 여 APM begin/end 메서드 쌍을 사용 하는 프로세스를 간소화할 수 있습니다.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. 이 메서드는 TodoService.BeginGetTodoItems 메서드가 완료 된 후 BeginGetTodoItems 대리자에 전달 되는 데이터가 없음을 나타내는 null 매개 변수를 사용 하 여 TodoService.EndGetTodoItems 메서드를 실행 하는 Task을 만듭니다.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에 대 한 자세한 내용은 MSDN의 비동기 프로그래밍 모델TPL 및 기존 .NET Framework 비동기 프로그래밍 을 참조 하세요.For more information about APM, see Asynchronous Programming Model and TPL and Traditional .NET Framework Asynchronous Programming on MSDN.

ASMX 서비스를 사용 하는 방법에 대 한 자세한 내용은 asmx (ASP.NET Web service) 사용을 참조 하세요.For more information about consuming an ASMX service, see Consume an ASP.NET Web Service (ASMX).

WCF(Windows Communication Foundation)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 웹 서비스 (ASMX)와 WCF 간에는 차이점이 있지만, WCF는 ASMX에서 제공 하는 것과 동일한 기능 (HTTP를 통한 SOAP 메시지)을 지원 한다는 것을 이해 하는 것이 중요 합니다.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.

중요

WCF에 대 한 Xamarin 플랫폼 지원은 BasicHttpBinding 클래스를 사용 하 여 HTTP/HTTPS를 통해 텍스트로 인코딩된 SOAP 메시지로 제한 됩니다.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. Visual Studio 2017의 Microsoft WCF Web Service Reference Provider를 사용 하 여 프록시를 빌드하여 웹 서비스에 대 한 서비스 참조를 .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.

Visual Studio 2017에서 Microsoft WCF Web Service Reference Provider를 사용 하 여 프록시를 만드는 대안은 ServiceModel Metadata 유틸리티 도구 (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 유틸리티 도구 (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. 이 패턴에서 비동기 작업은 비동기 작업을 시작 하 고 종료 하는 BeginoperationnameEndOperationName라는 두 개의 메서드로 구현 됩니다.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 (작업 병렬 라이브러리)은 동일한 Task 개체에 비동기 작업을 캡슐화 하 여 APM begin/end 메서드 쌍을 사용 하는 프로세스를 간소화할 수 있습니다.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. 이 메서드는 TodoServiceClient.BeginGetTodoItems 메서드가 완료 된 후 BeginGetTodoItems 대리자에 전달 되는 데이터가 없음을 나타내는 null 매개 변수를 사용 하 여 TodoServiceClient.EndGetTodoItems 메서드를 실행 하는 Task을 만듭니다.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에 대 한 자세한 내용은 MSDN의 비동기 프로그래밍 모델TPL 및 기존 .NET Framework 비동기 프로그래밍 을 참조 하세요.For more information about APM, see Asynchronous Programming Model and TPL and Traditional .NET Framework Asynchronous Programming on MSDN.

WCF 서비스를 사용 하는 방법에 대 한 자세한 내용은 wcf (Windows Communication Foundation) 웹 서비스 사용을 참조 하세요.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에서 신뢰할 수 있는 루트 Respectfully 사용 을 참조 하세요.For more information, see Using Trusted Roots Respectfully on mono-project.com.

클라이언트 자격 증명 보안 사용Using Client Credential Security

WCF 서비스를 사용 하려면 서비스 클라이언트가 자격 증명을 사용 하 여 인증 해야 할 수도 있습니다.WCF services may also require the service clients to authenticate using credentials. Xamarin 플랫폼은 클라이언트가 SOAP 메시지 봉투 내에서 자격 증명을 보낼 수 있는 WS-SECURITY 프로토콜을 지원 하지 않습니다.The Xamarin platform does not support the WS-Security Protocol, which allows clients to send credentials inside the SOAP message envelope. 그러나 Xamarin 플랫폼은 적절 한 ClientCredentialType지정 하 여 HTTP 기본 인증 자격 증명을 서버에 전송 하는 기능을 지원 합니다.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 형식으로 실행 되었습니다." 라는 메시지가 나타나면 빌드에 –aot “trampolines={number of trampolines}” 인수를 추가 하 여 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.

REST 웹 서비스의 컨텍스트에서 HTTP 기본 인증에 대 한 자세한 내용은 RESTful 웹 서비스 인증을 참조 하세요.For more information about HTTP basic authentication, although in the context of a REST web service, see Authenticating a RESTful Web Service.