využívání webové služby Windows Communication Foundation (WCF)

Ukázka stažení Stažení ukázky

WCF je sjednocené rozhraní Microsoftu pro vytváření aplikací orientovaných na služby. Umožňuje vývojářům vytvářet zabezpečené, spolehlivé, transakční a interoperabilní distribuované aplikace. Tento článek ukazuje, jak používat službu WCF Simple Object Access Protocol (SOAP) z Xamarin.Forms aplikace.

WCF popisuje službu s celou řadou různých kontraktů, včetně:

  • Kontrakty dat – definujte datové struktury, které tvoří základ pro obsah v rámci zprávy.
  • Kontrakty zpráv – vytváření zpráv z existujících kontraktů dat.
  • Smlouvy o selhání – umožňují zadat vlastní chyby protokolu SOAP.
  • Kontrakty služeb – určete operace, které služby podporují, a zprávy vyžadované pro interakci s jednotlivými operacemi. Také určují jakékoli vlastní chování při selhání, které může být přidruženo k operacím v každé službě.

existují rozdíly mezi ASP.NET webovými službami (ASMX) a wcf, ale wcf podporuje stejné funkce, které zajišťuje technologie ASMX – zprávy protokolu SOAP přes protokol HTTP. další informace o tom, jak používat službu asmx, najdete v tématu využívání ASP.NET webové služby (asmx).

Důležité

Podpora platformy Xamarin pro WCF je omezená na textové zprávy protokolu SOAP kódované přes HTTP/HTTPS pomocí BasicHttpBinding třídy.

podpora WCF vyžaduje použití nástrojů, které jsou k dispozici pouze v prostředí Windows pro vygenerování proxy a hostování TodoWCFService. sestavování a testování aplikace pro iOS bude vyžadovat nasazení TodoWCFService do počítače s Windows nebo jako webovou službu Azure.

Xamarin Forms nativní aplikace obvykle sdílejí kód s .NET Standard knihovny tříd. .NET Core ale v současné době nepodporuje WCF, takže sdílený projekt musí být starší Přenosná knihovna tříd. informace o podpoře WCF v .net core najdete v tématu volba mezi .net Core a .NET Framework pro serverové aplikace.

Ukázkové řešení aplikace zahrnuje službu WCF, která se dá spustit místně, a je znázorněná na následujícím snímku obrazovky:

Ukázková aplikace

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 WCF 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.

Proxy server musí být vygenerován pro využívání služby WCF, což aplikaci umožňuje připojit se ke službě. Proxy je vytvořen pomocí využívání 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 vygenerován webovou službou. proxy lze vytvořit pomocí Microsoft WCF Web Service Reference Provider v Visual Studio 2017, chcete-li přidat odkaz na službu webové služby do knihovny .NET Standard. alternativou k vytvoření proxy serveru pomocí Microsoft WCF Web Service Reference Provider v Visual Studio 2017 je použití nástroje pro dodané Metadata (svcutil.exe). Další informace najdete v tématu Nástroj pro nástroj pro metadata ServiceModel (Svcutil.exe).

Generované třídy proxy poskytují metody pro využívání webových služeb, které používají model návrhu asynchronního programování modelu (APM). V tomto modelu je asynchronní operace implementována jako dvě metody s názvem BeginOperationName a EndOperationName, které začínají a končí asynchronní operace.

Metoda BeginOperationName zahájí asynchronní operaci a vrátí objekt, který implementuje rozhraní. Po volání BeginOperationNamemůže aplikace pokračovat ve zpracování instrukcí ve volajícím vlákně, zatímco asynchronní operace probíhá ve vlákně fondu vláken.

Pro každé volání BeginOperationNameby měla aplikace také volat EndOperationName , aby získala výsledky operace. Vrácená hodnota EndOperationName je stejný typ vrácený synchronní metodou webové služby. Například EndGetTodoItems Metoda vrátí kolekci TodoItem instancí. Metoda EndOperationName také obsahuje parametr, který by měl být nastaven na instanci vrácenou odpovídajícím voláním metody BeginOperationName .

Task Parallel Library (TPL) může zjednodušit proces využívání páru počátečních a koncových metod APM zapouzdřením asynchronních operací do stejného Task objektu. Tento zapouzdření je poskytováno 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í .NET Framework asynchronní programování na webu MSDN.

Vytvoření objektu TodoServiceClient

