Využívání webové služby WCF (Windows Communication Foundation)
WCF je sjednocená architektura Microsoftu pro vytváření aplikací orientovaných na služby. Umožňuje vývojářům vytvářet zabezpečené, spolehlivé, transactované a interoperabilní distribuované aplikace. Tento článek ukazuje, jak využívat službu SOAP (Simple Object Access Protocol) WCF z Xamarin.Forms aplikace.
WCF popisuje službu s různými kontrakty, mezi které patří:
- Kontrakty dat – definují datové struktury, které tvoří základ obsahu ve zprávě.
- Kontrakty zpráv – vytváření zpráv z existujících kontraktů dat
- Kontrakty chyb – umožňují zadat vlastní chyby SOAP.
- Kontrakty služeb – určují operace, které služby podporují, a zprávy potřebné pro interakci s jednotlivými operacemi. Určují také jakékoli vlastní chování selhání, které může být přidruženo k operacím v každé službě.
Mezi webovými službami ASP.NET (ASMX) a WCF existují rozdíly, ale TECHNOLOGIE WCF podporuje stejné funkce jako SLUŽBA ASMX – zprávy SOAP přes protokol HTTP. Další informace o využívání služby ASMX najdete v tématu Využití ASP.NET webových služeb (ASMX).
Důležité
Podpora platformy Xamarin pro WCF je omezena na textově kódované zprávy SOAP přes HTTP/HTTPS pomocí BasicHttpBinding
třídy.
Podpora WCF vyžaduje použití nástrojů dostupných pouze v prostředí Windows k vygenerování proxy serveru a hostování služby TodoWCFService. Sestavení a testování aplikace pro iOS bude vyžadovat nasazení todoWCFService na počítač s Windows nebo jako webovou službu Azure.
Nativní aplikace Xamarin Forms obvykle sdílejí kód s knihovnou tříd .NET Standard. .NET Core však v současné době nepodporuje WCF, takže sdílený projekt musí být starší přenosnou knihovnou tříd. Informace o podpoře WCF v .NET Core naleznete v tématu Volba mezi .NET Core a .NET Framework pro serverové aplikace.
Ukázkové řešení aplikace obsahuje službu WCF, kterou je možné spustit místně, a je znázorněna 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 WCF 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.
Aby bylo možné využívat službu WCF, musí být vygenerován proxy server , který aplikaci umožňuje připojit se ke službě. Proxy server se sestaví pomocí metadat služby, která definují metody a přidruženou konfiguraci služby. Tato metadata jsou vystavena ve formě dokumentu WSDL (Web Services Description Language), který je generován webovou službou. Proxy server lze vytvořit pomocí zprostředkovatele odkazu webové služby Microsoft WCF v sadě Visual Studio 2017 a přidat odkaz na službu pro webovou službu do knihovny .NET Standard. Alternativou k vytvoření proxy serveru pomocí zprostředkovatele odkazu webové služby Microsoft WCF v sadě Visual Studio 2017 je použití nástroje ServiceModel Metadata Utility (svcutil.exe). Další informace naleznete v tématu ServiceModel Metadata Utility Tool (Svcutil.exe).
Generované třídy proxy poskytují metody pro využívání webových služeb, které používají vzor návrhu asynchronního programovacího modelu (APM). V tomto vzoru je asynchronní operace implementována jako dvě metody s názvem BeginOperationName a EndOperationName, které začínají a ukončuje asynchronní operaci.
BeginOperationName metoda začíná asynchronní operace a vrátí objekt, který implementuje IAsyncResult
rozhraní. Po volání BeginOperationName může aplikace pokračovat v provádění pokynů ve volajícím vlákně, zatímco asynchronní operace probíhá ve vlákně fondu vláken.
Pro každé volání BeginOperationName by aplikace měla také volat EndOperationName získat výsledky operace. Návratová hodnota EndOperationName je stejný typ vrácený synchronní metodou webové služby. Například EndGetTodoItems
metoda vrátí kolekci TodoItem
instancí. EndOperationName metoda také obsahuje IAsyncResult
parametr, který by měl být nastaven na instanci vrácenou odpovídajícím voláním BeginOperationName metoda.
Knihovna TPL (Task Parallel Library) může zjednodušit proces využívání dvojice počáteční/koncové metody APM zapouzdřením asynchronních operací ve stejném Task
objektu. Tato zapouzdření je poskytována více přetíženími TaskFactory.FromAsync
metody.
Další informace o APM naleznete v tématu Asynchronní programovací model a TPL a Tradiční asynchronní programování rozhraní .NET Framework na MSDN.
Vytvoření objektu TodoServiceClient
Vygenerovaná třída proxy poskytuje TodoServiceClient
třídu, která se používá ke komunikaci se službou WCF přes HTTP. Poskytuje funkce pro vyvolání metod webové služby jako asynchronních operací z URI identifikované instance služby. Další informace o asynchronníchoperacích
Instance TodoServiceClient
je deklarována na úrovni třídy tak, aby objekt žije tak dlouho, dokud aplikace potřebuje využívat službu WCF, jak je znázorněno v následujícím příkladu kódu:
public class SoapService : ISoapService
{
ITodoService todoService;
...
public SoapService ()
{
todoService = new TodoServiceClient (
new BasicHttpBinding (),
new EndpointAddress (Constants.SoapUrl));
}
...
}
Instance TodoServiceClient
je nakonfigurovaná s informacemi o vazbě a adresou koncového bodu. Vazba se používá k určení podrobností přenosu, kódování a protokolu požadovaných pro vzájemné komunikace aplikací a služeb. Určuje BasicHttpBinding
, že textově kódované zprávy SOAP budou odeslány přes přenosový protokol HTTP. Zadáním adresy koncového bodu se aplikace může připojit k různým instancím služby WCF za předpokladu, že existuje více publikovaných instancí.
Další informace o konfiguraci odkazu na službu naleznete v tématu Konfigurace odkazu na službu.
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 ToWCFServiceTodoItem
metoda, jak je znázorněno v následujícím příkladu kódu:
TodoWCFService.TodoItem ToWCFServiceTodoItem (TodoItem item)
{
return new TodoWCFService.TodoItem
{
ID = item.ID,
Name = item.Name,
Notes = item.Notes,
Done = item.Done
};
}
Tato metoda jednoduše vytvoří novou TodoWCFService.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í FromWCFServiceTodoItem
metody, jak je znázorněno v následujícím příkladu kódu:
static TodoItem FromWCFServiceTodoItem (TodoWCFService.TodoItem item)
{
return new TodoItem
{
ID = item.ID,
Name = item.Name,
Notes = item.Notes,
Done = item.Done
};
}
Tato metoda jednoduše načte data z vygenerovaného TodoItem
typu proxy serveru a nastaví je v nově vytvořené TodoItem
instanci.
Načtení dat
Tyto TodoServiceClient.BeginGetTodoItems
metody TodoServiceClient.EndGetTodoItems
se používají k volání GetTodoItems
operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v objektu Task
, jak je znázorněno v následujícím příkladu kódu:
public async Task<List<TodoItem>> RefreshDataAsync ()
{
...
var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
todoService.BeginGetTodoItems,
todoService.EndGetTodoItems,
null,
TaskCreationOptions.None);
foreach (var item in todoItems)
{
Items.Add (FromWCFServiceTodoItem (item));
}
...
}
Metoda Task.Factory.FromAsync
vytvoří Task
, která spustí metodu TodoServiceClient.EndGetTodoItems
po TodoServiceClient.BeginGetTodoItems
dokončení metody s parametrem null
označujícím, že do delegáta BeginGetTodoItems
nejsou předána žádná data. Nakonec hodnota výčtu TaskCreationOptions
určuje, že se má použít výchozí chování při vytváření a provádění úkolů.
Metoda TodoServiceClient.EndGetTodoItems
vrátí instanci ObservableCollection
TodoWCFService.TodoItem
, která je pak převedena na List
TodoItem
instance pro zobrazení.
Vytvoření dat
Tyto TodoServiceClient.BeginCreateTodoItem
metody TodoServiceClient.EndCreateTodoItem
se používají k volání CreateTodoItem
operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v objektu Task
, jak je znázorněno v následujícím příkladu kódu:
public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
...
var todoItem = ToWCFServiceTodoItem (item);
...
await Task.Factory.FromAsync (
todoService.BeginCreateTodoItem,
todoService.EndCreateTodoItem,
todoItem,
TaskCreationOptions.None);
...
}
Metoda Task.Factory.FromAsync
vytvoří Task
, která spustí metodu TodoServiceClient.EndCreateTodoItem
po TodoServiceClient.BeginCreateTodoItem
dokončení metody s todoItem
parametrem, který je předán delegátovi BeginCreateTodoItem
, aby určil, TodoItem
který má být vytvořen webovou službou. Nakonec hodnota výčtu TaskCreationOptions
určuje, že se má použít výchozí chování při vytváření a provádění úkolů.
Webová služba vyvolá FaultException
chybu, pokud se nepodaří vytvořit TodoItem
, která je zpracována aplikací.
Aktualizace dat
Tyto TodoServiceClient.BeginEditTodoItem
metody TodoServiceClient.EndEditTodoItem
se používají k volání EditTodoItem
operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v objektu Task
, jak je znázorněno v následujícím příkladu kódu:
public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
...
var todoItem = ToWCFServiceTodoItem (item);
...
await Task.Factory.FromAsync (
todoService.BeginEditTodoItem,
todoService.EndEditTodoItem,
todoItem,
TaskCreationOptions.None);
...
}
Metoda Task.Factory.FromAsync
vytvoří Task
, která spustí metodu TodoServiceClient.EndEditTodoItem
po TodoServiceClient.BeginCreateTodoItem
dokončení metody s todoItem
parametrem, který je předán do BeginEditTodoItem
delegáta, aby určil TodoItem
, který má být aktualizován webovou službou. Nakonec hodnota výčtu TaskCreationOptions
určuje, že se má použít výchozí chování při vytváření a provádění úkolů.
Webová služba vyvolá FaultException
chybu, pokud se nepodaří najít nebo aktualizovat TodoItem
, která je zpracována aplikací.
Odstranění dat
Tyto TodoServiceClient.BeginDeleteTodoItem
metody TodoServiceClient.EndDeleteTodoItem
se používají k volání DeleteTodoItem
operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v objektu Task
, jak je znázorněno v následujícím příkladu kódu:
public async Task DeleteTodoItemAsync (string id)
{
...
await Task.Factory.FromAsync (
todoService.BeginDeleteTodoItem,
todoService.EndDeleteTodoItem,
id,
TaskCreationOptions.None);
...
}
Metoda Task.Factory.FromAsync
vytvoří Task
, která spustí metodu TodoServiceClient.EndDeleteTodoItem
po TodoServiceClient.BeginDeleteTodoItem
dokončení metody s id
parametrem, který je předán delegátovi BeginDeleteTodoItem
, aby určil, TodoItem
že má být odstraněna webovou službou. Nakonec hodnota výčtu TaskCreationOptions
určuje, že se má použít výchozí chování při vytváření a provádění úkolů.
Webová služba vyvolá FaultException
chybu, pokud se nepodaří najít nebo odstranit TodoItem
, která je zpracována aplikací.
Konfigurace vzdáleného přístupu ke službě IIS Express
V sadě Visual Studio 2017 nebo Visual Studio 2019 byste měli být schopni otestovat aplikaci UPW na počítači bez další konfigurace. Testování klientů s Androidem a iOSem může vyžadovat další kroky v této části. Další informace najdete v tématu Připojení k místním webovým službám ze simulátorů iOSu a emulátorů Androidu.
Ve výchozím nastavení služba IIS Express bude reagovat pouze na požadavky na localhost
. Vzdálená zařízení (například zařízení s Androidem, i Telefon nebo dokonce simulátor) nebudou mít přístup k vaší místní službě WCF. Budete muset znát IP adresu pracovní stanice s Windows 10 v místní síti. Pro účely tohoto příkladu předpokládejme, že vaše pracovní stanice má IP adresu 192.168.1.143
. Následující kroky vysvětlují, jak nakonfigurovat Windows 10 a IIS Express tak, aby přijímaly vzdálená připojení a připojovali se ke službě z fyzického nebo virtuálního zařízení:
Přidání výjimky do brány Windows Firewall Port musíte otevřít přes bránu Windows Firewall, kterou můžou aplikace ve vaší podsíti použít ke komunikaci se službou WCF. Vytvořte příchozí pravidlo, které otevírá port 49393 v bráně firewall. Z příkazového řádku pro správu spusťte tento příkaz:
netsh advfirewall firewall add rule name="TodoWCFService" dir=in protocol=tcp localport=49393 profile=private remoteip=localsubnet action=allow
Nakonfigurujte službu IIS Express tak, aby přijímala vzdálená připojení. Službu IIS Express můžete nakonfigurovat úpravou konfiguračního souboru služby IIS Express v adresáři [adresář řešení].vs\config\applicationhost.config.
site
Najděte prvek s názvemTodoWCFService
. Měl by vypadat nějak takto:<site name="TodoWCFService" id="2"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" /> </application> <bindings> <binding protocol="http" bindingInformation="*:49393:localhost" /> </bindings> </site>
Abyste otevřeli port 49393 mimo provoz a emulátor Androidu, budete muset přidat dva
binding
prvky. Vazba používá[IP address]:[port]:[hostname]
formát, který určuje, jak služba IIS Express bude reagovat na požadavky. Externí požadavky budou mít názvy hostitelů, které musí být zadány jakobinding
. Do elementubindings
přidejte následující KÓD XML a nahraďte IP adresu vlastní IP adresou:<binding protocol="http" bindingInformation="*:49393:192.168.1.143" /> <binding protocol="http" bindingInformation="*:49393:127.0.0.1" />
Po provedení změn
bindings
by měl prvek vypadat takto:<site name="TodoWCFService" id="2"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" /> </application> <bindings> <binding protocol="http" bindingInformation="*:49393:localhost" /> <binding protocol="http" bindingInformation="*:49393:192.168.1.143" /> <binding protocol="http" bindingInformation="*:49393:127.0.0.1" /> </bindings> </site>
Důležité
Služba IIS Express ve výchozím nastavení nepřijímá připojení z externích zdrojů z bezpečnostních důvodů. Pokud chcete povolit připojení ze vzdálených zařízení, musíte spustit službu IIS Express s Správa istrativními oprávněními. Nejjednodušší způsob, jak to udělat, je spustit Visual Studio 2017 s Správa istrativními oprávněními. Tím se spustí služba IIS Express s Správa istrativními oprávněními při spuštění služby TodoWCFService.
Po dokončení těchto kroků byste měli být schopni spustit službu TodoWCFService a připojit se z jiných zařízení ve vaší podsíti. Můžete to otestovat spuštěním aplikace a návštěvou
http://localhost:49393/TodoService.svc
. Pokud se při návštěvě této adresy URL zobrazí chyba Chybný požadavek , může být v konfiguraci služby IIS Express nesprávná (požadavek se blíží službě IIS Express,bindings
ale zamítá se). Pokud se zobrazí jiná chyba, může to být, že vaše aplikace není spuštěná nebo je brána firewall nesprávně nakonfigurovaná.Pokud chcete službě IIS Express povolit, aby služba běžela a obsluhuje ji, vypněte možnost Upravit a pokračovat ve webových > ladicích programech vlastností > projektu.
Přizpůsobte si zařízení koncových bodů, která používají pro přístup ke službě. Tento krok zahrnuje konfiguraci klientské aplikace spuštěné na fyzickém nebo emulovaném zařízení pro přístup ke službě WCF.
Emulátor Androidu využívá interní proxy server, který brání emulátoru v přímém přístupu k adrese hostitelského
localhost
počítače. Místo toho se adresa10.0.2.2
v emulátoru směruje nalocalhost
hostitelský počítač prostřednictvím interního proxy serveru. Tyto požadavky proxied budou mít127.0.0.1
v hlavičce požadavku název hostitele, což je důvod, proč jste vytvořili vazbu SLUŽBY IIS Express pro tento název hostitele v krocích výše.Simulátor iOS běží na hostiteli sestavení Mac, i když používáte vzdálený simulátor iOS pro Windows. Síťové požadavky ze simulátoru budou mít IP adresu vaší pracovní stanice v místní síti jako název hostitele (v tomto příkladu je
192.168.1.143
to , ale vaše skutečná IP adresa se bude pravděpodobně lišit). Proto jste pro tento název hostitele vytvořili vazbu SLUŽBY IIS Express v předchozích krocích.Ujistěte se,
SoapUrl
že vlastnost v souboru Constants.cs v projektu TodoWCF (Portable) má správné hodnoty pro vaši síť:public static string SoapUrl { get { var defaultUrl = "http://localhost:49393/TodoService.svc"; if (Device.RuntimePlatform == Device.Android) { defaultUrl = "http://10.0.2.2:49393/TodoService.svc"; } else if (Device.RuntimePlatform == Device.iOS) { defaultUrl = "http://192.168.1.143:49393/TodoService.svc"; } return defaultUrl; } }
Jakmile nakonfigurujete Constants.cs s příslušnými koncovými body, měli byste být schopni se připojit ke službě TodoWCFService spuštěné na pracovní stanici s Windows 10 z fyzických nebo virtuálních zařízení.