ASP.NET 웹 서비스 (ASMX) 사용Consuming an ASP.NET Web Service (ASMX)

샘플 다운로드 샘플 다운로드Download Sample Download the sample

ASMX는 SOAP Simple Object Access Protocol ()를 사용 하 여 메시지를 전송 하는 웹 서비스를 구축 하는 기능을 제공 합니다. SOAP는 빌드하고 웹 서비스에 액세스 하기 위한 플랫폼 독립적인 및 언어 독립적 프로토콜입니다. ASMX 서비스의 소비자는 플랫폼, 개체 모델 또는 서비스를 구현 하는 데 사용 되는 프로그래밍 언어에 대 한 알 필요가 없습니다. 만 SOAP 메시지를 수신 하는 방법을 이해 해야 합니다. 이 문서에서는 Xamarin.Forms 응용 프로그램에서 ASMX SOAP 서비스를 사용 하는 방법에 설명 합니다.ASMX provides the ability to build web services that send messages using the Simple Object Access Protocol (SOAP). SOAP is a platform-independent and language-independent protocol for building and accessing web services. Consumers of an ASMX service do not need to know anything about the platform, object model, or programming language used to implement the service. They only need to understand how to send and receive SOAP messages. This article demonstrates how to consume an ASMX SOAP service from a Xamarin.Forms application.

