Share via


웹 서비스 소개

이 가이드에서는 다양한 웹 서비스 기술을 사용하는 방법을 보여 줍니다. 다루는 항목에는 REST 서비스, SOAP 서비스 및 Windows Communication Foundation 서비스와의 통신이 포함됩니다.

제대로 작동하려면 많은 모바일 애플리케이션이 클라우드에 종속되므로 웹 서비스를 모바일 애플리케이션에 통합하는 것이 일반적인 시나리오입니다. Xamarin 플랫폼은 다양한 웹 서비스 기술 소비를 지원하며 RESTful, ASMX 및 WCF(Windows Communication Foundation) 서비스 사용에 대한 기본 제공 및 타사 지원을 포함합니다.

Xamarin.Forms를 사용하는 고객의 경우 Xamarin.Forms 웹 서비스 설명서에 이러한 각 기술을 사용하는 전체 예제가 있습니다 .

Important

iOS 9에서 ATS(App Transport Security)는 인터넷 리소스(예: 앱의 백 엔드 서버)와 앱 간에 보안 연결을 적용하여 중요한 정보의 우발적인 공개를 방지합니다. ATS는 iOS 9용으로 빌드된 앱에서 기본적으로 사용하도록 설정되므로 모든 연결에는 ATS 보안 요구 사항이 적용됩니다. 연결이 이러한 요구 사항을 충족하지 않으면 예외로 실패합니다.

인터넷 리소스에 대한 프로토콜 및 보안 통신을 사용할 HTTPS 수 없는 경우 ATS를 옵트아웃할 수 있습니다. 이 작업은 앱의 Info.plist 파일을 업데이트하여 수행할 수 있습니다. 자세한 내용은 App Transport Security를 참조 하세요.

REST

REST(Representational State Transfer)는 웹 서비스를 빌드하기 위한 아키텍처 스타일입니다. REST 요청은 웹 브라우저에서 웹 페이지를 검색하고 서버에 데이터를 보내는 데 사용하는 것과 동일한 HTTP 동사를 사용하여 HTTP를 통해 수행됩니다. 동사는 다음과 같습니다.

  • GET – 이 작업은 웹 서비스에서 데이터를 검색하는 데 사용합니다.
  • POST – 이 작업은 웹 서비스에서 데이터의 새 항목을 만드는 데 사용합니다.
  • PUT – 이 작업은 웹 서비스에서 데이터 항목을 업데이트하는 데 사용합니다.
  • PATCH –이 작업은 항목을 수정하는 방법에 대한 지침을 설명하는 방식으로 웹 서비스에서 데이터 항목을 업데이트하는 데 사용합니다. 이 동사는 샘플 애플리케이션에서 사용되지 않습니다.
  • DELETE – 이 작업은 웹 서비스에서 데이터 항목을 삭제하는 데 사용합니다.

REST를 준수하는 웹 서비스 API는 RESTful API라고 하며 다음을 사용하여 정의됩니다.

  • 기본 URI.
  • GET, POST, PUT, PATCH 또는 DELETE와 같은 HTTP 메서드
  • JSON(JavaScript Object Notation)과 같은 데이터에 대한 미디어 형식입니다.

REST의 단순성은 모바일 애플리케이션에서 웹 서비스에 액세스하기 위한 기본 방법을 만드는 데 도움이 되었습니다.

REST 서비스 사용

REST 서비스를 사용하는 데 사용할 수 있는 여러 라이브러리 및 클래스가 있으며, 다음 하위 섹션에서 설명합니다. REST 서비스 사용에 대한 자세한 내용은 RESTful 웹 서비스 사용 방법을 참조하세요.

HttpClient

Microsoft HTTP 클라이언트 라이브러리HTTP를 HttpClient 통해 요청을 보내고 받는 데 사용되는 클래스를 제공합니다. HTTP 요청을 보내고 URI 식별 리소스에서 HTTP 응답을 수신하는 기능을 제공합니다. 각 요청은 비동기 작업으로 전송됩니다. 비동기 작업에 대한 자세한 내용은 비동기 지원 개요를 참조 하세요.

