バックグラウンド転送

バックグラウンド転送 API を使用して、ネットワーク経由でファイルを確実にコピーします。 バックグラウンド転送 API は、アプリの中断中にバックグラウンドで実行され、アプリの終了を超えて保持される高度なアップロードおよびダウンロード機能を提供します。 この API は、ネットワークの状態を監視し、接続が失われた場合に転送を自動的に中断および再開します。また、転送はデータセンス対応およびバッテリ検出対応でもあります。つまり、ダウンロード アクティビティは現在の接続とデバイスのバッテリ状態に基づいて調整されます。 この API は、HTTP(S) を使用して大きなファイルをアップロードおよびダウンロードするのに最適です。 FTP もサポートされていますが、ダウンロードに対してのみサポートされます。

Note

Windows.Networking.BackgroundTransfer API は、WinUI 3 (Windows アプリ SDK) デスクトップ アプリと UWP アプリで動作する Windows ランタイム (WinRT) API です。 バックグラウンド転送にはパッケージ ID が必要です。パッケージ化されていないアプリでは、この API を使用できません。

バックグラウンド転送は呼び出し元アプリとは別に実行され、主にビデオ、音楽、大きな画像などのリソースの長期的な転送操作用に設計されています。 これらのシナリオでは、アプリが中断された場合でもダウンロードが進行し続けるので、バックグラウンド転送の使用が不可欠です。

すぐに完了する可能性が高い小さなリソースをダウンロードする場合は、バックグラウンド転送の代わりに HttpClient API を使用する必要があります。

Windows.Networking.BackgroundTransfer を使用する

バックグラウンド転送機能のしくみ

アプリがバックグラウンド転送を使用して転送を開始する場合、要求は BackgroundDownloader クラス オブジェクトまたは BackgroundUploader クラス オブジェクトを使用して構成および初期化されます。 各転送操作は、システムによって個別に処理され、呼び出し元アプリとは別に処理されます。 進行状況情報は、アプリの UI でユーザーに状態を与える必要があり、転送の実行中にアプリがデータの一時停止、再開、取り消し、またはデータからの読み取りを行うことができる場合に使用できます。 システムによる転送の処理方法により、スマートな電力使用量が促進され、接続されているアプリでアプリの中断、終了、突然のネットワーク状態の変更などのイベントが発生したときに発生する可能性がある問題を防ぐことができます。

Note

アプリごとのリソースの制約により、アプリは、特定の時点で 200 を超える転送 (DownloadOperations + UploadOperations) を持つべきではありません。 この制限を超えると、アプリの転送キューが回復不能な状態になる可能性があります。

アプリケーションを起動するときは、既存のすべての DownloadOperation オブジェクトと UploadOperation オブジェクトで AttachAsync を呼び出す必要があります。 これを行わないと、既に完了した転送のリークが発生し、最終的にバックグラウンド転送機能の使用が役に立たなくなります。

バックグラウンド転送を使用した認証済みファイル要求の実行

バックグラウンド転送には、基本的なサーバーとプロキシの資格情報、Cookie、および転送操作ごとにカスタム HTTP ヘッダー ( SetRequestHeader 経由) の使用をサポートするメソッドが用意されています。

この機能は、ネットワーク状態の変更や予期しないシャットダウンにどのように適応しますか?

バックグラウンド転送機能は、接続機能によって提供される接続性とキャリア データプランの状態情報をインテリジェントに活用することで、ネットワーク状態の変化が発生したときに、転送操作ごとに一貫した エクスペリエンスを維持 します。 さまざまなネットワーク シナリオの動作を定義するために、アプリは BackgroundTransferCostPolicy で定義された値を使用して、各操作のコスト ポリシーを設定します。

たとえば、操作に対して定義されているコスト ポリシーは、デバイスが従量制課金ネットワークを使用している場合に、操作を自動的に一時停止する必要があることを示すことができます。 その後、"無制限" ネットワークへの接続が確立されると、転送が自動的に再開 (または再起動) されます。 ネットワークをコストで定義する方法の詳細については、「 NetworkCostType」を参照してください。

