2017 年 10 月
第 32 卷,第 10 期
本文章是由機器翻譯。
C# - 撰寫 Windows Device Portal 封裝的外掛程式
Amid Windows 10 版本的 fanfare,其中一項功能進行無訊息 debut:Windows 裝置入口網站 (WDP)。WDP 是網頁型診斷系統內建於 Windows 10。漸進式首度發行、 WDP 之後立即 HoloLens、 IoT、 行動電話、 桌面及 Xbox 上可用。已預期會是發行包含在新的 Windows 版本。除了 Windows Desktop WDP 是立即可用的方塊。在桌面上,WDP 是下載和安裝選用的 Windows 更新開發人員模式套件中提供的。在本文中,我將為您示範如何使用 WDP API 來實作封裝 WDP 外掛程式來擴充您自訂的 REST Api 的 Windows 市集應用程式。雖然這篇文章的焦點是在 Windows 桌面上,概念和技術也適用於其他 Windows 版本。
若要建立和執行封裝 WDP 外掛程式,您將需要更新您的系統至少為 Windows 10 建立者更新 (10.0.15063.0),並安裝對應的 Windows 10 SDK (bit.ly/2tx5Bnk)。如需詳細指示,請參閱文件,「 更新您 Tooling for Windows 10 建立者更新 」 (bit.ly/2tx3FeD)。可能需要重新啟動電腦,讓 Visual Studio 偵測並支援新的 SDK。否則可能無法載入專案。
如果您不熟悉 WDP,建議您閱讀文章 < Windows 裝置入口網站概觀 > (bit.ly/2uG9rco)。這將提供之功能的 WDP 的簡介,也將確保您有它才能繼續寫入封裝安裝外掛程式。
簡言之,您必須下載並安裝選擇性的開發人員模式下套件。從 [設定應用程式 (按 Windows + I) 瀏覽至 [更新與安全性 |開發人員] 頁面上,然後選取開發人員模式] 選項按鈕。開發人員模式下套件安裝完成時,核取 [啟用裝置入口網站的核取方塊,設定認證做為有需要,並瀏覽至所提供的 URL 來驗證功能。接受 WDP 自我簽署憑證,並輸入認證,請在瀏覽器應該會顯示 WDP Web UI 中,如中所示之後圖 1。
圖 1 Windows 裝置入口網站 UI
WDP 架構
中的 WDP UI 中顯示的工具圖 1使用 WDP 服務中裝載的 REST Api 與通訊的 JavaScript 控制項來實作。REST Api,這些一般化的無狀態 Web 要求會適用於比 WDP UI 的詳細內容。例如,無法呼叫 WDP REST API,從 Windows PowerShell 指令碼或自訂使用者代理程式。WindowsDevicePortalWrapper (bit.ly/2tx2NXF) 開放原始碼專案提供開發自訂 WDP 使用者代理程式,在 C# 中的程式庫。 在本文中,我將使用瀏覽器和可用的命令列公用程式 curl (curl.haxx.se) 以執行我自訂的 REST Api。
WDP 被設計與擴充性列入考量。比方說,WDP 被自訂的每個透過內建外掛程式的 Windows 版本。Windows 10 建立者更新中,它現在可能會建立封裝的外掛程式來擴充 WDP 的第三方。封裝外掛程式提供自訂的 REST 端點,以選擇性 Web 使用者介面,實作並部署 Windows 市集應用程式中。圖 2說明系統的運作方式。
圖 2 Windows 裝置的入口網站架構
熟悉的 Microsoft 的 IIS 將內部的讀取器辨識 WDP 的設計。使用 IIS 時,WDP 會根據 HTTP 伺服器 API (也稱為 「 HTTP 」。SYS) 除以 HTTP 控制器和 HTTP 背景工作角色之間的責任。WDP 服務實作控制器,本機系統帳戶下執行。每個 WDP 封裝外掛程式實作背景工作,在使用者的安全性內容中的 AppContainer 沙箱中執行。
很可能裝載在市集應用程式,使用 HTTP 伺服器 API 從頭 Web 伺服器。不過,實作 WDP 封裝外掛程式提供許多優點。WDP 提供所有內容和 REST Api,包括封裝外掛程式中的加密、 驗證和安全性服務。這包括從跨網站要求偽造和跨網站 WebSocket 攔截攻擊的保護。此外,WDP 管理週期的每個封裝外掛程式,這可能會執行從 UI 可見前景應用程式,或做為背景工作。簡單地說,它是簡單且安全的作法是實作外掛程式與已封裝 REST Api。順序圖表中的圖 3說明外掛程式的 [封裝的執行流程。
圖 3 啟用和執行封裝外掛程式
在其封裝應用程式資訊清單,每個外掛程式 windows.devicePortalProvider 應用程式擴充功能和相關聯的應用程式服務,與識別本身,並宣告感興趣的路由 (Url)。外掛程式可以登錄內容路由、 REST API 路由或兩者。在封裝的安裝時間,系統已註冊的資訊清單的資料。
在啟動時,WDP 服務掃描系統有已註冊封裝 WDP 外掛程式,windows.devicePortalProvider 應用程式擴充功能所識別。針對每個外掛程式的發現,WDP 服務讀取路由資訊的套件資訊清單。設定封裝所要求路由的外掛程式,稱為 URLGroup,就是向 HTTP。若要建立隨 HTTP SYS 的要求佇列。然後 WDP 服務會監視傳入要求每個封裝外掛程式的要求佇列。
在第一個路由要求外掛程式、 WDP 服務會啟動 WDP 贊助者在使用者的安全性內容中。WDP 贊助者接著會啟用封裝外掛程式,傳送 HTTP 要求佇列的外掛程式。 WDP 服務啟動並進行通訊與已封裝應用程式服務透過外掛程式資訊清單中所述。應用程式服務的連線函式會像具名的管道,做為用戶端的這個連接,並封裝外掛程式做為伺服器 WDP 發起人使用。這支持項設計可確保系統的資源管理原則不中斷長時間執行的要求。WDP 執行階段就會開始代表外掛程式的要求提供服務。 REST API 要求分派至封裝隨插即用中的已註冊 RequestReceived 事件處理常式時,會自動服務內容要求。外掛程式的存留期受 WDP 服務和處理程序生命週期管理員 (PLM)。如需背景工作暫停時,管理外掛程式狀態的詳細資訊,請參閱 「 啟動、 繼續和背景工作 」 文件 (bit.ly/2u0N7fO)。工作物件,進一步確保 WDP 服務取消已完成,終止任何執行 WDP 贊助者和其相關封裝的外掛程式。
寫入封裝外掛程式
專案建立之前您封裝建立外掛程式,您必須決定是否可以為背景工作執行您的 Web 要求處理常式,或必須在前景應用程式來執行。前景執行時需要,例如,處理常式需要應用程式的內部資料結構存取權。在執行這種彈性會啟用基礎的應用程式服務,可設定背景或前景的作業。如需 AppServices 的更完整討論,請參閱發行項,而 「 建立和使用應用程式服務 」 (bit.ly/2uZsSfz),和 「 轉換應用程式服務來執行在相同處理程序做為其主機應用程式 」 (bit.ly/2u0G8n1)。
在此範例中,我要實作的前景處理常式和背景處理常式,並示範如何整合您的靜態內容和 REST Api。從 Visual Studio 中建立新的方案,以空白的應用程式 (通用 Windows) C# 專案範本開始。名稱方案 MyPackagedPlugin 和專案 MyApp。應用程式將會裝載前景處理常式。 出現提示時,至少目標的建立者更新 SDK (15063),以確保 WDP API 的可用性。接下來,加入方案中,使用 Windows 執行階段元件 Visual C# 範本中加入執行階段元件程式庫。此專案形式呈現的名稱。此媒體櫃將會裝載的背景處理常式。
若要確保此元件隨附於應用程式套件,它的參考增益集應用程式專案。在 [方案總管] 中,展開 [應用程式] 專案節點、 以滑鼠右鍵按一下 [參考] 節點,並挑選加入參考。在 [參考管理員] 對話方塊中,展開 [專案] 節點,選取方案並檢查形式呈現專案。
移之前, 設定的方案平台,以符合您的電腦架構。這是必要條件封裝外掛程式,因為不支援 WoW64。請注意,在此情況下,我要部署到本機電腦,但建議也適用於在部署到次要的目標裝置。
編輯資訊清單由於那里所需的資訊清單的變更數目,我將直接編輯 Package.appxmanifest 檔案,而不是使用設計工具。在 [方案總管的應用程式節點下,以滑鼠右鍵按一下 Package.appxmanifest 檔案節點,並挑選檢視來編輯 XML 的程式碼。
開始加入 uap4 和 rescap 命名空間宣告並將後續的項目所需的別名:
<Package ...
xmlns:uap4="https://schemas.microsoft.com/appx/manifest/uap/windows10/4"
xmlns:rescap="https://schemas.microsoft.com/appx/manifest/foundation
/windows10/restrictedcapabilities"
IgnorableNamespaces="... uap4 rescap">
若要使封裝更容易找到偵錯期間,我將會從產生的 GUID 變更封裝名稱變得有意義:
<Identity Name="MyPackagedPlugin" Publisher="CN=msdn" Version="1.0.0.0" />
接下來,我要加入的 package\applications\application\extensions 元素,每個封裝外掛程式處理常式所需的應用程式擴充功能中所示圖 4。
圖 4 新增應用程式擴充功能
<Package ...><Applications><Application ...>
<Extensions>
<!--Foreground (in app) packaged plug-in handler app service and WDP provider-->
<uap:Extension
Category="windows.appService">
<uap:AppService Name="com.contoso.www.myapp" />
</uap:Extension>
<uap4:Extension
Category="windows.devicePortalProvider">
<uap4:DevicePortalProvider
DisplayName="MyPluginApp"
AppServiceName="com.contoso.www.myapp"
ContentRoute="/myapp/www/"
HandlerRoute="/myapp/API/" />
</uap4:Extension>
<!--Background packaged plug-in handler app service and WDP provider-->
<uap:Extension
Category="windows.appService"
EntryPoint="MyComponent.MyBackgroundHandler">
<uap:AppService Name="com.contoso.www.mycomponent" />
</uap:Extension>
<uap4:Extension
Category="windows.devicePortalProvider">
<uap4:DevicePortalProvider
DisplayName="MyPluginComponent"
AppServiceName="com.contoso.www.mycomponent"
HandlerRoute="/mycomponent/API/" />
</uap4:Extension>
</Extensions>
</Application></Applications></Package>
每個處理常式需要兩個擴充功能。應用程式服務延伸模組會提供 WDP 服務和 WDP 執行階段裝載的處理常式之間的啟動機制和通訊通道。依照慣例,AppServices 會使用反向網域名稱配置,來確保唯一性。如果實作應用程式服務的背景,EntryPoint 屬性是必要,並指定開始執行。如果實作前景應用程式服務,應用程式的 OnBackgroundActivated 方法開始執行,並省略 EntryPoint 屬性。
DevicePortalProvider 延伸模組提供 DevicePortalConnection 裝載的處理常式的組態資料。DevicePortalProvider 代表應用程式服務連接的用戶端提供 DevicePortalConnection URL 處理常式。AppServiceName 屬性必須對應於應用程式服務項目 (例如,com.contoso.www.myapp) 的名稱屬性。DevicePortalProvider 元素可以指定 ContentRoute 來服務靜態網頁內容。HandlerRoute 發送要求的 REST API 處理常式。或兩者。ContentRoute 和 HandlerRoute 必須是唯一的。如果是在與內建的 WDP 路由,或與先前註冊的封裝外掛程式路由路由衝突,外掛程式將無法載入,呈現適當的診斷訊息。此外,相對的 URL 必須對應至封裝下的相對路徑 ContentRoute 安裝資料夾 (例如 \myapp\www)。如需詳細資訊,請參閱 DevicePortalProvider 延伸模組規格 (bit.ly/2u1aqG8)。
最後,我要新增所需的 [我已封裝的功能外掛程式:
<Capabilities>
<Capability Name="privateNetworkClientServer" />
<rescap:Capability Name="devicePortalProvider" />
</Capabilities>
PrivateNetworkClientServer 功能可讓 HTTP。在 AppContainer 中 SYS 功能。在此示範中,我將會部署直接從 Visual Studio 到本機電腦執行的封裝。 不過,若要將產品上架應用程式存放區,您還需要取得的 devicePortalProvider 功能,限制為 Microsoft 合作夥伴。如需詳細資訊,請參閱文章 」 應用程式功能宣告 」 (bit.ly/2u7gHkt)。這些功能是 WDP 執行階段主應用程式封裝外掛程式所需的最低。隨插即用在增益集的處理常式程式碼可能需要額外的功能,根據通用 Windows 平台 Api,其所呼叫。
新增靜態內容 [下一步,我們來建立外掛程式的 [狀態] 頁面。頁面上,以及它所參考,任何其他靜態內容應該放在應用程式相對路徑,對應到保留給外掛程式的內容路由在此情況下,/myapp/www。在 [方案總管] 中,以滑鼠右鍵按一下您的應用程式的專案節點,然後選取 [加入 |新的資料夾。名稱資料夾 myapp。以滑鼠右鍵按一下 [新增的資料夾] 節點,然後再次選取 [加入 |新的資料夾,建立子資料夾名為 www。按 Ctrl + N,並在新檔案對話方塊中,選取 [一般] |HTML 網頁的範本。將此檔案儲存為 index.html 中,方案的 MyPackagedPlugin\MyApp\myapp\www 路徑下。然後將這個檔案加入專案的資料夾路徑,使它並包含封裝的內容。以滑鼠右鍵按一下新加入的 index.html 檔案節點,然後選取屬性。確認建置動作的預設屬性值:內容,並將複製到輸出目錄:請勿複製。
現在,加入所示的標記圖 5來新建 index.html。此頁面會示範幾件事。首先,請注意,內建 WDP 資源,例如 jquery.js 和 rest.js 文件庫中,可用來封裝外掛程式,以及。這可讓封裝將結合網域特有的功能與內建 WDP 功能的外掛程式。如需詳細資訊,請參閱文件的 < 裝置入口網站應用程式開發介面參考 > (bit.ly/2uFTTFD)。第二,請注意隨插即用中的 REST API 呼叫、 應用程式的 /myapp/API/status 和 /mycomponent/API/status 元件的參考。 這會顯示如何可以輕鬆地結合的隨插即用單元的靜態及動態內容。
圖 5 狀態網頁標記
<html>
<head>
<title>My Packaged Plug-in Page</title>
<script src="/js/rest.js"></script>
<script src="/js/jquery.js"></script>
<script type="text/javascript">
function InitPage() {
var webb = new WebbRest();
webb.httpGetExpect200("/myapp/API/status")
.done(function (response) {
$('#app_status')[0].innerText = response.status;
});
webb.httpGetExpect200("/mycomponent/API/status")
.done(function (response) {
$('#comp_status')[0].innerText = response.status;
});
}
</script>
</head>
<body onload="InitPage();">
<div style="font-size: x-large;">
My Packaged Plug-in Page
<br/><br/>
App Status: <span id="app_status" style="color:green"></span>
<br/>
Component Status: <span id="comp_status" style="color:green"></span>
</div>
</body>
</html>
新增 REST API 現在我將實作的 REST API 處理常式。如先前所述,選擇的進入點取決於是否背景或前景應用程式服務實作。如何取得連入的應用程式服務連接的次要差異,超過裝置入口網站連線實作是這兩種案例相同。首先,我會與應用程式的前景處理常式。
開啟原始程式檔 App.xaml.cs 並新增下列命名空間所需的每個處理常式:
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.System.Diagnostics.DevicePortal;
using Windows.Web.Http;
using Windows.Web.Http.Headers;
MyApp.App 類別定義中,我會將加入一些成員,以實作處理常式的狀態。 BackgroundTaskDeferral 延遲的背景工作完成的處理常式,該主機執行,並且 DevicePortalConnection 實作 WDP 服務本身的連接。
sealed partial class App : Application
{
private BackgroundTaskDeferral taskDeferral;
private DevicePortalConnection devicePortalConnection;
private static Uri statusUri = new Uri("/myapp/API/status", UriKind.Relative);
接下來,覆寫應用程式,具現化 DevicePortalConnection 以及訂閱事件,如中所示的背景啟動處理常式圖 6。
圖 6 實作 DevicePortalConnection
// Implement background task handler with a DevicePortalConnection
protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
// Take a deferral to allow the background task to continue executing
var taskInstance = args.TaskInstance;
this.taskDeferral = taskInstance.GetDeferral();
taskInstance.Canceled += TaskInstance_Canceled;
// Create a DevicePortal client from an AppServiceConnection
var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
var appServiceConnection = details.AppServiceConnection;
this.devicePortalConnection =
DevicePortalConnection.GetForAppServiceConnection(
appServiceConnection);
// Add handlers for RequestReceived and Closed events
devicePortalConnection.RequestReceived += DevicePortalConnection_RequestReceived;
devicePortalConnection.Closed += DevicePortalConnection_Closed;
}
此處理常式,我會尋找到 URI /myapp/API/status 與 JSON 結構,以回應要求中所示圖 7。更複雜的實作無法支援數個路由、 取得和文章區分、 檢查 URI 參數等等。
圖 7 處理要求
// RequestReceived handler demonstrating response construction, based on request
private void DevicePortalConnection_RequestReceived(
DevicePortalConnection sender,
DevicePortalConnectionRequestReceivedEventArgs args)
{
if (args.RequestMessage.RequestUri.AbsolutePath.ToString() ==
statusUri.ToString())
{
args.ResponseMessage.StatusCode = HttpStatusCode.Ok;
args.ResponseMessage.Content =
new HttpStringContent("{ \"status\": \"good\" }");
args.ResponseMessage.Content.Headers.ContentType =
new HttpMediaTypeHeaderValue("application/json");
}
else
{
args.ResponseMessage.StatusCode = HttpStatusCode.NotFound;
}
}
最後,處理關閉 DevicePortalConnection,直接與已關閉的事件,或間接的背景工作的取消作業中所示圖 8。
圖 8 關閉 DevicePortalConnection
// Complete the deferral if task is canceled or DevicePortal connection closed
private void Close()
{
this.devicePortalConnection = null;
this.taskDeferral.Complete();
}
private void TaskInstance_Canceled(IBackgroundTaskInstance sender,
BackgroundTaskCancellationReason reason)
{
Close();
}
private void DevicePortalConnection_Closed(DevicePortalConnection sender,
DevicePortalConnectionClosedEventArgs args)
{
Close();
}
實作元件專案的背景處理常式是前景範例幾乎完全相同。開啟原始程式檔 Class1.cs 並加入必要的命名空間,如前所述。元件命名空間內,實作 IBackgroundTask 函式和其所需的執行方法的類別取代產生的類別定義:
public sealed class MyBackgroundHandler : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// Implement as for foreground handler's OnBackgroundActivated...
}
}
Run 方法會直接使用 IBackgroundTaskInstance 參數值。前文提過前景處理常式取得此值,從 OnBackgroundActivated BackgroundActivatedEventArgs 參數的 TaskInstance 成員。取得 taskInstance 這項差異,除了實作方法是相同的兩個處理常式。從您的前景處理常式 App.xaml.cs 檔案中複製的剩餘的實作。
測試封裝外掛程式
部署外掛程式來測試您的外掛程式,您必須先部署它,透過 Visual Studio F5 部署或使用鬆散的.appx 檔 (透過 Visual Studio 專案 |存放區 |建立應用程式套件] 功能表)。我們將使用前者。MyApp 專案節點上按一下滑鼠右鍵,然後選取屬性。在專案屬性工作表中,選取 [偵錯] 索引標籤,然後啟用 [不要啟動核取方塊。
我建議您 RequestReceived 的事件處理常式中,且可能隨插即用在增益集的進入點中設定中斷點,您 BackgroundActivated 事件處理常式 」 或 「 執行方法覆寫。這將確認您的外掛程式時,是正確設定且已成功啟動您在下一節中進行測試。 現在,請按 F5 部署和偵錯您的應用程式。
在偵錯模式後部署您的封裝,WDP 執行 WDP 必須重新啟動,才能偵測到它。(以防您略過 WDP 簡介先前所述,您可能也需要確保可使用 WDP 安裝開發人員模式下套件)。這可藉由切換 [啟用裝置入口網站] 核取方塊設定應用程式的更新與安全性 |開發人員] 頁面中。不過,我要改為 WDP 服務偵錯模式執行為主控台應用程式。這可讓我看到 WDP 追蹤輸出,有助於疑難排解封裝的外掛程式設定及執行的問題時。WDP 服務設定為系統帳戶執行,而且這也是必要時在偵錯模式中執行 WDP。PsExec 公用程式,可用 PsTools suite 的一部分 (bit.ly/2tXiDf4),可協助您執行此作業。
首先,建立系統主控台中,系統管理員主控台內執行從 PsExec:
> psexec -d -i -s -accepteula cmd /k title SYSTEM Console - Careful!
此命令會啟動第二個主控台視窗,在系統帳戶內容中執行。一般來說,此視窗會使用舊版主控台中,並沒有提供新的主控台功能,例如調整大小、 文字選取範圍的增強功能和剪貼簿捷徑上的文字換行。如果您想要啟用這些功能,以系統的身分執行時,將下列儲存至登錄指令碼檔案 (例如,EnableNewConsoleForSystem.reg),然後執行它:
Windows Registry Editor Version 5.00
[HKEY_USERS\.DEFAULT\Console]
"ForceV2"=dword:00000001
在系統主控台中,在偵錯模式中執行 WDP 啟用清除和加密要求:
> webmanagement -debug -clearandssl
您應該會看到類似於輸出圖 9。 若要安全地終止 WDP 偵錯模式中,只要按下 Ctrl + C。這會維護您系統的主控台,所以您可以逐一查看的外掛程式開發。
圖 9 Windows 裝置入口網站,以偵錯模式
請注意追蹤輸出會使用各種詞彙: webmanagement WebB 和 WDP。這些存在由於歷史原因和不同子系統,是指但差異,可以略過。也請注意,在偵錯模式中執行會使用不同的組態執行為服務。例如,在偵錯模式中,預設授權預設會停用。這可避免需要輸入認證,並可防止自動 HTTPS 的重新導向,以簡化測試從瀏覽器或命令列公用程式。此外,連接埠皆已指派值 54321 和 54684。一般來說,桌面 WDP 服務會使用連接埠 50080 和 50443 (雖然這些內製作了,如果將動態指派隨機連接埠)。這可讓在偵錯模式中執行,而不會干擾 WDP 的實際執行模式 WDP 以服務方式執行。不過,它可能會變成 irksome 測試時,根據執行的 WDP 模式,在 Url 上切換連接埠號碼。如果是這樣,您可以使用-httpPort 和-httpsPort 命令列選項,以明確地設定連接埠號碼來比對實際執行模式。在此情況下,您必須確保 WDP 服務已關閉,以避免衝突。若要查看所有 WDP 命令列選項,請輸入:
> WebManagement.exe-?
追蹤輸出所示,數個內建外掛程式會自動載入 WDP 啟動的一部分。WDP 然後探索已部署的封裝與外掛程式的報告 「 找到 2 的套件 」 (更明確地說,具有兩個提供者的一個封裝)。第一個提供者描述的前景處理常式,並確認的靜態 ContentRoute URL 保留項目和其相對應的封裝檔案路徑和 REST HandlerRoute 對應。此時,WDP 建立來服務這些路由隨 HTTP 要求佇列且正等候要求。第二個提供者描述的背景處理常式,其指定只有 REST HandlerRoute。也可供商務項目。
我建議開發並測試您的外掛程式與極佳的命令列公用程式之前,所述 curl 執行外掛程式。更簡單的案例中,瀏覽器已足夠,但 curl 可以提供更細微的控制標頭、 驗證等。這項功能可以更輕鬆地啟用 WDP 加密、 驗證和 CSRF 防護選項時使用。在這些情況下,curl"-verbose"選項也可用於疑難排解。
圖 10示範要求前景處理常式的資源: 其狀態 REST API 和網頁。
圖 10 使用 Curl 測試
圖 11使用瀏覽器要求應用程式的 [狀態] 頁面會顯示,接著示範內嵌 REST API 呼叫。
圖 11 使用瀏覽器測試
隨插即用在增益集的路由至任何要求時,偵錯工具應該叫用進入點設定的中斷點。和 REST API 要求的具體來說,RequestReceived 事件處理常式中的中斷點應叫用。您應該也會看到確認中 WDP 診斷輸出的封裝啟動外掛程式。
疑難排解它很值得注意的幾個常見的錯誤,導致無法正確執行的處理常式:
- 資訊清單不相符,例如應用程式服務名稱或進入點
- 忽略新增應用程式的背景處理常式元件專案參考
- 部署封裝和服務之間的架構不相符
- 實作 IBackgroundTask 應用程式專案中,而不 Windows 執行階段元件
偵錯模式中執行時,WDP 將會提供特定的診斷訊息這些錯誤,有可能。三個啟用的外掛程式的嘗試失敗之後,WDP 會停用外掛程式該工作階段與診斷所示:
WDP Packaged Plugin: Disabling request queue after 3 failed attempts
您的封裝資訊清單或程式碼來進行修正,之後通常會需要重新啟動 WDP 重設計數器已停用並重新掃描封裝組態變更。
總結
Windows 裝置入口網站應用程式開發介面提供安全、 簡單的機制,來擴充您的 Windows 市集應用程式的診斷功能,與已封裝的外掛程式。未來的增強功能,此應用程式開發介面會整合封裝外掛程式 WDP UI 中,介紹 REST Api 來安裝和控制封裝的外掛程式,並展開可能已封裝的外掛程式的應用程式。
Scott Jones軟體工程師為適用於 Microsoft 應用程式平台和工具小組。
非常感謝下列 Microsoft 技術專家檢閱這篇文章: Hirsch Singhal