Partager via


Récupération de la réponse à partir d’un travail Upload-Reply

Un travail bits Upload-Reply, en plus de charger un fichier sur un serveur, examine également une URL de réponse envoyée dans le cadre de la réponse du serveur, puis suit automatiquement l’URL de réponse et télécharge une réponse à partir de celle-ci. Pour plus d’informations sur la valeur d’en-tête BITS-Reply-URL, consultez la documentation Ack for Fragment .

Définissez le type de travail comme BG_JOB_TYPE_UPLOAD_REPLY pour créer un travail de type Upload-Reply. Les données de réponse sont disponibles pour le client une fois que le travail est entré dans l’état BG_JOB_STATE_TRANSFERRED. Pour récupérer la réponse, appelez l’une des méthodes suivantes :

  • IBackgroundCopyJob2::GetReplyData

    Fournit une copie en mémoire des données de réponse. Utilisez cette méthode pour lire les données de réponse avant ou après l’appel de la méthode IBackgroundCopyJob::Complete . Si les données de réponse dépassent 1 Mo, l’application doit appeler la méthode IBackgroundCopyJob2::GetReplyFileName pour récupérer le nom du fichier de réponse et lire directement son contenu.

  • IBackgroundCopyJob2::GetReplyFileName

    Fournit le nom du fichier qui contient la réponse. Vous devez appeler la méthode IBackgroundCopyJob::Complete avant d’ouvrir et de lire le fichier de réponse ; le fichier de réponse n’est pas disponible pour le client tant que vous n’appelez pas la méthode Complete .

Appelez ces méthodes dans votre méthode IBackgroundCopyCallback::JobTransferred uniquement si la réponse est petite et peut être traitée rapidement afin de ne pas bloquer le thread de rappel. Si vous utilisez la notification en ligne de commande au lieu du rappel, passez l’identificateur de travail au fichier exécutable. Le fichier exécutable utilise l’identificateur de travail pour appeler la méthode Complete afin de rendre le fichier de réponse disponible.

Les exemples suivants montrent comment utiliser chaque méthode pour récupérer les données de réponse.

Utilisation de GetReplyData

L’exemple suivant montre comment récupérer les données de réponse à l’aide de la méthode IBackgroundCopyJob2::GetReplyData . L’exemple suppose que le pointeur d’interface IBackgroundCopyJob est valide, que le type du travail est upload-reply et que l’état du travail est 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.
}

Utilisation de GetReplyFileName

L’exemple suivant montre comment récupérer les données de réponse à l’aide de la méthode IBackgroundCopyJob2::GetReplyFileName . L’exemple suppose que le pointeur d’interface IBackgroundCopyJob est valide, que le type de travail est upload-reply et que l’état du travail est 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.
}