Sdílet prostřednictvím


Využívání webové služby ASP.NET (ASMX)

ASMX umožňuje vytvářet webové služby, které odesílají zprávy pomocí protokolu SOAP (Simple Object Access Protocol). SOAP je protokol založený na platformě a nezávislý na jazyce pro vytváření a přístup k webovým službám. Uživatelé služby ASMX nemusí o platformě, objektovém modelu ani programovacím jazyce použitém k implementaci služby nic vědět. Potřebují jenom pochopit, jak odesílat a přijímat zprávy SOAP. Tento článek ukazuje, jak využívat službu SOAP ASMX z Xamarin.Forms aplikace.

Zpráva SOAP je dokument XML obsahující následující prvky:

  • Kořenový element s názvem Obálka , který identifikuje dokument XML jako zprávu SOAP.
  • Volitelný element Header , který obsahuje informace specifické pro aplikaci, jako jsou ověřovací data. Pokud je prvek Header k dispozici, musí být prvním podřízeným prvkem elementu Obálka.
  • Povinný prvek textu , který obsahuje zprávu SOAP určenou pro příjemce.
  • Volitelný prvek Fault , který slouží k označení chybových zpráv. Pokud je prvek Fault, musí být podřízený prvek Body elementu.

Protokol SOAP může pracovat s mnoha přenosových protokoly, včetně protokolů HTTP, SMTP, TCP a UDP. Služba ASMX ale může fungovat pouze přes protokol HTTP. Platforma Xamarin podporuje standardní implementace PROTOKOLU SOAP 1.1 přes protokol HTTP a to zahrnuje podporu pro řadu standardních konfigurací služby ASMX.

Tato ukázka zahrnuje mobilní aplikace, které běží na fyzických nebo emulovaných zařízeních, a službu ASMX, která poskytuje metody pro získávání, přidávání, úpravy a odstraňování dat. Při spuštění mobilních aplikací se připojují ke službě ASMX hostované místně, jak je znázorněno na následujícím snímku obrazovky:

Ukázková aplikace

Poznámka:

V iOSu 9 a novějších vynucuje služba App Transport Security (ATS) zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a aplikací, což brání náhodnému zpřístupnění citlivých informací. Vzhledem k tomu, že služba ATS je ve výchozím nastavení povolená v aplikacích vytvořených pro iOS 9, budou všechna připojení podléhat požadavkům na zabezpečení ATS. Pokud připojení nesplňují tyto požadavky, dojde k selhání s výjimkou. ATS je možné odhlásit, pokud není možné používat HTTPS protokol a zabezpečenou komunikaci pro internetové prostředky. Toho lze dosáhnout aktualizací souboru Info.plist aplikace. Další informace najdete v tématu App Transport Security.

Využívání webové služby

Služba ASMX poskytuje následující operace:

Operation Popis Parametry
GetTodoItems Získání seznamu položek úkolů
CreateTodoItem Vytvoření nové položky úkolu Serializovaný objekt TodoItem ve formátu XML
EditTodoItem Aktualizace položky úkolu Serializovaný objekt TodoItem ve formátu XML
DeleteTodoItem Odstranění položky úkolu Serializovaný objekt TodoItem ve formátu XML

Další informace o datovém modelu použitém v aplikaci najdete v tématu Modelování dat.

Vytvoření proxy služby TodoService

Třída proxy, která se nazývá TodoService, rozšiřuje SoapHttpClientProtocol a poskytuje metody pro komunikaci se službou ASMX přes HTTP. Proxy server se generuje přidáním webového odkazu na každý projekt specifický pro platformu v sadě Visual Studio 2019 nebo Visual Studio 2017. Webový odkaz generuje metody a události pro každou akci definovanou v dokumentu WSDL (Web Services Description Language).

Například GetTodoItems akce služby vede k GetTodoItemsAsync metodě a GetTodoItemsCompleted události v proxy serveru. Vygenerovaná metoda má návratový typ void a vyvolá GetTodoItems akci nadřazené SoapHttpClientProtocol třídy. Když vyvolána metoda obdrží odpověď ze služby, aktivuje GetTodoItemsCompleted událost a poskytne data odpovědi v rámci vlastnosti události Result .

