Фоновые передачи

Используйте API фоновой передачи для надежного копирования файлов по сети. API фоновой передачи предоставляет расширенные функции отправки и скачивания, которые выполняются в фоновом режиме во время приостановки приложения и сохраняются после завершения работы приложения. API отслеживает состояние сети и автоматически приостанавливает и возобновляет передачу данных при потере подключения. Передачи данных учитывают функции Data Sense и Battery Sense, что означает, что загрузочная активность корректируется на основе текущего состояния подключения и уровня заряда батареи устройства. API идеально подходит для отправки и скачивания больших файлов с помощью HTTP(S). FTP также поддерживается, но только для скачивания.

Note

API-интерфейсы Windows.Networking.BackgroundTransfer — это API среда выполнения Windows (WinRT), которые работают как в настольных приложениях WinUI 3 (Windows App SDK), так и в приложениях UWP. Для фоновой передачи требуется идентификатор пакета; приложения без пакета не могут использовать этот API.

Фоновая передача выполняется отдельно от вызывающего приложения и в основном предназначена для долгосрочных операций передачи ресурсов, таких как видео, музыка и большие изображения. Для этих сценариев использование фоновой передачи важно, так как скачивание продолжает выполняться даже при приостановке приложения.

Если вы загружаете небольшие ресурсы, которые, вероятно, будут загружены быстро, следует использовать API HttpClient вместо Background Transfer.

Использование Windows.Networking.BackgroundTransfer

Как работает функция фоновой передачи данных?

Когда приложение использует фоновую передачу для запуска передачи, запрос настраивается и инициализируется с помощью объектов класса BackgroundDownloader или BackgroundUploader . Каждая операция передачи обрабатывается по отдельности системой и отделяется от вызывающего приложения. Информация о ходе выполнения доступна, если вы хотите показывать пользователю состояние в интерфейсе приложения, а приложение может приостанавливать, возобновлять, отменять или даже читать данные во время передачи. Способ обработки передачи системой способствует интеллектуальному использованию электроэнергии и предотвращает проблемы, которые могут возникнуть, когда подключенное приложение сталкивается с событиями, такими как приостановка приложения, завершение или внезапные изменения состояния сети.

Note

Из-за ограничений ресурсов на одно приложение у приложения не должно быть более 200 операций передачи данных (DownloadOperations + UploadOperations) в любой момент времени. Превышение этого ограничения может привести к тому, что очередь передачи данных приложения перейдёт в состояние, из которого невозможно восстановить её работу.

При запуске приложения необходимо вызвать AttachAsync во всех существующих объектах DownloadOperation и UploadOperation . Если этого не сделать, это приведет к утечке ресурсов, связанных с уже завершенными передачами, и в конечном итоге сделает использование функции Background Transfer бесполезным.

Выполнение запросов файлов с проверкой подлинности через фоновую передачу

Background Transfer предоставляет методы для поддержки учетных данных для базовой аутентификации на сервере и прокси-сервере, файлов cookie и использования настраиваемых HTTP-заголовков (с помощью SetRequestHeader) для каждой операции передачи данных.

Как эта функция адаптируется к изменениям состояния сети или непредвиденным завершением работы?

Функция фоновой передачи поддерживает согласованный интерфейс для каждой операции передачи при изменении состояния сети путем интеллектуального использования подключений и сведений о состоянии плана передачи данных оператора, предоставляемых функцией подключения . Чтобы определить поведение для разных сетевых сценариев, приложение задает политику затрат для каждой операции с помощью значений, определенных BackgroundTransferCostPolicy.

Например, политика затрат, определенная для операции, может указывать, что операция должна быть приостановлена автоматически, когда устройство использует лимитную сеть. Затем передача автоматически возобновляется (или перезапускается) при установке подключения к "неограниченной" сети. Дополнительные сведения о том, как сети определяются затратами, см. в разделе NetworkCostType.

Хотя функция фоновой передачи имеет собственные механизмы обработки изменений состояния сети, существуют и другие общие рекомендации по подключению к приложениям, подключенным к сети. Используйте API Windows.Networking.Connectivity для отслеживания состояния подключения и сведений о стоимости.

Note

Для приложений, работающих на мобильных устройствах, существуют функции, позволяющие пользователю отслеживать и ограничивать объем передаваемых данных на основе типа подключения, состояния роуминга и плана данных пользователя. Из-за этого фоновые передачи могут быть приостановлены на телефоне, даже если BackgroundTransferCostPolicy указывает, что передача должна продолжаться.

В следующей таблице указывается, когда фоновые передачи разрешены на телефоне для каждого значения BackgroundTransferCostPolicy , учитывая текущее состояние телефона. Класс ConnectionCost можно использовать для определения текущего состояния телефона.