SOAP 메시지는 다음 요소를 포함 하는 XML 문서:A SOAP message is an XML document containing the following elements:

  • 라는 루트 요소가 봉투 (envelope) SOAP 메시지가 XML 문서를 식별 하는 합니다.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. 경우는 머리글 요소가의 첫 번째 자식 요소 여야 합니다 합니다 봉투 (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. 경우는 오류 요소가, 자식 요소 이어야 합니다는 본문 요소입니다.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. 그러나 HTTP를 통한 ASMX 서비스만 작동할 수 있습니다.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.

이 샘플에는 실제 또는 에뮬레이트된 장치에서 실행 되는 모바일 응용 프로그램 및 가져오기, 추가, 편집 및 데이터를 삭제 하는 메서드를 제공 하는 ASMX 서비스를 포함 합니다.This sample includes the mobile applications that run on physical or emulated devices, and an ASMX service that provides methods to get, add, edit, and delete data. 모바일 응용 프로그램을 실행 하는 경우 연결할 로컬에서 호스트 하는 ASMX 서비스는 다음 스크린샷에 표시 된 대로:When the mobile applications are run, they connect to the locally-hosted ASMX service as shown in the following screenshot:

참고

IOS 9 이상, 앱 전송 보안 ATS ()는 인터넷 리소스 (예: 앱의 백 엔드 서버)와 앱 간에 보안 연결 하므로 중요 한 정보가 실수로 유출 방지 적용 합니다.In iOS 9 and greater, 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 프로토콜 및 인터넷 리소스에 대 한 통신을 보호 합니다.ATS can be opted out of 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.

웹 서비스 사용Consume the web service

ASMX 서비스는 다음 작업을 제공 합니다.The ASMX service provides the following operations:

작업Operation 설명Description 매개 변수Parameters
GetTodoItemsGetTodoItems 할 일 항목의 목록 가져오기Get a list of to-do items
CreateTodoItemCreateTodoItem 할 일 항목을 새로 만들려면Create a new to-do item XML 직렬화 TodoItemAn XML serialized TodoItem
EditTodoItemEditTodoItem 할 일 항목 업데이트Update a to-do item XML 직렬화 TodoItemAn XML serialized TodoItem
DeleteTodoItemDeleteTodoItem 할 일 항목 삭제Delete a to-do item XML 직렬화 TodoItemAn XML serialized TodoItem

응용 프로그램에서 사용 되는 데이터 모델에 대 한 자세한 내용은 참조 하세요. 데이터 모델링은합니다.For more information about the data model used in the application, see Modeling the data.

TodoService 프록시 만들기Create the TodoService proxy

프록시 클래스를 호출 TodoService, 확장 SoapHttpClientProtocol HTTP를 통한 ASMX 서비스와 통신 하기 위한 메서드를 제공 합니다.A proxy class, called TodoService, extends SoapHttpClientProtocol and provides methods for communicating with the ASMX service over HTTP. 프록시는 Visual Studio 2019 또는 Visual Studio 2017에서 각 플랫폼별 프로젝트에 대 한 웹 참조를 추가 하 여 생성 됩니다.The proxy is generated by adding a web reference to each platform-specific project in Visual Studio 2019 or Visual Studio 2017. 웹 참조 메서드와 서비스의 WSDL 웹 서비스 설명 언어 () 문서에 정의 된 각 작업에 대 한 이벤트를 생성 합니다.The web reference generates methods and events for each action defined in the service's Web Services Description Language (WSDL) document.

예를 들어 합니다 GetTodoItems 서비스 작업의 결과 GetTodoItemsAsync 메서드 및 GetTodoItemsCompleted 프록시에는 이벤트입니다.For example, the GetTodoItems service action results in a GetTodoItemsAsync method and a GetTodoItemsCompleted event in the proxy. 생성된 된 메서드는 void 반환 형식이 고 호출 된 GetTodoItems 부모에 대 한 작업 SoapHttpClientProtocol 클래스입니다.The generated method has a void return type and invokes the GetTodoItems action on the parent SoapHttpClientProtocol class. 호출 된 메서드가 서비스에서 응답을 받으면 발생 합니다 GetTodoItemsCompleted 이벤트 내 이벤트의 응답 데이터를 제공 하 고 Result 속성입니다.When the invoked method receives a response from the service, it fires the GetTodoItemsCompleted event and provides the response data within the event's Result property.

ISoapService 구현 만들기Create the ISoapService implementation

샘플에서는 서비스와 작동 하도록 공유 되는 플랫폼 간 프로젝트를 사용 하려면 다음을 정의 합니다.는 ISoapService 인터페이스를 따르는 합니다 작업의 비동기 프로그래밍 모델 C# 합니다.To enable the shared, cross-platform project to work with the service, the sample defines the ISoapService interface, which follows the Task asynchronous programming model in C#. 각 플랫폼에 구현 된 ISoapService 플랫폼별 프록시를 노출 하 합니다.Each platform implements the ISoapService to expose the platform-specific proxy. 샘플에서는 TaskCompletionSource 작업 비동기 인터페이스와 프록시를 노출 하는 개체입니다.The sample uses TaskCompletionSource objects to expose the proxy as a task asynchronous interface. 사용 하 여에 대 한 내용은 TaskCompletionSource 아래 섹션에서 각 작업 유형의 구현에 있습니다.Details on using TaskCompletionSource are found in the implementations of each action type in the sections below.

샘플 SoapService:The sample SoapService:

  1. 인스턴스화하는 TodoService 클래스 수준 인스턴스로Instantiates the TodoService as a class-level instance
  2. 호출 컬렉션을 만듭니다 Items 스토어로 TodoItem 개체Creates a collection called Items to store TodoItem objects
  3. 선택적 사용자 지정 끝점 지정 Url 속성에는 TodoServiceSpecifies a custom endpoint for the optional Url property on the TodoService
public class SoapService : ISoapService
{
    ASMXService.TodoService todoService;
    public List<TodoItem> Items { get; private set; } = new List<TodoItem>();

    public SoapService ()
    {
        todoService = new ASMXService.TodoService ();
        todoService.Url = Constants.SoapUrl;
        ...
    }
}

데이터 전송 개체 만들기Create data transfer objects

샘플 응용 프로그램을 TodoItem 모델 데이터에는 클래스입니다.The sample application uses the TodoItem class to model data. 저장 하는 TodoItem 생성 된 프록시를 먼저 변환 해야 하는 웹 서비스에 대 한 항목 TodoItem 형식입니다.To store a TodoItem item in the web service it must first be converted to the proxy generated TodoItem type. ToASMXServiceTodoItem 메서드를 다음 코드 예제 에서처럼:This is accomplished by the ToASMXServiceTodoItem method, as shown in the following code example:

ASMXService.TodoItem ToASMXServiceTodoItem (TodoItem item)
{
    return new ASMXService.TodoItem {
        ID = item.ID,
        Name = item.Name,
        Notes = item.Notes,
        Done = item.Done
    };
}

이 메서드를 만듭니다 ASMService.TodoItem 인스턴스로 이동한 각 속성에서 동일한 속성을 설정 합니다 TodoItem 인스턴스.This method creates a new ASMService.TodoItem instance, and sets each property to the identical property from the TodoItem instance.

마찬가지로 데이터 웹 서비스에서 검색 되 면 변환 해야 생성 된 프록시에서 TodoItem 에 입력을 TodoItem 인스턴스.Similarly, when data is retrieved from the web service, it must be converted from the proxy generated TodoItem type to a TodoItem instance. 사용 하 여 이렇게는 FromASMXServiceTodoItem 메서드를 다음 코드 예제 에서처럼:This is accomplished with the FromASMXServiceTodoItem method, as shown in the following code example:

static TodoItem FromASMXServiceTodoItem (ASMXService.TodoItem item)
{
    return new TodoItem {
        ID = item.ID,
        Name = item.Name,
        Notes = item.Notes,
        Done = item.Done
    };
}

이 메서드는 생성 된 프록시에서 데이터를 검색 TodoItem 입력 하 고 새로 만든에서 설정 TodoItem 인스턴스.This method retrieves the data from the proxy generated TodoItem type and sets it in the newly created TodoItem instance.

데이터 검색Retrieve data

ISoapService 인터페이스를 RefreshDataAsync 반환할 메서드를 Task 항목 컬렉션을 사용 하 여 합니다.The ISoapService interface expects the RefreshDataAsync method to return a Task with the item collection. 그러나는 TodoService.GetTodoItemsAsync 메서드가 void를 반환 합니다.However, the TodoService.GetTodoItemsAsync method returns void. 호출 인터페이스 패턴을 충족 해야 합니다 GetTodoItemsAsync에 대 한 대기를 GetTodoItemsCompleted 이벤트를 발생 하 여 컬렉션을 채우는 합니다.To satisfy the interface pattern, you must call GetTodoItemsAsync, wait for the GetTodoItemsCompleted event to fire, and populate the collection. 이 옵션을 사용 하면 UI에 유효한 컬렉션을 반환할 수 있습니다.This allows you to return a valid collection to the UI.

아래 예제에서는 새 TaskCompletionSource, 비동기 호출을 시작 합니다 RefreshDataAsync 메서드를 기다립니다를 Task 제공한는 TaskCompletionSource합니다.The example below creates a new TaskCompletionSource, begins the async call in the RefreshDataAsync method, and awaits the Task provided by the TaskCompletionSource. 경우는 TodoService_GetTodoItemsCompleted 이벤트 처리기가 호출 채웁니다 합니다 Items 컬렉션 및 업데이트는 TaskCompletionSource:When the TodoService_GetTodoItemsCompleted event handler is invoked it populates the Items collection and updates the TaskCompletionSource:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> getRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.GetTodoItemsCompleted += TodoService_GetTodoItemsCompleted;
    }

    public async Task<List<TodoItem>> RefreshDataAsync()
    {
        getRequestComplete = new TaskCompletionSource<bool>();
        todoService.GetTodoItemsAsync();
        await getRequestComplete.Task;
        return Items;
    }

    private void TodoService_GetTodoItemsCompleted(object sender, ASMXService.GetTodoItemsCompletedEventArgs e)
    {
        try
        {
            getRequestComplete = getRequestComplete ?? new TaskCompletionSource<bool>();

            Items = new List<TodoItem>();
            foreach (var item in e.Result)
            {
                Items.Add(FromASMXServiceTodoItem(item));
            }
            getRequestComplete?.TrySetResult(true);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(@"\t\tERROR {0}", ex.Message);
        }
    }

    ...
}