이 클래스는 HttpResponseMessage HTTP 요청이 이루어진 후 웹 서비스에서 받은 HTTP 응답 메시지를 나타냅니다. 상태 코드, 헤더 및 본문을 포함하여 응답에 대한 정보를 포함합니다. 합니다 HttpContent 클래스를 나타내는 HTTP 본문 및 콘텐츠 헤더와 같은 Content-TypeContent-Encoding입니다. 콘텐츠는 데이터 형식에 ReadAs 따라 메서드(예: ReadAsStringAsyncReadAsByteArrayAsync)를 사용하여 읽을 수 있습니다.

클래스에 대한 HttpClient 자세한 내용은 HTTPClient 개체 만들기를 참조 하세요.

HTTPWebRequest

웹 서비스를 호출하는 HTTPWebRequest 작업은 다음과 같습니다.

  • 특정 URI에 대한 요청 인스턴스 만들기
  • 요청 인스턴스에서 다양한 HTTP 속성을 설정합니다.
  • HttpWebResponse 요청에서 검색합니다.
  • 응답에서 데이터를 읽습니다.

예를 들어 다음 코드는 미국 국립 의학 라이브러리 웹 서비스에서 데이터를 검색합니다.

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 . 데이터는 데이터를 읽기 위해 가져올 수 있는 StreamReader 데이터로 반환HttpWebResponse됩니다.

RestSharp

REST 서비스를 사용하는 또 다른 방법은 RestSharp 라이브러리를 사용하는 것입니다. RestSharp는 결과를 원시 문자열 콘텐츠 또는 역직렬화된 C# 개체로 검색하는 지원을 포함하여 HTTP 요청을 캡슐화합니다. 예를 들어 다음 코드는 미국 국립 의학 라이브러리 웹 서비스에 요청을 하고 결과를 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 는 속성에서 원시 JSON 문자열을 RestSharp.RestResponse.Content 가져와서 C# 개체로 변환하는 메서드입니다. 웹 서비스에서 반환된 데이터 역직렬화는 이 문서의 뒷부분에서 설명합니다.

NSUrl커넥트ion

BCL(Mono 기본 클래스 라이브러리) 및 RestSharp와 같은 HttpWebRequest타사 C# 라이브러리에서 사용할 수 있는 클래스 외에도 웹 서비스를 사용하는 데 플랫폼별 클래스를 사용할 수 있습니다. 예를 들어 iOS에서는 클래스와 NSMutableUrlRequest 클래스를 NSUrlConnection 사용할 수 있습니다.

다음 코드 예제에서는 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();
       }
}

일반적으로 웹 서비스를 사용하는 플랫폼별 클래스는 네이티브 코드가 C#으로 포팅되는 시나리오로 제한되어야 합니다. 가능한 경우 플랫폼 간 공유가 가능할 수 있도록 웹 서비스 액세스 코드를 이식할 수 있어야 합니다.

ServiceStack

웹 서비스를 호출하는 또 다른 옵션은 서비스 스택 라이브러리입니다. 예를 들어 다음 코드는 서비스 스택의 IServiceClient.GetAsync 메서드를 사용하여 서비스 요청을 발급하는 방법을 보여줍니다.

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

Important

ServiceStack 및 RestSharp와 같은 도구를 사용하면 REST 서비스를 쉽게 호출하고 사용할 수 있지만 표준 DataContract serialization 규칙을 준수하지 않는 XML 또는 JSON을 사용하는 것은 사소한 경우가 있습니다. 필요한 경우 아래에 설명된 ServiceStack.Text 라이브러리를 사용하여 요청을 호출하고 적절한 serialization을 명시적으로 처리합니다.

RESTful 데이터 사용

RESTful 웹 서비스는 일반적으로 JSON 메시지를 사용하여 데이터를 클라이언트로 반환합니다. JSON은 압축 페이로드를 생성하는 텍스트 기반 데이터 교환 형식으로, 데이터를 보낼 때 대역폭 요구 사항이 줄어듭니다. 이 섹션에서는 JSON 및 POX(Plain-Old-XML)에서 RESTful 응답을 사용하는 메커니즘을 검사합니다.

System.JSON

Xamarin 플랫폼은 JSON을 지원합니다. 다음 코드 예제와 JsonObject같이 결과를 검색할 수 있습니다.

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 점에 유의해야 합니다.

JSON.NET

NewtonSoft JSON.NET 라이브러리는 JSON 메시지를 직렬화하고 역직렬화하는 데 널리 사용되는 라이브러리입니다. 다음 코드 예제에서는 JSON.NET 사용하여 JSON 메시지를 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는 ServiceStack 라이브러리를 사용하도록 설계된 JSON serialization 라이브러리입니다. 다음 코드 예제에서는 다음을 사용하여 JSON을 구문 분석하는 방법을 보여 줍니다 ServiceStack.Text.JsonObject.

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