バックグラウンド転送機能には、ネットワーク状態の変更を処理するための独自のメカニズムがありますが、ネットワークに接続されたアプリの接続に関するその他の一般的な考慮事項があります。 詳細については 、「使用可能なネットワーク接続情報の活用 」を参照してください。

メモ モバイル デバイスで実行されているアプリの場合、ユーザーが接続の種類、ローミング状態、およびユーザーのデータ プランに基づいて転送されるデータの量を監視および制限できる機能があります。 このため、 BackgroundTransferCostPolicy が転送を続行する必要があることを示している場合でも、バックグラウンド転送が電話で一時停止される可能性があります。

次の表は、電話の現在の状態に基づいて、各 BackgroundTransferCostPolicy 値に対して電話でバックグラウンド転送が許可されるタイミングを示しています。 ConnectionCost クラスを使用して、電話機の現在の状態を確認できます。

デバイスの状態 制限なしのみ Default いつも
WiFi に接続されている 許可する 許可する 許可する
従量制課金接続、ローミングではない、データ上限内、引き続き上限内に収まる見込み Deny 許可する 許可する
従量制接続、ローミングではない、データ上限内、このままだと上限を超える見込み Deny Deny 許可する
従量制課金接続、ローミング、データ制限下 Deny Deny 許可する
従量制接続、データ上限を超えています。 この状態は、ユーザーが "Data Sense UI で背景データを制限する" を有効にした場合にのみ発生します。 Deny Deny Deny

ファイルのアップロード

バックグラウンド転送を使用する場合、アップロードは UploadOperation として存在し、操作の再開または取り消しに使用される多数の制御メソッドを公開します。 アプリ イベント (中断や終了など) と接続の変更は、 UploadOperation ごとにシステムによって自動的に処理されます。アップロードは、アプリの中断期間中に続行されるか、アプリの終了を超えて一時停止して保持されます。 さらに、 CostPolicy プロパティを設定すると、従量制課金ネットワークがインターネット接続に使用されている間にアプリがアップロードを開始するかどうかを示します。

次の例では、基本的なアップロードの作成と初期化、および前のアプリ セッションから永続化された操作を列挙して再導入する方法について説明します。

1 つのファイルのアップロード

アップロードの作成は BackgroundUploader で始まります。 このクラスは、結果の UploadOperation を作成する前にアプリでアップロードを構成できるようにするメソッドを提供するために使用されます。 次の例は、必要な Uri オブジェクトと StorageFile オブジェクトを使用してこれを行う方法を示しています。

アップロードのファイルと宛先を特定する

UploadOperation の作成を開始する前に、まずアップロード先の場所の URI とアップロードされるファイルを特定する必要があります。 次の例では、uriString 値は UI 入力からの文字列を使用して設定され、file 値は PickSingleFileAsync 操作によって返される StorageFile オブジェクトを使用して設定されます。

function uploadFile() {
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
    filePicker.fileTypeFilter.replaceAll(["*"]);

    filePicker.pickSingleFileAsync().then(function (file) {
        if (!file) {
            printLog("No file selected");
            return;
        }

        var upload = new UploadOp();
        var uriString = document.getElementById("serverAddressField").value;
        upload.start(uriString, file);

        // Store the upload operation in the uploadOps array.
        uploadOperations.push(upload);
    });
}

アップロード操作を作成して初期化する

前の手順では、 uriStringファイル の値が次の例の UploadOp のインスタンスに渡されます。このインスタンスは、新しいアップロード操作を構成して開始するために使用されます。 まず、 uriString を解析して、必要な Uri オブジェクトを作成します。

