Sdílet prostřednictvím


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:

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 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 ObservableCollectionTodoWCFService.TodoItem , která je pak převedena na ListTodoItem 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í:

  1. 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
    
  2. 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ázvem TodoWCFService. 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 jako binding. Do elementu bindings 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.

  3. 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 adresa 10.0.2.2 v emulátoru směruje na localhost hostitelský počítač prostřednictvím interního proxy serveru. Tyto požadavky proxied budou mít 127.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.143to , 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í.