System.Xml.Linq

XML 기반 REST 웹 서비스를 사용하는 경우 다음 코드 예제와 같이 LINQ to XML을 사용하여 XML을 구문 분석하고 C# 개체를 인라인으로 채울 수 있습니다.

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)

ASMX는 SOAP(Simple Object Access Protocol)를 사용하여 메시지를 보내는 웹 서비스를 빌드하는 기능을 제공합니다. SOAP는 웹 서비스를 빌드하고 액세스하기 위한 플랫폼 독립적 언어 독립적 프로토콜입니다. ASMX 서비스의 소비자는 서비스를 구현하는 데 사용되는 플랫폼, 개체 모델 또는 프로그래밍 언어에 대해 아무것도 알 필요가 없습니다. SOAP 메시지를 보내고 받는 방법만 이해하면 됩니다.

SOAP 메시지는 다음 요소를 포함하는 XML 문서입니다.

  • XML 문서를 SOAP 메시지로 식별하는 Envelope라는 루트 요소입니다.
  • 인증 데이터와 같은 애플리케이션 관련 정보를 포함하는 선택적 Header 요소입니다. Header 요소가 있으면 Envelope 요소의 첫 번째 자식 요소여야 합니다.
  • 받는 사람을 위한 SOAP 메시지를 포함하는 필수 Body 요소입니다.
  • 오류 메시지를 나타내는 데 사용되는 선택적 Fault 요소입니다. Fault 요소가 있는 경우 Body 요소의 자식 요소여야 합니다.

SOAP는 HTTP, SMTP, TCP 및 UDP를 비롯한 많은 전송 프로토콜에 대해 작동할 수 있습니다. 그러나 ASMX 서비스는 HTTP를 통해서만 작동할 수 있습니다. Xamarin 플랫폼은 HTTP를 통한 표준 SOAP 1.1 구현을 지원하며, 여기에는 많은 표준 ASMX 서비스 구성에 대한 지원이 포함됩니다.

프록시 생성

애플리케이션이 서비스에 연결할 수 있도록 하는 ASMX 서비스를 사용하려면 프록시를 생성해야 합니다. 프록시는 메서드 및 연결된 서비스 구성을 정의하는 서비스 메타데이터를 사용하여 생성됩니다. 이 메타데이터는 웹 서비스에서 생성되는 WSDL(Web Services Description Language) 문서로 노출됩니다. 프록시는 Mac용 Visual Studio 또는 Visual Studio를 사용하여 플랫폼별 프로젝트에 웹 서비스에 대한 웹 참조를 추가하여 빌드됩니다.

웹 서비스 URL은 경로 접두사를 통해 file:/// 액세스할 수 있는 호스트된 원격 원본 또는 로컬 파일 시스템 리소스일 수 있습니다. 예를 들면 다음과 같습니다.

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

그러면 프로젝트의 웹 또는 서비스 참조 폴더에 프록시가 생성됩니다. 프록시는 생성된 코드이므로 수정해서는 안 됩니다.

프로젝트에 수동으로 프록시 추가

호환되는 도구를 사용하여 생성된 기존 프록시가 있는 경우 프로젝트의 일부로 포함될 때 이 출력을 사용할 수 있습니다. Mac용 Visual Studio 파일 추가... 메뉴 옵션을 사용하여 프록시를 추가합니다. 또한 참조 추가... 대화 상자를 사용하여 System.Web.Services.dll 명시적으로 참조해야 합니다.

프록시 사용

생성된 프록시 클래스는 APM(비동기 프로그래밍 모델) 디자인 패턴을 사용하는 웹 서비스를 사용하는 메서드를 제공합니다. 이 패턴에서 비동기 작업은 비동기 작업을 시작하고 종료하는 BeginOperationNameEndOperationName이라는 두 가지 메서드로 구현됩니다.

BeginOperationName 메서드는 비동기 작업을 시작하고 인터페이스를 구현하는 개체를 IAsyncResult 반환합니다. BeginOperationName을 호출한 후 애플리케이션은 스레드 풀 스레드에서 비동기 작업이 수행되는 동안 호출 스레드에 대한 명령을 계속 실행할 수 있습니다.

