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:
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
:
TodoService
Vytvoří instanci jako instanci na úrovni třídy.- Vytvoří kolekci s názvem
Items
pro ukládáníTodoItem
objektů. - Určuje vlastní koncový bod pro volitelnou
Url
vlastnostTodoService
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é Task
TaskCompletionSource
. 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 TaskCompletionSource
rutinu 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.