Napište vlastní plugin pro Windows Device Portal

Můžete napsat zabalenou aplikaci (UPW nebo zabalenou v systému Win32 pomocí Windows App SDK), která k hostování webové stránky používá portál zařízení Windows a poskytuje diagnostické informace. Funkce modulu plug-in pro Device Portal je implementována pomocí rozšíření windows.devicePortalProvider, které je dostupné pro všechny balené aplikace bez ohledu na rámec uživatelského rozhraní.

Note

Tento článek je zaměřený na vývojáře, kteří vytvářejí diagnostické nástroje nebo nástroje pro správu pro zařízení IoT Enterprise, nasazení veřejného terminálu nebo jiné spravované Windows prostředí, ve kterých se portál zařízení používá pro vzdálené monitorování. Pokud vytváříte standardní desktopovou aplikaci Windows 11, pravděpodobně nepotřebujete modul plug-in Portál zařízení – zvažte použití diagnostiky aplikací nebo Windows Analyzátor výkonu.

Podpora modulu plug-in portálu zařízení je dostupná na Windows 10 a novějších verzích.

Vytvoření projektu

Vytvořte nový projekt aplikace v Microsoft Visual Studio. Přejděte na Soubor > nový > Project a vyberte jednu z následujících šablon project:

  • Pro aplikaci UWP: Prázdná aplikace (Windows Universal) pro C#
  • Pro desktopovou aplikaci WinUI 3: Prázdná aplikace zabalená (WinUI 3 v desktopové verzi)

V dialogovém okně Konfigurovat nový projekt pojmenujte projekt DevicePortalProvider a klepněte na tlačítko Vytvořit. Bude to aplikace, která obsahuje službu App Service.

Přidejte oprávnění devicePortalProvider

Přidejte do souboru Package.appxmanifest vaší aplikace oprávnění rescap:devicePortalProvider.

Note

Obor názvů rescap (omezená schopnost) musí být deklarován dříve, než jej bude možné použít. Podrobnosti najdete v deklarací funkcích aplikace .

V Průzkumník řešení poklikáním Package.appxmanifest otevřete návrháře manifestu, přepněte na kartu Schopnosti a zkontrolujte poskytovatele portálu zařízení, pokud je uveden v seznamu, nebo ho ručně přidejte úpravou XML.

<Capabilities>
  <rescap:Capability Name="devicePortalProvider" />
</Capabilities>

Nastavte službu App Service

Moduly plug-in portálu zařízení používají aplikační služby ke komunikaci mezi hostitelským procesem modulu plug-in a portálem zařízení. Otevřete Package.appxmanifest, přepněte se na kartu Deklarace, přidejte deklaraci Windows Device Portal Provider a nakonfigurujte ji pomocí názvu služby.

Případně můžete xml upravit přímo:

<Applications>
  <Application Id="App" ...>
    ...
    <Extensions>
      <uap3:Extension Category="windows.appService" EntryPoint="DevicePortalProvider.DevicePortalPluginService">
        <uap3:AppService Name="com.microsoft.myapp.devicePortalService" SupportsRemoteSystems="true"/>
      </uap3:Extension>
      <uap4:Extension Category="windows.devicePortalProvider">
        <uap4:DevicePortalProvider DisplayName="My App Plugin" AppServiceName="com.microsoft.myapp.devicePortalService" HandlerRoute="/MyCustomApp/"/>
      </uap4:Extension>
    </Extensions>
  </Application>
</Applications>

Important

Předpony oboru názvů XML uap3 a uap4 musí být deklarovány v kořenovém prvku <Package> manifestu a přidány do atributu IgnorableNamespaces:

<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
  IgnorableNamespaces="... uap3 uap4">

Následující atributy vyžadují konfiguraci specifickou pro vaši aplikaci:

