Skriva ett anpassat plugin-program för Windows-enhetsportalen

Du kan skriva en paketerad app (UWP eller paketerad Win32 med Windows App SDK) som använder Windows-enhetsportalen för att vara värd för en webbsida och tillhandahålla diagnostikinformation. Plugin-funktionen för enhetsportalen implementeras med tillägget windows.devicePortalProvider , som är tillgängligt för alla paketerade appar oavsett användargränssnittsramverket.

Note

Den här artikeln riktar sig till utvecklare som skapar diagnostik- eller hanteringsverktyg för IoT Enterprise-enheter, kioskdistributioner eller andra hanterade Windows miljöer där enhetsportalen används för fjärrövervakning. Om du skapar en vanlig Windows 11 skrivbordsapp är det osannolikt att du behöver ett plugin-program för enhetsportalen – överväg att använda appdiagnostik eller Windows Analyzátor výkonu i stället.

Stöd för plugin-program för enhetsportalen finns på Windows 10 och senare.

Skapa projektet

Skapa ett nytt appprojekt i Microsoft Visual Studio. Gå till Arkiv > Nytt > Projekt och välj någon av följande projektmallar:

  • För en UWP-app: Tomt program (Windows Universal) för C#
  • För en WinUI 3-skrivbordsapp: Tom app, paketerad (WinUI 3 på skrivbordet)

I dialogrutan Konfigurera det nya projektet namnger du projektet DevicePortalProvider och klickar sedan på Skapa. Det här är appen som innehåller apptjänsten.

Lägg till funktionen devicePortalProvider

Lägg till rescap:devicePortalProviderkapaciteten i appens Package.appxmanifest-fil.

Note

Namnområdet rescap (begränsad kapacitet) måste deklareras innan det kan användas. Mer information finns i Appkapacitetsdeklarationer .

I Prieskumník riešení dubbelklickar du Package.appxmanifest för att öppna manifestdesignern, växlar sedan till fliken Funktioner och kontrollerar enhetsportalprovidern om den visas eller lägger till den manuellt genom att redigera XML-koden.

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

Konfigurera apptjänsten

Plugin-program för enhetsportalen använder apptjänster för att kommunicera mellan värdprocessen för plugin-programmet och enhetsportalen. Öppna Package.appxmanifest, växla till fliken Deklarationer, lägg till en Windows leverantörsdeklaration för enhetsportalen och konfigurera den med tjänstnamnet.

Du kan också redigera XML:en direkt:

<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

XML-namnrymdsprefixen uap3 och uap4 måste deklareras i rot-elementet <Package> i ditt manifest och läggas till i attributet 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">

Följande attribut kräver konfiguration som är specifik för din app:

Attribute Beskrivning
EntryPoint Anger den klass som implementerar App Service.
Name (AppService) Det unika namnet på apptjänsten. Det här namnet används som AppServiceName attribut i elementet DevicePortalProvider .
DisplayName Namnet som visas i enhetsportalens användargränssnitt.
HandlerRoute Url-sökvägsprefixet som enhetsportalen använder för att dirigera begäranden till plugin-programmet. Alla begäranden vars sökväg börjar med det här värdet vidarebefordras till din apptjänst. Vägen måste börja och sluta med snedstreck.

Lägg till App Service-koden

Lägg till ett Windows Runtime komponentprojekt i din lösning som värd för apptjänsten i bakgrunden:

  1. I Prieskumník riešení högerklickar du på lösningen och väljer Lägg till > ny Project.
  2. Välj Windows Runtime komponent (Universell Windows) och ge den namnet DevicePortalProvider.
  3. Högerklicka på det nya projektet och välj Lägg till > ny objektapptjänst>.

Information om kodimplementering för App Service finns i artikeln Skapa och använda en App Service .

Implementera enhetsportalhanteraren

Här är en exempelimplementering av en apptjänst för enhetsportalens plugin-program:

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

Hantera inkommande begäranden

Plugin-hanteraren tar emot alla GET-, POST-, DELETE- och PUT-begäranden som enhetsportalen dirigerar till din HandlerRoute. En typisk implementering:

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

Hantera statiskt innehåll

Om du vill hantera webbinnehåll (HTML, CSS, JavaScript) inifrån appens paket kan du placera filerna i en mapp och svara på begäranden med filinnehållet.

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

Kör apptjänsten som system

I vissa fall kan du för fullständig testning av plugin-programmet för enhetsportalen behöva köra plugin-programmet som systemkonto. Mer information finns i ARTIKELN OM MSDN Magazine .

Se även