Compartir a través de


Recuperar la respuesta de un trabajo de Upload-Reply

Un trabajo de BITS Upload-Reply, además de cargar un archivo en un servidor, también examinará una dirección URL de respuesta enviada como parte de la respuesta del servidor y, a continuación, seguirá automáticamente la dirección URL de respuesta y descargará una respuesta de ella. Consulte la documentación de Ack for Fragment para obtener más detalles sobre el valor del encabezado BITS-Reply-URL.

Establezca el tipo de trabajo como BG_JOB_TYPE_UPLOAD_REPLY para crear un trabajo de tipo Upload-Reply. Los datos de respuesta están disponibles para el cliente después de que el trabajo entre en el estado BG_JOB_STATE_TRANSFERRED. Para recuperar la respuesta, llame a uno de los métodos siguientes:

  • IBackgroundCopyJob2::GetReplyData

    Proporciona una copia en memoria de los datos de respuesta. Use este método para leer los datos de respuesta antes o después de llamar al método IBackgroundCopyJob::Complete . Si los datos de respuesta superan los 1 MB, la aplicación debe llamar al método IBackgroundCopyJob2::GetReplyFileName para recuperar el nombre del archivo de respuesta y leer su contenido directamente.

  • IBackgroundCopyJob2::GetReplyFileName

    Proporciona el nombre del archivo que contiene la respuesta. Debe llamar al método IBackgroundCopyJob::Complete antes de abrir y leer el archivo de respuesta; el archivo de respuesta no está disponible para el cliente hasta que se llama al método Complete .

Llame a estos métodos en el método IBackgroundCopyCallback::JobTransferred solo si la respuesta es pequeña y se puede procesar rápidamente para no bloquear el subproceso de devolución de llamada. Si usa la notificación de línea de comandos en lugar de la devolución de llamada, pase el identificador de trabajo al archivo ejecutable. El archivo ejecutable usa el identificador de trabajo para llamar al método Complete para que el archivo de respuesta esté disponible.

En los ejemplos siguientes se muestra cómo usar cada método para recuperar los datos de respuesta.

Uso de GetReplyData

En el ejemplo siguiente se muestra cómo recuperar los datos de respuesta mediante el método IBackgroundCopyJob2::GetReplyData . En el ejemplo se supone que el puntero de interfaz IBackgroundCopyJob es válido, el tipo del trabajo es upload-reply y el estado del trabajo es 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.
}

Uso de GetReplyFileName

En el ejemplo siguiente se muestra cómo recuperar los datos de respuesta mediante el método IBackgroundCopyJob2::GetReplyFileName . En el ejemplo se supone que el puntero de interfaz IBackgroundCopyJob es válido, el tipo de trabajo es upload-reply y el estado del trabajo es 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.
}