Vygenerovaná Třída proxy poskytuje TodoServiceClient třídu, která se používá ke komunikaci se službou WCF prostřednictvím protokolu HTTP. Poskytuje funkce pro vyvolání metod webové služby jako asynchronních operací z instance identifikované identifikátoru URI. Další informace o asynchronních operacích najdete v tématu Přehled asynchronní podpory.

TodoServiceClientInstance je deklarována na úrovni třídy tak, aby objekt žije po celou dobu, než aplikace potřebuje spotřebovat 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));
  }
  ...
}

TodoServiceClientInstance je nakonfigurována s informacemi o vazbě a adresou koncového bodu. Vazba slouží k určení přenosu, kódování a podrobností protokolu, které jsou požadovány pro komunikaci mezi aplikacemi a službami. BasicHttpBindingUrčuje, zda budou odesílány textové zprávy protokolu SOAP prostřednictvím přenosového protokolu HTTP. Zadání adresy koncového bodu umožňuje aplikaci připojit se 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 najdete v tématu Konfigurace odkazu na službu.

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 ToWCFServiceTodoItem metodou, 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 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 FromWCFServiceTodoItem metodou, 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 typu generovaného proxy serverem TodoItem a nastaví je v nově vytvořené TodoItem instanci.

Načtení dat

TodoServiceClient.BeginGetTodoItemsMetody a TodoServiceClient.EndGetTodoItems slouží k volání GetTodoItems operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v Task objektu, 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));
  }
  ...
}

Task.Factory.FromAsyncMetoda vytvoří Task metodu, která provede TodoServiceClient.EndGetTodoItems metodu po TodoServiceClient.BeginGetTodoItems dokončení metody s null parametrem označujícím, že do delegáta nejsou předávána žádná data BeginGetTodoItems . Nakonec hodnota TaskCreationOptions výčtu Určuje, že se má použít výchozí chování pro vytváření a spouštění úloh.

TodoServiceClient.EndGetTodoItemsMetoda vrátí instanci ObservableCollectionTodoWCFService.TodoItem instance, která je poté převedena na ListTodoItem instance pro zobrazení.

Vytváření dat

TodoServiceClient.BeginCreateTodoItemMetody a TodoServiceClient.EndCreateTodoItem slouží k volání CreateTodoItem operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v Task objektu, 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);
  ...
}

Task.Factory.FromAsyncMetoda vytvoří Task metodu, která provede TodoServiceClient.EndCreateTodoItem metodu po TodoServiceClient.BeginCreateTodoItem dokončení metody, s todoItem parametrem, která jsou předána do BeginCreateTodoItem delegáta, aby určila, kterou má TodoItem Webová služba vytvořit. Nakonec hodnota TaskCreationOptions výčtu Určuje, že se má použít výchozí chování pro vytváření a spouštění úloh.

Webová služba vyvolá výjimku, pokud se nepovede FaultException vytvořit TodoItem , která je zpracována aplikací.

Aktualizace dat

TodoServiceClient.BeginEditTodoItemMetody a TodoServiceClient.EndEditTodoItem slouží k volání EditTodoItem operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v Task objektu, 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);
  ...
}

Task.Factory.FromAsyncMetoda vytvoří Task metodu, která provede TodoServiceClient.EndEditTodoItem metodu po TodoServiceClient.BeginCreateTodoItem dokončení metody, s todoItem parametrem, která jsou předána do BeginEditTodoItem delegáta, aby určila, TodoItem aby byla webová služba aktualizována. Nakonec hodnota TaskCreationOptions výčtu Určuje, že se má použít výchozí chování pro vytváření a spouštění úloh.

Webová služba vyvolá výjimku, pokud se nepovede FaultException Najít nebo aktualizovat TodoItem , která je zpracována aplikací.

Odstranění dat

TodoServiceClient.BeginDeleteTodoItemMetody a TodoServiceClient.EndDeleteTodoItem slouží k volání DeleteTodoItem operace poskytované webovou službou. Tyto asynchronní metody jsou zapouzdřeny v Task objektu, 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);
  ...
}

Task.Factory.FromAsyncMetoda vytvoří Task metodu, která provede TodoServiceClient.EndDeleteTodoItem metodu po TodoServiceClient.BeginDeleteTodoItem dokončení metody a s id parametrem jsou data předaná do BeginDeleteTodoItem delegáta k určení, které má TodoItem Webová služba odstranit. Nakonec hodnota TaskCreationOptions výčtu Určuje, že se má použít výchozí chování pro vytváření a spouštění úloh.