Vlastnost Description
EntryPoint Určuje třídu, která implementuje službu App Service.
Name (AppService) Jedinečný název služby App Service. Tento název se používá jako AppServiceName atribut v elementu DevicePortalProvider .
DisplayName Název, který se zobrazí v uživatelském rozhraní portálu zařízení.
HandlerRoute Předpona cesty URL, kterou Device Portal používá pro směrování požadavků k vašemu modulu plug-in. Všechny požadavky, jejichž cesta začíná touto hodnotou, se předávají do vaší služby App Service. Cesta musí začínat i končit lomítkem.

Přidejte kód služby App Service

Přidejte do svého řešení projekt komponenty prostředí Windows Runtime pro hostování služby App Service na pozadí:

  1. V Průzkumník řešení klikněte pravým tlačítkem na řešení a vyberte Přidat > nový Project.
  2. Vyberte komponentu prostředí Windows Runtime (Universal Windows) a pojmenujte ji DevicePortalProvider.
  3. Klikněte pravým tlačítkem na nový projekt a vyberte Přidat > novou položku > App Service.

Podrobnosti implementace kódu služby App Service najdete v článku Vytvoření a využití služby App Service .

Implementujte obslužnou rutinu portálu Device Portal

Tady je ukázková implementace služby aplikace modulu plug-in pro Portál zařízení:

using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.Storage;
using Windows.System.Diagnostics.DevicePortal;
using Windows.Web.Http;

namespace DevicePortalProvider
{
    public sealed class DevicePortalPluginService : IBackgroundTask
    {
        private BackgroundTaskDeferral _taskDeferral;
        private DevicePortalConnection _connection;

        public void Run(IBackgroundTaskInstance taskInstance)
        {
            _taskDeferral = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCanceled;

            var triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;
            _connection = DevicePortalConnection.GetForAppServiceConnection(triggerDetails.AppServiceConnection);
            _connection.RequestReceived += _connection_RequestReceived;
        }

        private void OnTaskCanceled(IBackgroundTaskInstance taskInstance, BackgroundTaskCancellationReason reason)
        {
            _taskDeferral.Complete();
        }

        private async void _connection_RequestReceived(DevicePortalConnection sender, DevicePortalConnectionRequestReceivedEventArgs args)
        {
            // Handle the incoming request and send a response
        }
    }
}

Zpracování příchozích požadavků

Obslužná rutina vašeho modulu plug-in přijímá všechny požadavky GET, POST, DELETE a PUT, které Portál zařízení směruje na váš HandlerRoute. Typická implementace:

private async void _connection_RequestReceived(
    DevicePortalConnection sender, 
    DevicePortalConnectionRequestReceivedEventArgs args)
{
    var request = args.RequestMessage;
    var response = args.ResponseMessage;

    // Use the request's path to determine what data to return
    // The path must begin with the HandlerRoute declared in the manifest (e.g. "/MyCustomApp/")
    if (request.RequestUri.LocalPath.Equals("/MyCustomApp/info", StringComparison.OrdinalIgnoreCase))
    {
        response.Content = new HttpStringContent(
            "{ \"appVersion\": \"1.0\" }",
            Windows.Storage.Streams.UnicodeEncoding.Utf8,
            "application/json");
        response.StatusCode = HttpStatusCode.Ok;
    }
}

Obsluha statického obsahu

Pokud chcete obsluhovat webový obsah (HTML, CSS, JavaScript) z balíčku vaší aplikace, můžete tyto soubory umístit do složky a reagovat na žádosti s obsahem souboru.

private async void _connection_RequestReceived(
    DevicePortalConnection sender,
    DevicePortalConnectionRequestReceivedEventArgs args)
{
    var storageFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"data\content.html");
    string htmlContent = await FileIO.ReadTextAsync(storageFile);

    args.ResponseMessage.Content = new HttpStringContent(
        htmlContent,
        Windows.Storage.Streams.UnicodeEncoding.Utf8,
        "text/html");
    args.ResponseMessage.StatusCode = HttpStatusCode.Ok;
}

Spuštění služby App Service jako systému

V některých případech může být pro kompletní otestování modulu plug-in Device Portal nutné spustit tento modul pod účtem System. Podrobnosti najdete v článku msdn Magazine .

Viz také