Состояние устройства Только без ограничений Default Всегда
Подключено к Wi-Fi Allow Allow Allow
Лимитное подключение, не в роуминге, трафик в пределах лимита, ожидается, что он останется в этих пределах Deny Allow Allow
Лимитное подключение, не в роуминге, в пределах лимита данных, ожидается превышение лимита Deny Deny Allow
Лимитное подключение, роуминг, в пределах лимита трафика Deny Deny Allow
Лимитное подключение, лимит данных превышен. Это состояние возникает только тогда, когда пользователь включает параметр «Ограничить фоновую передачу данных» в интерфейсе «Контроль данных». Deny Deny Deny

Отправка файлов

При использовании фоновой передачи отправка представляет собой объект UploadOperation, который предоставляет ряд методов управления для перезапуска или отмены операции. События приложения (например, приостановка или завершение работы) и изменения сетевого подключения обрабатываются системой автоматически для каждой операции UploadOperation; отправка данных будет продолжаться во время приостановки приложения либо приостанавливаться и сохраняться после завершения работы приложения. Кроме того, при настройке свойства CostPolicy будет указано, будет ли ваше приложение запускать отправки, пока для подключения к Интернету используется лимитная сеть.

Следующие примеры пошагово покажут, как создать и инициализировать базовую загрузку, а также как перечислить и повторно восстановить операции, сохранённые из предыдущего сеанса приложения.

Отправка одного файла

Создание отправки файла начинается с BackgroundUploader. Этот класс используется для предоставления методов, позволяющих приложению настроить отправку перед созданием результирующей uploadOperation. В следующем примере показано, как это сделать с необходимыми объектами URI и StorageFile .

Определение файла и назначения для отправки

Прежде чем приступить к созданию UploadOperation, сначала необходимо определить URI-адрес местоположения, в которое будет выполняться отправка, а также файл, который будет загружен. В следующем примере значение uriString заполняется строкой из входных данных пользовательского интерфейса, а значение файла с помощью объекта StorageFile , возвращаемого операцией PickSingleFileAsync .

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 (file) используются BackgroundUploader для заполнения заголовка запроса и задания свойства SourceFile объектом StorageFile. Затем метод SetRequestHeader вызывается для вставки имени файла, предоставленного в виде строки, и свойства StorageFile.Name .

Наконец, BackgroundUploader создает UploadOperation (отправить).

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 = upload.startAsync().then(complete, error, progress);

За вызовом асинхронного метода следует then оператор, указывающий методы, определенные приложением, которые вызываются при возврате результата вызова асинхронного метода. Дополнительные сведения об этом шаблоне программирования см. в статье "Асинхронное программирование" в JavaScript с использованием обещаний.

Отправка нескольких файлов

Определение файлов и назначения для отправки

В сценарии с несколькими файлами, передаваемыми с помощью одного UploadOperation, процесс начинается, как правило, путем предоставления требуемых URI назначения и локальных сведений о файле. Как и в примере из предыдущего раздела, URI предоставляется конечным пользователем в виде строки, и FileOpenPicker также можно использовать, чтобы дать пользователю возможность указывать файлы через пользовательский интерфейс. Однако в этом сценарии приложение должно вместо этого вызвать метод PickMultipleFilesAsync , чтобы включить выбор нескольких файлов через пользовательский интерфейс.

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

Создание объектов для предоставленных параметров

В следующих двух примерах используется код, содержащийся в одном примере метода startMultipart, который был вызван в конце последнего шага. В учебных целях код в методе, создающий массив объектов BackgroundTransferContentPart, был отделён от кода, создающего результирующий объект UploadOperation.

Сначала строка URI, предоставленная пользователем, инициализируется как Uri. Затем выполняется перебор массива объектов IStorageFile (files), переданного в этот метод; каждый объект используется для создания нового объекта 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, заполненном всеми объектами BackgroundTransferContentPart , представляющими каждый IStorageFile для отправки, мы готовы вызвать CreateUploadAsync с помощью URI , чтобы указать, куда будет отправлен запрос.

        // 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. Далее мы определим функцию, которая перечисляет сохраненные операции и сохраняет их в нашем массиве. Обратите внимание, что метод load, вызываемый для повторного назначения callback-функций объекту UploadOperation, если эта операция сохраняется после завершения работы приложения, определён в классе 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 указывает, начнёт ли ваше приложение загрузку или продолжит её при использовании тарифицируемой сети для подключения к Интернету.

Если вы загружаете небольшие ресурсы, которые, вероятно, будут загружены быстро, следует использовать API HttpClient вместо Background Transfer.

В следующих примерах описывается создание и инициализация базовой загрузки, а также перечисление и повторная регистрация операций, сохраненных в предыдущем сеансе приложения.

Настройка и запуск скачивания файла фоновой передачи

В следующем примере показано, как строки, представляющие универсальный код ресурса (URI) и имя файла, можно использовать для создания объекта URI и storageFile , содержащего запрошенный файл. В этом примере новый файл автоматически помещается в предварительно определенное расположение. Кроме того, FileSavePicker можно использовать, чтобы пользователи могли указать, где сохранить файл на устройстве. Обратите внимание, что метод load, вызываемый для повторного назначения обратных вызовов объекту 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. Просмотр строки 17 из предыдущего примера кода:

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