次に、指定された StorageFile (ファイル) のプロパティが BackgroundUploader によって使用され、要求ヘッダーが設定され 、SourceFile プロパティに StorageFile オブジェクトが設定されます。 SetRequestHeader メソッドが呼び出され、文字列として指定されたファイル名と StorageFile.Name プロパティが挿入されます。

最後に、 BackgroundUploader によって UploadOperation (upload) が作成されます。

function UploadOp() {
    var upload = null;
    var promise = null;

    this.start = function (uriString, file) {
        try {
        
            var uri = new Windows.Foundation.Uri(uriString);
            var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();

            // Set a header, so the server can save the file (this is specific to the sample server).
            uploader.setRequestHeader("Filename", file.name);

            // Create a new upload operation.
            upload = uploader.createUpload(uri, file);

            // Start the upload and persist the promise to be able to cancel the upload.
            promise = upload.startAsync().then(complete, error, progress);
        } catch (err) {
            displayError(err);
        }
    };
    // On application activation, reassign callbacks for a upload
    // operation persisted from previous application state.
    this.load = function (loadedUpload) {
        try {
            upload = loadedUpload;
            promise = upload.attachAsync().then(complete, error, progress);
        } catch (err) {
            displayError(err);
        }
    };
}

JavaScript Promise を使用して定義された非同期メソッド呼び出しに注意してください。 最後の例の行を見ると、次のようになります。

promise = upload.startAsync().then(complete, error, progress);

非同期メソッド呼び出しの後に、非同期メソッド呼び出しの結果が返されたときに呼び出される、アプリによって定義されたメソッドを示す then ステートメントが続きます。 このプログラミング パターンの詳細については、「Promise を 使用した JavaScript での非同期プログラミング」を参照してください。

複数のファイルのアップロード

アップロードのファイルと宛先を特定する

1 つの UploadOperation で転送された複数のファイルを含むシナリオでは、プロセスは通常と同じように、最初に必要な宛先 URI とローカル ファイル情報を指定することによって開始されます。 前のセクションの例と同様に、URI はエンド ユーザーによって文字列として提供され 、FileOpenPicker を使用して、ユーザー インターフェイスを介してファイルを示す機能も提供できます。 ただし、このシナリオでは、アプリは代わりに PickMultipleFilesAsync メソッドを呼び出して、UI を介して複数のファイルを選択できるようにする必要があります。

function uploadFiles() {
       var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
       filePicker.fileTypeFilter.replaceAll(["*"]);

       filePicker.pickMultipleFilesAsync().then(function (files) {
          if (files === 0) {
             printLog("No file selected");
                return;
          }

          var upload = new UploadOperation();
          var uriString = document.getElementById("serverAddressField").value;
          upload.startMultipart(uriString, files);

          // Persist the upload operation in the global array.
          uploadOperations.push(upload);
       });
    }

指定されたパラメーターのオブジェクトを作成する

次の 2 つの例では、最後の手順の最後に呼び出された 1 つのサンプル メソッド startMultipart に含まれるコードを使用します。 命令のために、 BackgroundTransferContentPart オブジェクトの配列を作成するメソッド内のコードは、結果の UploadOperation を作成するコードから分割されています。

まず、ユーザーによって提供される URI 文字列が URI として初期化されます。 次に、このメソッドに渡される IStorageFile オブジェクト (ファイル) の配列を反復処理し、各オブジェクトを使用して新しい BackgroundTransferContentPart オブジェクトを作成し、 contentParts 配列に配置します。

    upload.startMultipart = function (uriString, files) {
        try {
            var uri = new Windows.Foundation.Uri(uriString);
            var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();

            var contentParts = [];
            files.forEach(function (file, index) {
                var part = new Windows.Networking.BackgroundTransfer.BackgroundTransferContentPart("File" + index, file.name);
                part.setFile(file);
                contentParts.push(part);
            });

マルチパート アップロード操作を作成して初期化する

contentParts 配列には、アップロード用の各 IStorageFile を表す BackgroundTransferContentPart オブジェクトがすべて設定されており、Uri を使用して CreateUploadAsync を呼び出して、要求の送信先を示す準備ができました。

        // Create a new upload operation.
            uploader.createUploadAsync(uri, contentParts).then(function (uploadOperation) {

               // Start the upload and persist the promise to be able to cancel the upload.
               upload = uploadOperation;
               promise = uploadOperation.startAsync().then(complete, error, progress);
            });

         } catch (err) {
             displayError(err);
         }
     };

