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

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

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

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

Состояние устройства НеограниченныйOnly По умолчанию. Всегда
Подключение в Wi-Fi Разрешить Разрешить Разрешить
Лимитное Подключение, а не перемещаемое, в соответствии с ограничением данных на трассе, чтобы оставаться под ограничением Запрет Разрешить Разрешить
Лимитное Подключение, не перемещаемое, в соответствии с ограничением данных для отслеживания превышения предела Запрет Запрет Разрешить
Лимитное Подключение, роуминг, в пределах ограничения данных Запрет Запрет Разрешить
Лимитное Подключение, превышение предела данных. Это состояние возникает только в том случае, если пользователь включает "Ограничить фоновые данные в пользовательском интерфейсе "Чувство данных". Запрет Запрет Запрет

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

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

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

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

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

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

Прежде чем начать создание UploadOperation, сначала необходимо определить универсальный код ресурса (URI) расположения для отправки, а также файл, который будет отправлен. В следующем примере значение uriString заполняется строкой из входных данных пользовательского интерфейса, а значение файла с помощью объекта служба хранилища File, возвращаемого операцией 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.

Затем свойства предоставленного служба хранилища File (file) используются BackgroundUploader для заполнения заголовка запроса и задания свойства SourceFile объектом служба хранилища File. Затем метод SetRequestHeader вызывается для вставки имени файла, предоставленного в виде строки, и свойства служба хранилища File.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). Затем массив объектов I служба хранилища File (файлы), передаваемых этому методу, выполняется итерация, каждый объект используется для создания нового объекта 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, представляющими каждый I служба хранилища File для отправки, мы готовы вызвать 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. Далее мы определим функцию, которая перечисляет сохраненные операции и сохраняет их в нашем массиве. Обратите внимание, что метод загрузки, вызываемый для повторного назначения обратных вызовов в 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.

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

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

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

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

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

В 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