Получение ответа из задания Upload-Reply
Задание BITS Upload-Reply, помимо отправки файла на сервер, также будет проверять URL-адрес ответа, отправленный в рамках ответа сервера, а затем автоматически следовать URL-адресу ответа и скачать ответ. Дополнительные сведения о значении заголовка BITS-Reply-URL см. в документации об акк для фрагмента .
Задайте тип задания как BG_JOB_TYPE_UPLOAD_REPLY для создания задания типа Upload-Reply. Данные ответа становятся доступны клиенту после перехода задания в состояние BG_JOB_STATE_TRANSFERRED. Чтобы получить ответ, вызовите один из следующих методов:
IBackgroundCopyJob2::GetReplyData
Предоставляет копию данных ответа в памяти. Используйте этот метод для чтения данных ответа до или после вызова метода IBackgroundCopyJob::Complete. Если данные ответа превышают 1 МБ, приложение должно вызвать метод IBackgroundCopyJob2::GetReplyFileName, чтобы получить имя файла ответа и прочитать его содержимое напрямую.
IBackgroundCopyJob2::GetReplyFileName
Предоставляет имя файла, содержащего ответ. Перед открытием и чтением файла ответа необходимо вызвать метод IBackgroundCopyJob::Complete; Файл ответа недоступен клиенту, пока не вызовете метод Complete.
Вызовите эти методы в методе IBackgroundCopyCallback::JobTransferred только в том случае, если ответ мал и может быть обработан быстро, чтобы не блокировать поток обратного вызова. Если вы используете уведомление командной строки вместо обратного вызова, передайте идентификатор задания в исполняемый файл. Исполняемый файл использует идентификатор задания для вызова метода Complete, чтобы сделать файл ответа доступным.
В следующих примерах показано, как использовать каждый метод для получения данных ответа.
Использование GetReplyData
В следующем примере показано, как получить данные ответа с помощью метода IBackgroundCopyJob2::GetReplyData. В примере предполагается, что указатель интерфейсаIBackgroundCopyJob является допустимым, тип задания является отправкой и ответом, а состояние задания — BG_JOB_STATE_TRANSFERRED.
HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
BYTE* pReply = NULL;
UINT64 ReplySize;
//Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob2
//interface pointer. The IBackgroundCopyJob2 interface contains the GetReplyData method.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
if (SUCCEEDED(hr))
{
hr = pJob2->GetReplyData(&pReply, &ReplySize);
if (S_OK == hr))
{
if (pReply)
{
//Do something with the data.
CoTaskMemFree(pReply);
}
else
{
//The server application did not return a reply.
}
}
else if (BG_E_TOO_LARGE == hr)
{
//The reply exceeds 1 MB. To retrieve the reply, get the reply file name,
//complete the job, open the reply file, and read the reply.
}
else
{
//Handle the error
}
pJob2->Release(); //When done, release the interface.
}
else
{
//Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
//running on the computer is less than BITS 1.5.
}
Использование GetReplyFileName
В следующем примере показано, как получить данные ответа с помощью метода IBackgroundCopyJob2::GetReplyFileName. В примере предполагается, что указатель интерфейсаIBackgroundCopyJob действителен, тип задания — отправка и ответ, а состояние задания — BG_JOB_STATE_TRANSFERRED.
HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
WCHAR* pszFileName = NULL;
//Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob2
//interface pointer. The IBackgroundCopyJob2 interface contains the GetReplyFileName method.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
if (SUCCEEDED(hr))
{
hr = pJob2->GetReplyFileName(&pszFileName);
if (SUCCEEDED(hr))
{
//Calling the Complete method removes the job from the queue,
//so make sure you maintain an interface pointer to this job
//or retrieve any job related information that you require
//when processing the reply.
hr = pJob->Complete();
//Open, read the file, and do something with the data.
CoTaskMemFree(pszFileName);
}
pJob2->Release(); //When done, release the interface.
}
else
{
//Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
//running on the computer is less than BITS 1.5.
}