中断されたアップロード操作の再開

UploadOperation の完了または取り消し時に、関連するすべてのシステム リソースが解放されます。 ただし、これらの処理のいずれかが発生する前にアプリが終了した場合、アクティブな操作はすべて一時停止され、それぞれに関連付けられているリソースは占有されたままになります。 これらの操作が列挙されず、次のアプリ セッションに再導入された場合、操作は完了せず、引き続きデバイス リソースが占有されます。

  1. 永続化された操作を列挙する関数を定義する前に、 返される UploadOperation オブジェクトを含む配列を作成する必要があります。

    var uploadOperations = [];
    
  2. 次に、永続化された操作を列挙し、それらを配列に格納する関数を定義します。 コールバックを UploadOperation に再割り当てするために呼び出される load メソッドは、アプリの終了を通じて保持される場合は、このセクションで後述する UploadOp クラスに含まれる点に注意してください。

    function Windows.Networking.BackgroundTransfer.BackgroundUploader.getCurrentUploadsAsync() {
        .then(function (uploads) {
            for (var i = 0; i < uploads.size; i++) {
                var upload = new UploadOp();
                upload.load(uploads[i]);
                uploadOperations.push(upload);
            }
        }
    };
    

ファイルのダウンロード

バックグラウンド転送を使用する場合、各ダウンロードは DownloadOperation として存在し、操作の一時停止、再開、再起動、取り消しに使用されるさまざまな制御メソッドを公開します。 アプリ イベント (中断や終了など) と接続の変更は、 DownloadOperation ごとにシステムによって自動的に処理されます。ダウンロードは、アプリの中断期間中に続行されるか、アプリの終了を超えて一時停止して保持されます。 モバイル ネットワークのシナリオでは、 CostPolicy プロパティを設定すると、従量制課金ネットワークがインターネット接続に使用されている間にアプリのダウンロードを開始するか続行するかを示します。

すぐに完了する可能性が高い小さなリソースをダウンロードする場合は、バックグラウンド転送の代わりに HttpClient API を使用する必要があります。

次の例では、基本的なダウンロードの作成と初期化、および前のアプリ セッションから永続化された操作を列挙して再導入する方法について説明します。

バックグラウンド転送ファイルのダウンロードを構成して開始する

次の例では、URI とファイル名を表す文字列を使用して、要求されたファイルを含む Uri オブジェクトと StorageFile を作成する方法を示します。 この例では、新しいファイルは定義済みの場所に自動的に配置されます。 または、 FileSavePicker を使用すると、ユーザーはデバイスにファイルを保存する場所を指定できます。 コールバックを DownloadOperation に再割り当てするために呼び出される読み込みメソッドは、アプリの終了時に保持される場合は、このセクションで後述する DownloadOp クラスにあります。

function DownloadOp() {
    var download = null;
    var promise = null;
    var imageStream = null;

    this.start = function (uriString, fileName) {
        try {
            // Asynchronously create the file in the pictures folder.
            Windows.Storage.KnownFolders.picturesLibrary.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).done(function (newFile) {
                var uri = Windows.Foundation.Uri(uriString);
                var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();

                // Create a new download operation.
                download = downloader.createDownload(uri, newFile);

                // Start the download and persist the promise to be able to cancel the download.
                promise = download.startAsync().then(complete, error, progress);
            }, error);
        } catch (err) {
            displayException(err);
        }
    };
    // On application activation, reassign callbacks for a download
    // operation persisted from previous application state.
    this.load = function (loadedDownload) {
        try {
            download = loadedDownload;
            printLog("Found download: " + download.guid + " from previous application run.<br\>");
            promise = download.attachAsync().then(complete, error, progress);
        } catch (err) {
            displayException(err);
        }
    };
}