За вызовом асинхронного метода следует оператор, указывающий методы, определенные приложением, которые вызываются при возврате результата вызова асинхронного метода. Дополнительные сведения об этом шаблоне программирования см. в статье "Асинхронное программирование" в 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. Далее мы определим функцию, которая перечисляет сохраненные операции и сохраняет их в нашем массиве. Обратите внимание, что метод load, вызываемый для повторного назначения обратных вызовов для сохранённого DownloadOperation, определён в примере 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 , чтобы зарегистрировать фоновую задачу. Обратите внимание, что несколько групп завершения задач могут использовать одну и ту же точку входа фоновой задачи, однако для каждой регистрации фоновой задачи можно указать только одну группу завершения.
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
    }
}

Задача после обработки — это обычная фоновая задача. Он является частью пула всех фоновых задач, и он подлежит той же политике управления ресурсами, что и все фоновые задачи.

Кроме того, обратите внимание, что после обработки обработчики завершения переднего плана не заменяются. Если в вашем приложении реализован обработчик завершения для переднего плана и приложение работает в момент завершения передачи файла, то будут вызваны как обработчик завершения для переднего плана, так и обработчик завершения для фонового режима. Порядок вызова задач переднего плана и фоновых задач не гарантирован. Если вы определяете оба, необходимо убедиться, что две задачи будут работать правильно и не вмешиваться друг в друга, если они выполняются одновременно.

Время ожидания запроса

Следует учитывать два основных сценария времени ожидания подключения.

  • При установлении нового подключения для передачи данных запрос на подключение отменяется, если подключение не удаётся установить в течение пяти минут.

  • После установки подключения сообщение HTTP-запроса, которое не получило ответ в течение двух минут, прерывается.

Примечание В любом случае, если есть подключение к Интернету, фоновая передача повторит запрос до трех раз. Если подключение к Интернету не обнаружено, дополнительные запросы будут ожидать, пока оно не будет обнаружено.

Руководство по отладке

Остановка сеанса отладки в Microsoft Visual Studio сравнима с закрытием приложения; Отправки PUT приостановлены, а отправка POST завершается. Даже при отладке приложение должно обнаруживать и затем перезапускать или отменять все сохранённые загрузки. Например, можно сделать так, чтобы приложение при запуске отменяло ранее перечисленные сохранённые операции отправки, если в этом сеансе отладки предыдущие операции больше не нужны.

При перечислении операций скачивания и отправки при запуске приложения во время сеанса отладки приложение может отменить их, если в рамках этого сеанса отладки предыдущие операции больше не представляют интереса. Обратите внимание, что при наличии Visual Studio обновлений проекта, таких как изменения манифеста приложения, а приложение удаляется и повторно развертывается, GetCurrentUploadsAsync не может перечислять операции, созданные с помощью предыдущего развертывания приложения.

При использовании фоновой передачи во время разработки может возникнуть ситуация, когда внутренние кэши активных и завершенных операций передачи могут выйти из синхронизации. Это может привести к невозможности запуска новых операций передачи или взаимодействия с существующими операциями и объектами BackgroundTransferGroup . В некоторых случаях попытка взаимодействия с существующими операциями может вызвать сбой. Этот результат может произойти, если свойству TransferBehavior присвоено значение Parallel. Эта проблема возникает только в определенных сценариях во время разработки и не применима к конечным пользователям приложения.

Четыре сценария с помощью Visual Studio могут вызвать эту проблему.

  • Вы создаете новый проект с тем же именем приложения, что и существующий проект, но на другом языке (например, вместо C++ — C#).
  • Вы изменяете целевую архитектуру (например, x86 на x64) в существующем проекте.
  • Вы изменяете культуру в существующем проекте (например, с нейтральной на en-US).
  • Вы добавляете или удаляете возможность в манифесте пакета (например, добавление корпоративной проверки подлинности) в существующем проекте.

Регулярное обслуживание приложений, включая обновления манифеста, которые добавляют или удаляют возможности, не активируют эту проблему при развертывании приложения конечным пользователем. Чтобы обойти эту проблему, полностью удалите все версии приложения и повторно разверните его с новым языком, архитектурой, региональными параметрами или возможностями. Это можно сделать с помощью начального экрана или с помощью PowerShell и командлета Remove-AppxPackage .

Исключения в Windows.Networking.BackgroundTransfer

Исключение возникает, если в конструктор объекта Windows.Foundation.Uri передается недопустимая строка универсального идентификатора ресурса (URI).

.NET: Тип Windows.Foundation.Uri отображается как System.Uri в C# и VB.

В C# и Visual Basic эту ошибку можно избежать с помощью класса System.Uri в .NET 4.5 и одного из методов System.Uri.TryCreate для проверки строки, полученной пользователем приложения до создания 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 . Для большинства ошибок проверки параметров возвращаемым значением HRESULT является E_INVALIDARG.

Важные API