다음을 통해 공유


Upload-Reply 작업에서 회신 검색

BITS Upload-Reply 작업은 서버에 파일을 업로드하는 것 외에도 서버 회신의 일부로 전송된 회신 URL을 검사한 다음 자동으로 회신 URL을 따르고 응답을 다운로드합니다. BITS-Reply-URL 헤더 값에 대한 자세한 내용은 조각용 Ack 설명서를 참조하세요.

작업 유형을 BG_JOB_TYPE_UPLOAD_REPLY 설정하여 Upload-Reply 형식 작업을 만듭니다. 응답 데이터는 작업이 BG_JOB_STATE_TRANSFERRED 상태가 된 후 클라이언트에서 사용할 수 있습니다. 회신을 검색하려면 다음 방법 중 하나를 호출합니다.

  • IBackgroundCopyJob2::GetReplyData

    회신 데이터의 메모리 내 복사본을 제공합니다. 이 메서드를 사용하여 IBackgroundCopyJob::Complete 메서드를 호출하기 전이나 후에 회신 데이터를 읽습니다. 회신 데이터가 1MB를 초과하는 경우 애플리케이션은 IBackgroundCopyJob2::GetReplyFileName 메서드를 호출하여 회신 파일의 이름을 검색하고 해당 내용을 직접 읽어야 합니다.

  • IBackgroundCopyJob2::GetReplyFileName

    회신이 포함된 파일의 이름을 제공합니다. 회신 파일을 열고 읽기 전에 IBackgroundCopyJob::Complete 메서드를 호출해야 합니다. Complete 메서드를 호출할 때까지 클라이언트에서 회신 파일을 사용할 수 없습니다.

회신이 작고 콜백 스레드를 차단하지 않도록 신속하게 처리할 수 있는 경우에만 IBackgroundCopyCallback::JobTransferred 메서드에서 이러한 메서드를 호출합니다. 콜백 대신 명령줄 알림을 사용하는 경우 작업 식별자를 실행 파일로 전달합니다. 실행 파일은 작업 식별자를 사용하여 Complete 메서드를 호출하여 회신 파일을 사용할 수 있도록 합니다.

다음 예제에서는 각 메서드를 사용하여 회신 데이터를 검색하는 방법을 보여 줍니다.

GetReplyData 사용

다음 예제에서는 IBackgroundCopyJob2::GetReplyData 메서드를 사용하여 회신 데이터를 검색하는 방법을 보여줍니다. 이 예제에서는 IBackgroundCopyJob 인터페이스 포인터가 유효하고, 작업 유형이 업로드-회신이고, 작업의 상태가 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.
}

GetReplyFileName 사용

다음 예제에서는 IBackgroundCopyJob2::GetReplyFileName 메서드를 사용하여 회신 데이터를 검색하는 방법을 보여줍니다. 이 예제에서는 IBackgroundCopyJob 인터페이스 포인터가 유효하고, 작업 유형이 업로드-회신이고, 작업의 상태가 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.
}