JavaScript Promise を使用して定義された非同期メソッド呼び出しに注意してください。 前のコード例の 17 行目を見てみましょう。

promise = download.startAsync().then(complete, error, progress);

非同期メソッド呼び出しの後には、非同期メソッド呼び出しの結果が返されたときに呼び出される、アプリによって定義されたメソッドを示す then ステートメントが続きます。 このプログラミング パターンの詳細については、「Promise を 使用した JavaScript での非同期プログラミング」を参照してください。

操作制御メソッドの追加

追加の DownloadOperation メソッドを実装することで、コントロールのレベルを上げることができます。 たとえば、上記の例に次のコードを追加すると、ダウンロードを取り消す機能が導入されます。

// Cancel download.
this.cancel = function () {
    try {
        if (promise) {
            promise.cancel();
            promise = null;
            printLog("Canceling download: " + download.guid + "<br\>");
            if (imageStream) {
                imageStream.close();
            }
        }
        else {
            printLog("Download " + download.guid + " already canceled.<br\>");
        }
    } catch (err) {
        displayException(err);
    }
};

起動時の永続化された操作の列挙

DownloadOperation の完了または取り消し時に、関連するすべてのシステム リソースが解放されます。 ただし、これらのイベントのいずれかが発生する前にアプリが終了した場合、ダウンロードは一時停止し、バックグラウンドで保持されます。 次の例では、永続化されたダウンロードを新しいアプリ セッションに再導入する方法を示します。

  1. 永続化された操作を列挙する関数を定義する前に、 返される DownloadOperation オブジェクトを含む配列を作成する必要があります。

    var downloadOps = [];
    
  2. 次に、永続化された操作を列挙し、それらを配列に格納する関数を定義します。 永続化された DownloadOperation のコールバックを再割り当てするために呼び出される load メソッドは、このセクションで後述する DownloadOp の例にあります。

    // Enumerate outstanding downloads.
    Windows.Networking.BackgroundTransfer.BackgroundDownloader.getCurrentDownloadsAsync().done(function (downloads) {
    
        for (var i = 0; i < downloads.size; i++) {
            var download = new DownloadOp();
            download.load(downloads[i]);
            downloadOps.push(download);
        }
    });
    
  3. 設定されたリストを使用して、保留中の操作を再開できるようになりました。

後処理

Windows 10の新機能は、アプリが実行されていない場合でも、バックグラウンド転送の完了時にアプリケーション コードを実行する機能です。 たとえば、アプリが起動するたびにアプリで新しい映画をスキャンするのではなく、映画のダウンロードが完了した後に使用可能な映画の一覧を更新することが必要な場合があります。 または、別のサーバーまたはポートを使用して、失敗したファイル転送を処理したい場合があります。 成功した転送と失敗した転送の両方に対して後処理が呼び出されるため、それを使用してカスタム エラー処理と再試行ロジックを実装できます。

後処理では、既存のバックグラウンド タスク インフラストラクチャが使用されます。 バックグラウンド タスクを作成し、転送を開始する前に転送に関連付けます。 転送はバックグラウンドで実行され、完了するとバックグラウンド タスクが呼び出されて後処理が実行されます。

後処理では、新しいクラス BackgroundTransferCompletionGroup が使用されます。 このクラスは、バックグラウンド転送をグループ化できる点で既存の BackgroundTransferGroup に似ていますが、 BackgroundTransferCompletionGroup では、転送が完了したときに実行するバックグラウンド タスクを指定する機能が追加されます。