자세한 내용은 비동기 프로그래밍 모델 하 고 TPL 및 일반적인.NET Framework 비동기 프로그래밍합니다.For more information, see Asynchronous Programming Model and TPL and Traditional .NET Framework Asynchronous Programming.

만들기 또는 데이터 편집Create or edit data

만들거나 데이터를 편집할 때 구현 해야 합니다는 ISoapService.SaveTodoItemAsync 메서드.When you create or edit data, you must implement the ISoapService.SaveTodoItemAsync method. 이 메서드는 검색 여부를 합니다 TodoItem 새롭거나 업데이트 된 항목은 및에서 적절 한 메서드를 호출 합니다 todoService 개체입니다.This method detects whether the TodoItem is a new or updated item and calls the appropriate method on the todoService object. 합니다 CreateTodoItemCompletedEditTodoItemCompleted 시기를 파악할 수 있도록 이벤트 처리기도 구현 해야 합니다 todoService (이러한 결합할 수 있으며 단일 처리기 동일한 작업을 수행 하기 때문에) ASMX 서비스에서 응답을 받았습니다.The CreateTodoItemCompleted and EditTodoItemCompleted event handlers should also be implemented so you know when the todoService has received a response from the ASMX service (these can be combined into a single handler because they perform the same operation). 다음 예제에서는 인터페이스 및 이벤트 처리기 구현은 뿐만 TaskCompletionSource 비동기적으로 작동 하는 데 사용 되는 개체:The following example demonstrates the interface and event handler implementations, as well as the TaskCompletionSource object used to operate asynchronously:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> saveRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.CreateTodoItemCompleted += TodoService_SaveTodoItemCompleted;
        todoService.EditTodoItemCompleted += TodoService_SaveTodoItemCompleted;
    }

    public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
    {
        try
        {
            var todoItem = ToASMXServiceTodoItem(item);
            saveRequestComplete = new TaskCompletionSource<bool>();
            if (isNewItem)
            {
                todoService.CreateTodoItemAsync(todoItem);
            }
            else
            {
                todoService.EditTodoItemAsync(todoItem);
            }
            await saveRequestComplete.Task;
        }
        catch (SoapException se)
        {
            Debug.WriteLine("\t\t{0}", se.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("\t\tERROR {0}", ex.Message);
        }
    }

    private void TodoService_SaveTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        saveRequestComplete?.TrySetResult(true);
    }

    ...
}