Vytvoření implementace ISoapService

Pro povolení sdíleného multiplatformního projektu pro práci se službou definuje ISoapService ukázka rozhraní, které následuje za asynchronním programovacím modelem úlohy v jazyce C#. Každá platforma implementuje ISoapService zpřístupnění proxy serveru specifického pro danou platformu. Ukázka používá TaskCompletionSource objekty k zveřejnění proxy jako asynchronního rozhraní úlohy. Podrobnosti o použití TaskCompletionSource najdete v implementacích jednotlivých typů akcí v následujících částech.

Ukázka SoapService:

  1. TodoService Vytvoří instanci jako instanci na úrovni třídy.
  2. Vytvoří kolekci s názvem Items pro ukládání TodoItem objektů.
  3. Určuje vlastní koncový bod pro volitelnou Url vlastnost 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;
        ...
    }
}

Vytvoření objektů pro přenos dat

Ukázková aplikace používá TodoItem třídu k modelování dat. Chcete-li uložit TodoItem položku ve webové službě, musí být nejprve převedena na typ vygenerovaný TodoItem proxy serverem. Toho dosáhne ToASMXServiceTodoItem metoda, jak je znázorněno v následujícím příkladu kódu:

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

Tato metoda vytvoří novou ASMService.TodoItem instanci a nastaví každou vlastnost na identickou vlastnost z TodoItem instance.

Podobně platí, že při načtení dat z webové služby je nutné je převést z proxy vygenerovaného TodoItem typu na TodoItem instanci. To se provádí pomocí FromASMXServiceTodoItem metody, jak je znázorněno v následujícím příkladu kódu:

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

Tato metoda načte data z vygenerovaného TodoItem typu proxy serveru a nastaví je v nově vytvořené TodoItem instanci.

Načtení dat

Rozhraní ISoapService očekává, že RefreshDataAsync metoda vrátí s kolekcí Task položek. TodoService.GetTodoItemsAsync Metoda však vrátí void. Chcete-li vyhovět vzoru rozhraní, musíte volat GetTodoItemsAsync, počkat GetTodoItemsCompleted na spuštění události a naplnit kolekci. To vám umožní vrátit platnou kolekci do uživatelského rozhraní.

Následující příklad vytvoří nový TaskCompletionSource, zahájí asynchronní volání v RefreshDataAsync metodě a čeká na poskytnuté TaskTaskCompletionSource. Při vyvolání obslužné TodoService_GetTodoItemsCompleted rutiny události naplní Items kolekci a aktualizuje 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);
        }
    }

    ...
}

Další informace naleznete v tématu Asynchronní programovací model a TPL a Tradiční .NET Framework Asynchronní programování.

Vytvoření nebo úprava dat

Při vytváření nebo úpravě dat je nutné implementovat metodu ISoapService.SaveTodoItemAsync . Tato metoda zjistí, zda TodoItem je nová nebo aktualizovaná položka, a volá příslušnou metodu objektu todoService . Obslužné CreateTodoItemCompleted rutiny a EditTodoItemCompleted obslužné rutiny událostí by se také měly implementovat, abyste věděli, kdy todoService obdržel odpověď ze služby ASMX (ty se dají zkombinovat do jedné obslužné rutiny, protože provádějí stejnou operaci). Následující příklad ukazuje implementace rozhraní a obslužné rutiny událostí a také TaskCompletionSource objekt použitý k asynchronnímu provozu:

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

    ...
}

Odstranění dat

Odstranění dat vyžaduje podobnou implementaci. Definujte , implementujte obslužnou TaskCompletionSourcerutinu události a metodu ISoapService.DeleteTodoItemAsync :

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

    ...
}

Otestování webové služby

Testování fyzických nebo emulovaných zařízení pomocí místně hostované služby vyžaduje, aby byla zavedená vlastní konfigurace služby IIS, adresy koncových bodů a pravidla brány firewall. Další podrobnosti o nastavení prostředí pro testování najdete v tématu Konfigurace vzdáleného přístupu ke službě IIS Express. Jediným rozdílem mezi testováním WCF a ASMX je číslo portu todoService.