využívání webové služby ASP.NET (ASMX)
ASMX nabízí možnost vytvářet webové služby, které odesílají zprávy pomocí protokolu SOAP (Simple Object Access Protocol). Protokol SOAP je nezávislý na platformě a jazyk nezávislý na platformě pro vytváření a přístup k webovým službám. Uživatelé služby ASMX nepotřebují znát žádné informace o platformě, objektovém modelu nebo programovacím jazyce, který se používá k implementaci služby. Potřebují pouze pochopit, jak odesílat a přijímat zprávy SOAP. Tento článek ukazuje, jak ze aplikace využívat službu protokolu reasmx Xamarin.Forms .
Zpráva SOAP je dokument XML, který obsahuje následující prvky:
- Kořenový element s názvem obálka , který IDENTIFIKUJE dokument XML jako zprávu SOAP.
- Volitelný element záhlaví , který obsahuje informace specifické pro aplikaci, například ověřovací data. Je-li element header přítomen, musí se jednat o první podřízený prvek elementu obálky .
- Povinný prvek těla , který obsahuje zprávu SOAP, která je určená pro příjemce.
- Volitelný prvek chyby , který se používá k označení chybových zpráv. Pokud je prvek Fault přítomen, musí být podřízeným prvkem elementu body .
Protokol SOAP může pracovat přes mnoho přenosových protokolů, včetně protokolů HTTP, SMTP, TCP a UDP. Služba ASMX ale může pracovat jenom přes HTTP. Platforma Xamarin podporuje standardní implementace protokolu SOAP 1,1 přes protokol HTTP a zahrnuje podporu pro spoustu 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ání, přidání, úpravu a odstranění dat. Když se spustí mobilní aplikace, připojí se k místně hostované službě ASMX, jak je znázorněno na následujícím snímku obrazovky:

Poznámka
V systému iOS 9 a novějších vynutila služba Transport Security Security (ATS) zabezpečená připojení mezi internetovými prostředky (například back-end serverem aplikace) a aplikací, což zabrání nechtěné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 se všechna připojení vztahovat na požadavky na zabezpečení ATS. Pokud připojení tyto požadavky nesplňují, dojde k jejich selhání s výjimkou.
ATS se může stát, že není možné používat HTTPS protokol a zabezpečenou komunikaci pro internetové prostředky. Toho je možné dosáhnout aktualizací souboru info. plist aplikace. Další informace najdete v tématu zabezpečení přenosu aplikací.
Využívání webové služby
Služba ASMX poskytuje následující operace:
| Operace | Description | Parametry |
|---|---|---|
| GetTodoItems | Získat seznam úkolů | |
| CreateTodoItem | Vytvořit novou položku úkolů | Serializovaná TodoItem XML |
| EditTodoItem | Aktualizace položky úkolů | Serializovaná TodoItem XML |
| DeleteTodoItem | Odstranění položky úkolů | Serializovaná TodoItem XML |
Další informace o datovém modelu používaném v aplikaci najdete v tématu modelování dat.
Vytvoření proxy serveru TodoService
Proxy třída, která se nazývá TodoService , rozšiřuje SoapHttpClientProtocol a poskytuje metody pro komunikaci se službou ASMX přes HTTP. proxy je vygenerován přidáním webového odkazu do každého projektu specifického pro platformu v 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) služby.
Například GetTodoItems Akce služby má za následek GetTodoItemsAsync metodu a GetTodoItemsCompleted událost v proxy serveru. Vygenerovaná metoda má návratový typ void a vyvolá GetTodoItems akci u nadřazené SoapHttpClientProtocol třídy. Když vyvolaná metoda obdrží odpověď od služby, aktivuje GetTodoItemsCompleted událost a poskytne data odpovědi v rámci Result vlastnosti události.
Vytvoření implementace ISoapService
Pokud chcete sdílenému projektu pro různé platformy povolit spolupráci se službou, ukázka definuje ISoapService rozhraní, které následuje za ISoapService. Každá Platforma implementuje ISoapService k vystavení proxy serveru pro konkrétní platformu. Ukázka používá TaskCompletionSource objekty k zveřejnění proxy serveru jako asynchronního rozhraní úlohy. Podrobnosti o použití TaskCompletionSource najdete v implementacích každého typu akce v níže uvedených částech.
Ukázka SoapService :
- Vytvoří instanci
TodoServicejako instanci úrovně třídy. - Vytvoří kolekci s názvem
Itemspro ukládáníTodoItemobjektů. - Určuje vlastní koncový bod pro volitelnou
Urlvlastnost naTodoService
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;
...
}
}
Vytvář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 do webové služby, musí být nejprve převedena na typ generovaný proxy serverem TodoItem . To je provedeno ToASMXServiceTodoItem metodou, 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 když jsou data načítána z webové služby, musí být převedena z typu vygenerovaného proxy TodoItem na TodoItem instanci. To je dosaženo FromASMXServiceTodoItem metodou, 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 typu generovaného proxy TodoItem a nastaví je v nově vytvořené TodoItem instanci.
Načtení dat
ISoapServiceRozhraní očekává, že RefreshDataAsync Metoda vrátí hodnotu Task s kolekcí položek. TodoService.GetTodoItemsAsyncMetoda však vrátí typ void. Pro splnění vzoru rozhraní musíte zavolat GetTodoItemsAsync , počkat na GetTodoItemsCompleted vyvolání události a naplnit kolekci. To umožňuje 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 očekává operátor, který Task poskytuje TaskCompletionSource . Když TodoService_GetTodoItemsCompleted je obslužná rutina události vyvolána, 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í programování modelu a TPL a tradiční .NET Framework asynchronní programování.
Vytvoření nebo úprava dat
Při vytváření nebo úpravách dat je nutné implementovat ISoapService.SaveTodoItemAsync metodu. Tato metoda zjišťuje, zda TodoItem je nová nebo aktualizovaná položka a volá odpovídající metodu todoService objektu. CreateTodoItemCompletedEditTodoItemCompleted Obslužné rutiny události a by měly být také implementovány, abyste věděli, kdy todoService obdržela odpověď od služby ASMX (mohou být kombinovány do jediné obslužné rutiny, protože provádějí stejnou operaci). Následující příklad ukazuje implementaci obslužné rutiny rozhraní a události a také TaskCompletionSource objekt použitý k asynchronnímu provozování:
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 TaskCompletionSource , Implementujte obslužnou rutinu události a ISoapService.DeleteTodoItemAsync metodu:
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 na místě vlastní konfigurace služby IIS, adresy koncových bodů a pravidla brány firewall. Další informace o tom, jak nastavit prostředí pro testování, najdete v tématu Konfigurace vzdáleného přístupu pro IIS Express. Jediným rozdílem mezi testováním WCF a ASMX je číslo portu TodoService.
Stažení ukázky