Recuperando a resposta de um trabalho de upload-reply
Um trabalho de Upload-Reply do BITS, além de carregar um arquivo em um servidor, também examinará uma URL de resposta enviada como parte da resposta do servidor e, em seguida, seguirá automaticamente a URL de resposta e baixará uma resposta dela. Consulte a documentação do Ack for Fragment para obter mais detalhes sobre o valor do cabeçalho BITS-Reply-URL.
Defina o tipo de trabalho como BG_JOB_TYPE_UPLOAD_REPLY para criar um trabalho do tipo Upload-Reply. Os dados de resposta ficam disponíveis para o cliente depois que o trabalho entra no estado BG_JOB_STATE_TRANSFERRED. Para recuperar a resposta, chame um dos seguintes métodos:
IBackgroundCopyJob2::GetReplyData
Fornece uma cópia na memória dos dados de resposta. Use esse método para ler os dados de resposta antes ou depois de chamar o método IBackgroundCopyJob::Complete . Se os dados de resposta excederem 1 MB, o aplicativo deverá chamar o método IBackgroundCopyJob2::GetReplyFileName para recuperar o nome do arquivo de resposta e ler seu conteúdo diretamente.
IBackgroundCopyJob2::GetReplyFileName
Fornece o nome do arquivo que contém a resposta. Você deve chamar o método IBackgroundCopyJob::Complete antes de abrir e ler o arquivo de resposta, o arquivo de resposta não estará disponível para o cliente até que você chame o método Complete.
Chame esses métodos em seu método IBackgroundCopyCallback::JobTransferred somente se a resposta for pequena e puder ser processada rapidamente para não bloquear o thread de retorno de chamada. Se você usar a notificação de linha de comando em vez do retorno de chamada, passe o identificador de trabalho para o arquivo executável. O arquivo executável usa o identificador de trabalho para chamar o método Complete para disponibilizar o arquivo de resposta.
Os exemplos a seguir mostram como usar cada método para recuperar os dados de resposta.
Usando GetReplyData
O exemplo a seguir mostra como recuperar os dados de resposta usando o método IBackgroundCopyJob2::GetReplyData. O exemplo assume que o ponteiro da interface IBackgroundCopyJob é válido, o tipo do trabalho é upload-reply e o estado do trabalho é 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.
}
Usando GetReplyFileName
O exemplo a seguir mostra como recuperar os dados de resposta usando o método IBackgroundCopyJob2::GetReplyFileName. O exemplo assume que o ponteiro da interface IBackgroundCopyJob é válido, o tipo de trabalho é upload-reply e o estado do trabalho é 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.
}