バックグラウンド転送は、次のように後処理で開始します。

  1. BackgroundTransferCompletionGroup オブジェクトを作成します。 次に、 BackgroundTaskBuilder オブジェクトを作成します。 ビルダー オブジェクトの Trigger プロパティを完了グループ オブジェクトに設定し、ビルダーの TaskEntryPoint プロパティを、転送完了時に実行するバックグラウンド タスクのエントリ ポイントに設定します。 最後に、 BackgroundTaskBuilder.Register メソッドを呼び出して、バックグラウンド タスクを登録します。 多くの完了グループは、1 つのバックグラウンド タスク エントリ ポイントを共有できますが、バックグラウンド タスク登録ごとに完了グループを 1 つだけ持つことができます。
var completionGroup = new BackgroundTransferCompletionGroup();
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();

builder.Name = "MyDownloadProcessingTask";
builder.SetTrigger(completionGroup.Trigger);
builder.TaskEntryPoint = "Tasks.BackgroundDownloadProcessingTask";

BackgroundTaskRegistration downloadProcessingTask = builder.Register();
  1. 次に、バックグラウンド転送を完了グループに関連付けます。 すべての転送が作成されたら、完了グループを有効にします。
BackgroundDownloader downloader = new BackgroundDownloader(completionGroup);
DownloadOperation download = downloader.CreateDownload(uri, file);
Task<DownloadOperation> startTask = download.StartAsync().AsTask();

// App still sees the normal completion path
startTask.ContinueWith(ForegroundCompletionHandler);

// Do not enable the CompletionGroup until after all downloads are created.
downloader.CompletionGroup.Enable();
  1. バックグラウンド タスクのコードは、トリガーの詳細から操作の一覧を抽出し、コードは各操作の詳細を検査し、各操作に対して適切な後処理を実行できます。
public class BackgroundDownloadProcessingTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
    var details = (BackgroundTransferCompletionGroupTriggerDetails)taskInstance.TriggerDetails;
    IReadOnlyList<DownloadOperation> downloads = details.Downloads;

    // Do post-processing on each finished operation in the list of downloads
    }
}

後処理タスクは、通常のバックグラウンド タスクです。 これはすべてのバックグラウンド タスクのプールの一部であり、すべてのバックグラウンド タスクと同じリソース管理ポリシーの対象となります。

また、後処理ではフォアグラウンド完了ハンドラーは置き換えされないことに注意してください。 アプリでフォアグラウンド完了ハンドラーが定義されていて、ファイル転送が完了したときにアプリが実行されている場合は、フォアグラウンド完了ハンドラーとバックグラウンド完了ハンドラーの両方が呼び出されます。 フォアグラウンド タスクとバックグラウンド タスクの呼び出し順序は保証されません。 両方を定義する場合は、2 つのタスクが正常に動作し、同時に実行されている場合は相互に干渉しないようにする必要があります。

要求のタイムアウト

考慮すべき主な接続タイムアウト シナリオは 2 つあります。

  • 転送用の新しい接続を確立するときに、接続要求が 5 分以内に確立されていない場合、接続要求は中止されます。

  • 接続が確立されると、2 分以内に応答を受信していない HTTP 要求メッセージが中止されます。

メモ どちらのシナリオでも、インターネット接続があると仮定すると、バックグラウンド転送は要求を最大 3 回自動的に再試行します。 インターネット接続が検出されない場合、追加のリクエストは接続が検出されるまで待機します。

デバッグ ガイダンス

Microsoft Visual Studioでのデバッグ セッションの停止は、アプリを閉じるのと同等です。PUT アップロードが一時停止され、POST アップロードが終了します。 デバッグ中でも、アプリは列挙してから、永続化されたアップロードを再開または取り消す必要があります。 たとえば、そのデバッグ セッションの以前の操作に関心がない場合は、アプリの起動時に列挙された永続化されたアップロード操作を取り消すことができます。

