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

Un travail de Upload-Reply BITS, 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 du fragment ACK .

Définissez le type de travail en _ _ _ _ réponse à chargement de type de tâche BG 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 a passé à l’état de la _ tâche BG _ _ transféré. 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 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 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’avez pas appelé 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 de ligne de commande au lieu du rappel, transmettez l’identificateur de tâche au fichier exécutable. Le fichier exécutable utilise l’identificateur de tâche pour appeler la méthode complète 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 méthode ibackgroundcopyjob est valide, que le type du travail est upload-reply et que l’état de la tâche est un _ État de travail BG _ _ transféré.

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 part du principe que le pointeur d’interface méthode ibackgroundcopyjob est valide, que le type de travail est chargement-réponse et que l’état du travail est _ État du travail BG _ _ transféré.

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