BeginOperationName에 대한 각 호출에 대해 애플리케이션은 EndOperationName을 호출하여 작업 결과를 가져와야 합니다. EndOperationName반환 값은 동기 웹 서비스 메서드에서 반환하는 형식과 동일합니다. 다음 코드 예제는 이러한 예를 보여줍니다.

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

TPL(작업 병렬 라이브러리)은 동일한 Task 개체에서 비동기 작업을 캡슐화하여 APM 시작/끝 메서드 쌍을 사용하는 프로세스를 간소화할 수 있습니다. 이 캡슐화는 메서드의 Task.Factory.FromAsync 여러 오버로드에서 제공됩니다. 이 메서드는 메서드가 완료되면 메서드를 실행하는 TodoService.EndGetTodoItems 메서드를 만듭니 Task 다. null 매개 변수는 데이터가 대리자로 전달되지 않음을 BeginGetTodoItems 나타냅니다.TodoService.BeginGetTodoItems 마지막으로 열거형 값 TaskCreationOptions 은 태스크 만들기 및 실행에 대한 기본 동작을 사용해야 하므로 지정합니다.

APM 에 대한 자세한 내용은 MSDN의 비동기 프로그래밍 모델TPL 및 기존 .NET Framework 비동기 프로그래밍을 참조하세요.

ASMX 서비스 사용에 대한 자세한 내용은 ASMX(ASP.NET 웹 서비스) 사용을 참조하세요.

WCF(Windows Communication Foundation)

WCF는 서비스 지향 애플리케이션을 빌드하기 위한 Microsoft의 통합 프레임워크입니다. 이를 통해 개발자는 안전하고 안정적이며 거래되고 상호 운용 가능한 분산 애플리케이션을 빌드할 수 있습니다.

WCF는 다음과 같은 다양한 계약을 포함하는 서비스를 설명합니다.

  • 데이터 계약 – 메시지 내의 콘텐츠에 대한 기초를 형성하는 데이터 구조를 정의합니다.
  • 메시지 계약 – 기존 데이터 계약의 메시지를 작성합니다.
  • 오류 계약 – 사용자 지정 SOAP 오류를 지정할 수 있습니다.
  • 서비스 계약 – 서비스에서 지원하는 작업 및 각 작업과 상호 작용하는 데 필요한 메시지를 지정합니다. 또한 각 서비스의 작업과 연결할 수 있는 사용자 지정 오류 동작도 지정합니다.

ASMX(ASP.NET Web Services)와 WCF 간에는 차이가 있지만, WCF는 ASMX가 제공하는 것과 동일한 기능인 HTTP를 통한 SOAP 메시지를 지원한다는 점을 이해하는 것이 중요합니다.

Important

WCF에 대한 Xamarin 플랫폼 지원은 클래스를 사용하여 BasicHttpBinding HTTP/HTTPS를 통해 텍스트로 인코딩된 SOAP 메시지로 제한됩니다. 또한 WCF 지원을 사용하려면 Windows 환경에서만 사용할 수 있는 도구를 사용하여 프록시를 생성해야 합니다.

프록시 생성

애플리케이션이 서비스에 연결할 수 있도록 하는 WCF 서비스를 사용하려면 프록시를 생성해야 합니다. 프록시는 메서드 및 연결된 서비스 구성을 정의하는 서비스 메타데이터를 사용하여 생성됩니다. 이 메타데이터는 웹 서비스에서 생성되는 WSDL(웹 서비스 설명 언어) 문서의 형태로 노출됩니다. Visual Studio 2017의 Microsoft WCF 웹 서비스 참조 공급자를 사용하여 .NET 표준 라이브러리에 웹 서비스에 대한 서비스 참조를 추가하여 프록시를 빌드할 수 있습니다.

Visual Studio 2017에서 Microsoft WCF 웹 서비스 참조 공급자를 사용하여 프록시를 만드는 대신 ServiceModel 메타데이터 유틸리티 도구(svcutil.exe)를 사용하는 것이 좋습니다. 자세한 내용은 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 참조하세요.

프록시 구성

생성된 프록시를 구성하려면 일반적으로 초기화 EndpointAddress 중에 다음 예제와 같이 두 가지 구성 인수(SOAP 1.1/ASMX 또는 WCF에 따라 다름)가 사용됩니다.

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