デバッグ セッション中にアプリの起動時にダウンロード/アップロードを列挙する際に、そのデバッグ セッションの以前の操作に関心がない場合は、アプリにキャンセルさせることができます。 アプリ マニフェストの変更など、Visual Studioプロジェクトの更新プログラムがあり、アプリをアンインストールして再デプロイした場合、GetCurrentUploadsAsync は、前のアプリの展開を使用して作成された操作を列挙できないことに注意してください。

開発中にバックグラウンド転送を使用すると、アクティブな転送操作と完了した転送操作の内部キャッシュが同期から外れる場合があります。これにより、新しい転送操作を開始できないか、既存の操作や BackgroundTransferGroup オブジェクトと対話できなくなる可能性があります。 場合によっては、既存の操作と対話しようとするとクラッシュが発生することがあります。 この結果は、 TransferBehavior プロパティが Parallel に設定されている場合に発生する可能性があります。 この問題は、開発中の特定のシナリオでのみ発生し、アプリのエンド ユーザーには適用されません。

Visual Studioを使用する 4 つのシナリオで、この問題が発生する可能性があります。

  • 既存のプロジェクトと同じアプリ名を持つ新しいプロジェクトを作成しますが、言語は異なります (C++ から C# など)。
  • 既存のプロジェクトでターゲット アーキテクチャを (たとえば x86 から x64 に) 変更します。
  • 既存のプロジェクトでカルチャを (たとえば、ニュートラルから en-USに) 変更します。
  • 既存のプロジェクトのパッケージ マニフェスト ( エンタープライズ認証の追加など) で機能を追加または削除します。

機能を追加または削除するマニフェスト更新プログラムを含む通常のアプリ サービスでは、アプリのエンド ユーザーの展開ではこの問題はトリガーされません。 この問題を回避するには、アプリのすべてのバージョンを完全にアンインストールし、新しい言語、アーキテクチャ、カルチャ、または機能を使用して再デプロイします。 これは、 スタート 画面、または PowerShell と Remove-AppxPackage コマンドレットを使用して行うことができます。

Windows.Networking.BackgroundTransfer の例外

Uniform Resource Identifier (URI) として無効な文字列が Windows.Foundation.Uri オブジェクトのコンストラクターに渡されると、例外がスローされます。

.NET:Windows。Foundation.Uri 型は、C# および VB で System.Uri として表示されます。

C# と Visual Basic では、このエラーは、.NET 4.5 の System.Uri クラスと System.Uri.TryCreate メソッドの 1 つを使用して、URI が構築される前にアプリ ユーザーから受信した文字列をテストすることで回避できます。

C++ では、文字列を URI に解析しようとするメソッドはありません。 アプリが Windows.Foundation.Uri を生成するための入力をユーザーから受け取る場合、コンストラクターの呼び出しは try/catch ブロックで囲む必要があります。 例外が発生した場合、アプリはユーザーに通知し、新しいホスト名の入力を求めることができます。

Windows.Networking.backgroundTransfer 名前空間には便利なヘルパー メソッドがあり、エラー処理には Windows.Networking.Sockets 名前空間の列挙型を使用します。 これは、アプリで特定のネットワーク例外を異なる方法で処理する場合に役立ちます。

Windows.Networking.backgroundTransfer 名前空間の非同期メソッドで発生したエラーは、HRESULT 値として返されます。 BackgroundTransferError.GetStatus メソッドは、ネットワーク エラーをバックグラウンド転送操作から WebErrorStatus 列挙値に変換するために使用されます。 ほとんどの WebErrorStatus 列挙値は、ネイティブ HTTP または FTP クライアント操作によって返されるエラーに対応します。 アプリは、特定の WebErrorStatus 列挙値をフィルター処理して、例外の原因に応じてアプリの動作を変更できます。

パラメーター検証エラーの場合、アプリは例外の HRESULT を使用して、例外の原因となったエラーの詳細を確認することもできます。 使用可能な HRESULT 値は、 Winerror.h ヘッダー ファイルに一覧表示されます。 ほとんどのパラメーター検証エラーでは、返される HRESULTE_INVALIDARG

重要な API