데이터 삭제Delete data

데이터를 삭제 하는 유사한 구현이 필요 합니다.Deleting data requires a similar implementation. 정의 된 TaskCompletionSource, 이벤트 처리기를 구현 하며 ISoapService.DeleteTodoItemAsync 메서드:Define a TaskCompletionSource, implement an event handler, and the ISoapService.DeleteTodoItemAsync method:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> deleteRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.DeleteTodoItemCompleted += TodoService_DeleteTodoItemCompleted;
    }

    public async Task DeleteTodoItemAsync (string id)
    {
        try
        {
            deleteRequestComplete = new TaskCompletionSource<bool>();
            todoService.DeleteTodoItemAsync(id);
            await deleteRequestComplete.Task;
        }
        catch (SoapException se)
        {
            Debug.WriteLine("\t\t{0}", se.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("\t\tERROR {0}", ex.Message);
        }
    }

    private void TodoService_DeleteTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        deleteRequestComplete?.TrySetResult(true);
    }

    ...
}

웹 서비스 테스트Test the web service

로컬로 호스팅되는 서비스를 사용 하 여 실제 또는 에뮬레이트된 장치를 테스트 진행에서 되도록 사용자 지정 IIS 구성을, 끝점 주소 및 방화벽 규칙 필요 합니다.Testing physical or emulated devices with a locally-hosted service requires custom IIS Configuration, endpoint addresses, and firewall rules to be in place. 테스트 환경을 설정 하는 방법에 자세한 내용을 참조 하세요. 합니다 IIS Express에 대 한 원격 액세스 구성합니다.For more detail on how to set up your environment for testing, see the Configure remote access to IIS Express. WCF 및 ASMX 테스트 간의 유일한 차이점은 TodoService의 포트입니다.The only difference between testing WCF and ASMX is the port number of the TodoService.