Compartilhar via


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:

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.
}