바인딩은 애플리케이션 및 서비스가 서로 통신하는 데 필요한 전송, 인코딩 및 프로토콜 세부 정보를 지정하는 데 사용됩니다. 텍스트 BasicHttpBinding 로 인코딩된 SOAP 메시지가 HTTP 전송 프로토콜을 통해 전송되도록 지정합니다. 엔드포인트 주소를 지정하면 게시된 인스턴스가 여러 개인 경우 애플리케이션이 WCF 서비스의 다른 인스턴스에 연결할 수 있습니다.

프록시 사용

생성된 프록시 클래스는 APM(비동기 프로그래밍 모델) 디자인 패턴을 사용하는 웹 서비스를 사용하는 메서드를 제공합니다. 이 패턴에서 비동기 작업은 비동기 작업을 시작하고 종료하는 BeginOperationNameEndOperationName이라는 두 가지 메서드로 구현됩니다.

BeginOperationName 메서드는 비동기 작업을 시작하고 인터페이스를 구현하는 개체를 IAsyncResult 반환합니다. BeginOperationName을 호출한 후 애플리케이션은 스레드 풀 스레드에서 비동기 작업이 수행되는 동안 호출 스레드에 대한 명령을 계속 실행할 수 있습니다.

BeginOperationName에 대한 각 호출에 대해 애플리케이션은 EndOperationName을 호출하여 작업 결과를 가져와야 합니다. EndOperationName반환 값은 동기 웹 서비스 메서드에서 반환하는 형식과 동일합니다. 다음 코드 예제는 이러한 예를 보여줍니다.

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 시작/끝 메서드 쌍을 사용하는 프로세스를 간소화할 수 있습니다. 이 캡슐화는 메서드의 Task.Factory.FromAsync 여러 오버로드에서 제공됩니다. 이 메서드는 메서드가 완료되면 메서드를 실행하는 TodoServiceClient.EndGetTodoItems 메서드를 만듭니 Task 다. null 매개 변수는 데이터가 대리자로 전달되지 않음을 BeginGetTodoItems 나타냅니다.TodoServiceClient.BeginGetTodoItems 마지막으로 열거형 값 TaskCreationOptions 은 태스크 만들기 및 실행에 대한 기본 동작을 사용해야 하므로 지정합니다.

APM 에 대한 자세한 내용은 MSDN의 비동기 프로그래밍 모델TPL 및 기존 .NET Framework 비동기 프로그래밍을 참조하세요.

WCF 서비스 사용에 대한 자세한 내용은 WCF(Windows Communication Foundation) 웹 서비스 사용을 참조하세요.

전송 보안 사용

WCF 서비스는 전송 수준 보안을 사용하여 메시지 가로채기를 방지할 수 있습니다. Xamarin 플랫폼은 SSL을 사용하여 전송 수준 보안을 사용하는 바인딩을 지원합니다. 그러나 스택이 인증서의 유효성을 검사해야 하는 경우가 있을 수 있으며, 이로 인해 예상치 못한 동작이 발생할 수 있습니다. 다음 코드 예제와 같이 서비스를 호출하기 전에 대리자를 등록 ServerCertificateValidationCallback 하여 유효성 검사를 재정의할 수 있습니다.

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

이 기본 서버 쪽 인증서 유효성 검사를 무시하면서 전송 암호화와 관련이 있습니다. 그러나 이 방법은 인증서와 관련된 신뢰 문제를 효과적으로 무시하고 적절하지 않을 수 있습니다. 자세한 내용은 mono-project.com 대해 신뢰할 수 있는 루트를 정중하게사용하는 것을 참조하세요.

클라이언트 자격 증명 보안 사용

WCF 서비스는 서비스 클라이언트가 자격 증명을 사용하여 인증하도록 요구할 수도 있습니다. Xamarin 플랫폼은 클라이언트가 SOAP 메시지 봉투 내에서 자격 증명을 보낼 수 있도록 하는 WS-Security 프로토콜을 지원하지 않습니다. 그러나 Xamarin 플랫폼은 적절한 ClientCredentialType다음을 지정하여 HTTP 기본 인증 자격 증명을 서버에 보내는 기능을 지원합니다.

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

그런 다음 기본 인증 자격 증명을 지정할 수 있습니다.

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

HTTP 기본 인증에 대한 자세한 내용은 REST 웹 서비스의 컨텍스트에서 RESTful 웹 서비스 인증을 참조하세요.