Abrufen der Antwort aus einem Upload-Reply Auftrag
Ein BITS-Upload-Reply Auftrag überprüft zusätzlich zum Hochladen einer Datei auf einen Server auch eine Antwort-URL, die als Teil der Serverantwort gesendet wird, und folgt dann automatisch der Antwort-URL und lädt eine Antwort daraus herunter. Weitere Informationen zum Bits-Reply-URL-Headerwert finden Sie in der Dokumentation zu Ack for Fragment .
Legen Sie den Auftragstyp als BG_JOB_TYPE_UPLOAD_REPLY fest, um einen Upload-Reply-Typauftrag zu erstellen. Die Antwortdaten stehen dem Client zur Verfügung, nachdem der Auftrag in den BG_JOB_STATE_TRANSFERRED Zustand wechselt. Um die Antwort abzurufen, rufen Sie eine der folgenden Methoden auf:
IBackgroundCopyJob2::GetReplyData
Stellt eine In-Memory-Kopie der Antwortdaten bereit. Verwenden Sie diese Methode, um die Antwortdaten vor oder nach dem Aufruf der IBackgroundCopyJob::Complete-Methode zu lesen. Wenn die Antwortdaten 1 MB überschreiten, muss die Anwendung die IBackgroundCopyJob2::GetReplyFileName-Methode aufrufen, um den Namen der Antwortdatei abzurufen und deren Inhalt direkt zu lesen.
IBackgroundCopyJob2::GetReplyFileName
Gibt den Namen der Datei an, die die Antwort enthält. Sie müssen die IBackgroundCopyJob::Complete-Methode aufrufen, bevor Sie die Antwortdatei öffnen und lesen. Die Antwortdatei ist erst für den Client verfügbar, wenn Sie die Complete-Methode aufrufen.
Rufen Sie diese Methoden in Ihrer IBackgroundCopyCallback::JobTransferred-Methode nur auf, wenn die Antwort klein ist und schnell verarbeitet werden kann, um den Rückrufthread nicht zu blockieren. Wenn Sie anstelle des Rückrufs die Befehlszeilenbenachrichtigung verwenden, übergeben Sie den Auftragsbezeichner an die ausführbare Datei. Die ausführbare Datei verwendet den Auftragsbezeichner, um die Complete-Methode aufzurufen, um die Antwortdatei verfügbar zu machen.
In den folgenden Beispielen wird gezeigt, wie die einzelnen Methoden zum Abrufen der Antwortdaten verwendet werden.
Verwenden von GetReplyData
Das folgende Beispiel zeigt, wie Die Antwortdaten mithilfe der IBackgroundCopyJob2::GetReplyData-Methode abgerufen werden . Im Beispiel wird davon ausgegangen, dass der IBackgroundCopyJob-Schnittstellenzeiger gültig ist, der Typ des Auftrags upload-reply ist und der Status des Auftrags BG_JOB_STATE_TRANSFERRED ist.
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.
}
Verwenden von GetReplyFileName
Das folgende Beispiel zeigt, wie Die Antwortdaten mithilfe der IBackgroundCopyJob2::GetReplyFileName-Methode abgerufen werden. Im Beispiel wird davon ausgegangen, dass der IBackgroundCopyJob-Schnittstellenzeiger gültig ist, der Auftragstyp upload-reply ist und der Status des Auftrags BG_JOB_STATE_TRANSFERRED ist.
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.
}