Webová služba vyvolá výjimku, pokud se nepovede FaultException Najít nebo odstranit TodoItem , která je zpracována aplikací.

Konfigurace vzdáleného přístupu pro IIS Express

v Visual Studio 2017 nebo Visual Studio 2019 byste měli být schopni otestovat aplikaci UWP na počítači bez další konfigurace. Testování klientů se systémem Android a iOS může vyžadovat další kroky v této části. další informace najdete v tématu Připojení místních webových služeb z simulátorů iOS a emulátorů androidu .

ve výchozím nastavení bude IIS Express odpovídat pouze na požadavky na localhost . vzdálená zařízení (například zařízení s androidem, iPhone nebo dokonce simulátor) nebudou mít přístup k vaší místní službě WCF. budete potřebovat znát IP adresu služby Windows 10 workstation 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 přijímat vzdálená připojení a připojovat se ke službě z fyzického nebo virtuálního zařízení:

  1. přidejte výjimku pro Windows brány Firewall. musíte otevřít port prostřednictvím Windows brány Firewall, kterou můžou aplikace ve vaší podsíti používat ke komunikaci se službou WCF. Vytvořte příchozí pravidlo otevření portu 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
    
  2. nakonfigurujte IIS Express pro přijímání vzdálených připojení. IIS Express můžete nakonfigurovat úpravou konfiguračního souboru pro IIS Express v [adresáři řešení]. vs\config\applicationhost.config. Vyhledejte element s názvem TodoWCFService . Měl by vypadat podobně jako následující kód XML:

    <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>
    

    K binding otevření portu 49393 mimo provoz a emulátoru Androidu budete muset přidat dva elementy. vazba používá [IP address]:[port]:[hostname] formát, který určuje, jak bude IIS Express odpovídat na požadavky. Externí požadavky budou mít názvy hostitelů, které musí být zadány jako binding . Přidejte následující kód XML k bindings elementu 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 změnách bindings by element měl 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é

    ve výchozím nastavení IIS Express nebude přijímat 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 IIS Express s oprávněními správce. nejjednodušší způsob, jak to provést, je spustit Visual Studio 2017 s oprávněními správce. tato akce spustí IIS Express s oprávněním správce při spuštění služby TodoWCFService.

    Po dokončení těchto kroků byste měli být schopni spustit TodoWCFService a připojit se z dalších zařízení v podsíti. Tuto možnost můžete 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 žádosti o chybu, může být v konfiguraci IIS Express nesprávná (žádost se dostane IIS Express ale je odmítnutá). Pokud se zobrazí jiná chyba, může to být tím, že aplikace není spuštěná nebo pokud je brána firewall nesprávně nakonfigurovaná.

    pokud chcete povolit, aby IIS Express zachovala provoz a obsluhu služby, vypněte možnost upravit a pokračovat v Project vlastnosti webového ladicího programu.

  3. Přizpůsobte zařízení koncového bodu pomocí 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 Android využívá interní proxy server, který brání emulátoru přímo přistoupit k adrese hostitelského počítače localhost . Místo toho je adresa 10.0.2.2 na emulátoru směrována do localhost hostitelského počítače prostřednictvím interního proxy serveru. tyto požadavky proxy budou mít 127.0.0.1 jako název hostitele v hlavičce požadavku, což je důvod, proč jste vytvořili vazbu IIS Express pro tento název hostitele v krocích výše.

    Simulátor iOS běží na hostiteli sestavení Mac, a to i v případě, že používáte vzdálený simulátor iOS pro Windows. Síťové požadavky z simulátoru budou mít vaši pracovní stanici IP v místní síti jako název hostitele (v tomto příkladu je to 192.168.1.143 , ale vaše skutečná IP adresa bude pravděpodobně odlišná). z tohoto důvodu jste vytvořili vazbu IIS Express pro tento název hostitele v krocích výše.

    Zajistěte SoapUrl , aby vlastnost v souboru SoapUrl v projektu TodoWCF (Portable) měla hodnoty, které jsou pro vaši síť správné:

    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 konstanty. cs s příslušnými koncovými body, měli byste být schopni se připojit k TodoWCFService běžícímu na Windows 10 pracovní stanici z fyzických nebo virtuálních zařízení.