共用方式為


報告Service Manager

Bing Ads .NET、JAVA 和 Python SDK 提供類別,以加速下載效能報告記錄的生產力。 例如, ReportingServiceManager 會將您的下載要求提交至 Reporting 服務、輪詢服務直到完成,然後將檔案下載到本機目錄。 ReportingServiceManager也會為您處理一般要求標頭欄位,允許為每個服務指定AuthorizationData物件中的AuthenticationCustomerIdAccountIdDeveloperToken屬性一次。 如需詳細資訊,請 參閱使用 AuthorizationData報表要求 程式碼範例。

注意事項

ReportingServiceManager僅適用于 Bing Ads .NET、JAVA 和 Python SDK。 無論您是否使用 SDK,都可以直接使用 Reporting 服務 。 如需詳細資訊,請 參閱要求和下載報表

報表檔案讀取器

您不需要實作自己的檔案剖析器即可讀取報表檔案。 您可以使用 ReportFileReader 物件,將 CSV 檔案讀入 報表 容器。

注意事項

當您下載實體而非檔案時, ReportingServiceManager 會在背景中使用 ReportFileReader 。 暫存檔會在背景中使用。 如需詳細資訊,請 參閱 Working Directory 和 ReportingServiceManager

讓我們使用下列 CSV 檔案作為範例。 例如,假設您想要從檔案讀取下列報表。

"Report Name: My Keyword Performance Report"
"Report Time: 2/7/2020"
"Time Zone: (GMT-08:00) Pacific Time (US & Canada); Tijuana"
"Last Completed Available Day: 2/8/2020 10:15:00 PM (GMT)"
"Last Completed Available Hour: 2/8/2020 10:15:00 PM (GMT)"
"Report Aggregation: Summary"
"Report Filter: "
"Potential Incomplete Data: true"
"Rows: 5"

"AccountId","CampaignId","Keyword","KeywordId","DeviceType","Clicks"
"YourAccountId","YourCampaignId","red shoes","123","Computer","35"
"YourAccountId","YourCampaignId","red shoes","123","Smartphone","50"
"YourAccountId","YourCampaignId","shoes delivered","234","Computer","1"
"YourAccountId","YourCampaignId","shoe sale","345","Computer","80"
"YourAccountId","YourCampaignId","shoe sale","345","Smartphone","5"

"@2020 Microsoft Corporation. All rights reserved. "

只要提供 ReportFileReader 與檔案路徑和檔案名即可。 然後在完成讀取時關閉檔案。

ReportFileReader reportFileReader = new ReportFileReader(
    ResultFileName,
    ReportFormat.Csv
);
Report report = reportFileReader.GetReport();
IEnumerable<IReportRecord> reportRecordIterable = reportContainer.GetReportRecords();
report.Dispose();
ReportFileReader reportFileReader = new ReportFileReader(
    ResultFileName,
    ReportFormat.CSV
);
Report report = reportFileReader.getReport();
Iterable<ReportRecord> reportRecords = report.getReportRecords();
report.close();
report_file_reader = ReportFileReader(
    file_path=result_file_name, 
    format='Csv'
)
report_container=report_file_reader.get_report()
report_record_iterable=report_container.report_records
report_container.close()

In-Memory 報表容器

報表是記憶體內部容器,可擷取下載之報表檔案的內容,包括標頭中繼資料、資料行名稱和報表記錄。 透過這些更新,您可以將更多心力放在應用程式的商務需求上,而不是剖析報表檔案。

您可以透過 ReportingServiceManager 來存取記憶體中的報表容器,方法是提交新的下載要求,或使用 ReportFileReader 從您已下載的報表檔案讀取。

例如,您可以透過 ReportingServiceManager 提交新的下載要求來取得 Report 物件。 雖然在此情況下,您不會直接使用檔案,但實際上會將要求提交至 Reporting 服務,並將報表檔案下載到本機目錄。 報告下載參數包括要求的報表類型、範圍、時間週期,以及本機下載檔案路徑。

// The ReportRequest is a ReportRequest object defined by the Reporting API.
var reportingDownloadParameters = new ReportingDownloadParameters
{
    ReportRequest = reportRequest,
    ResultFileDirectory = FileDirectory,
    ResultFileName = ResultFileName,
    OverwriteResultFile = true,
};

Report reportContainer = await ReportingServiceManager.DownloadReportAsync(
    reportingDownloadParameters,
    CancellationToken.None
);
// The ReportRequest is a ReportRequest object defined by the Reporting API.
ReportingDownloadParameters reportingDownloadParameters = new ReportingDownloadParameters();
reportingDownloadParameters.setReportRequest(reportRequest);
reportingDownloadParameters.setResultFileDirectory(new File(FileDirectory));
reportingDownloadParameters.setResultFileName(ResultFileName);
reportingDownloadParameters.setOverwriteResultFile(true);

Report reportContainer = ReportingServiceManager.downloadReportAsync(
    reportingDownloadParameters, 
    null
).get(); 
# The report_request is a ReportRequest object defined by the Reporting API.
reporting_download_parameters = ReportingDownloadParameters(
    report_request=report_request,
    result_file_directory = FILE_DIRECTORY, 
    result_file_name = DOWNLOAD_FILE_NAME, 
    overwrite_result_file = True
)

report_container = reporting_service_manager.download_report(
    reporting_download_parameters=reporting_download_parameters
)

否則,如果您已經有透過 API 下載的報表檔案,您可以透過 ReportFileReader 取得 Report 物件。

ReportFileReader reader = new ReportFileReader(
    "c:\\reports\\result.csv",
    ReportFormat.Csv
);
Report reportContainer = reader.GetReport();
ReportFileReader reader = new ReportFileReader(
    reportingDownloadParameters.getResultFileDirectory() + "\\" + reportingDownloadParameters.getResultFileName(), 
    reportingDownloadParameters.getReportRequest().getFormat()
);
Report reportContainer = reader.getReport();
report_file_reader = ReportFileReader(
    file_path=reporting_download_parameters.result_file_directory + reporting_download_parameters.result_file_name, 
    format=reporting_download_parameters.report_request.Format
)
report_container = report_file_reader.get_report()

一旦您透過上述任一工作流程擁有 Report 物件,就可以存取中繼資料和報表記錄。 如果您提交的活動和日期沒有報表資料,則下載結果會是 Null 或空白。

// Output the report metadata

long recordCount = reportContainer.ReportRecordCount;
Console.WriteLine(string.Format("ReportName: {0}", reportContainer.ReportName));
Console.WriteLine(string.Format("ReportTimeStart: {0}", reportContainer.ReportTimeStart));
Console.WriteLine(string.Format("ReportTimeEnd: {0}", reportContainer.ReportTimeEnd));
Console.WriteLine(string.Format("LastCompletedAvailableDate: {0}", reportContainer.LastCompletedAvailableDate.ToString()));
Console.WriteLine(string.Format("ReportAggregation: {0}", reportContainer.ReportAggregation.ToString()));
Console.WriteLine(string.Format("ReportColumns: {0}", string.Join("; ", reportContainer.ReportColumns)));
Console.WriteLine(string.Format("ReportRecordCount: {0}", recordCount));

// Analyze and output performance statistics

IEnumerable<IReportRecord> reportRecordIterable = reportContainer.GetReportRecords();
            
int totalImpressions = 0;
int totalClicks = 0;
HashSet<string> distinctDevices = new HashSet<string>();
HashSet<string> distinctNetworks = new HashSet<string>();
foreach (IReportRecord record in reportContainer.GetReportRecords())
{
    totalImpressions += record.GetIntegerValue("Impressions");
    totalClicks += record.GetIntegerValue("Clicks");
    distinctDevices.Add(record.GetStringValue("DeviceType"));
    distinctNetworks.Add(record.GetStringValue("Network"));
}

Console.WriteLine(string.Format("Total Impressions: {0}", totalImpressions));
Console.WriteLine(string.Format("Total Clicks: {0}", totalClicks));
Console.WriteLine(string.Format("Average Impressions: {0}", totalImpressions * 1.0 / recordCount));
Console.WriteLine(string.Format("Average Clicks: {0}", totalClicks * 1.0 / recordCount));
Console.WriteLine(string.Format("Distinct Devices: {0}", string.Join("; ", distinctDevices)));
Console.WriteLine(string.Format("Distinct Networks: {0}", string.Join("; ", distinctNetworks)));

// Be sure to close the report before you attempt to clean up files within the working directory.

reportContainer.Dispose();
// Output the reportRequest metadata

java.lang.Long recordCount = reportContainer.getReportRecordCount();
outputStatusMessage(String.format("ReportName: %s", reportContainer.getReportName()));
outputStatusMessage(String.format("ReportTimeStart: %s", reportContainer.getReportTimeStart()));
outputStatusMessage(String.format("ReportTimeEnd: %s", reportContainer.getReportTimeEnd()));
outputStatusMessage(String.format("LastCompletedAvailableDate: %s", reportContainer.getLastCompletedAvailableDate().toString()));
outputStatusMessage(String.format("ReportAggregation: %s", enumCaseToPascalCase(reportContainer.getReportAggregation().toString())));
outputStatusMessage(String.format("ReportColumns: %s", String.join("; ", reportContainer.getReportColumns())));
outputStatusMessage(String.format("ReportRecordCount: %s", recordCount));

// Analyze and output performance statistics

if(Arrays.asList(reportContainer.getReportColumns()).contains("Impressions")){
    Iterable<ReportRecord> reportRecordIterable = reportContainer.getReportRecords();

    int totalImpressions = 0;
    int totalClicks = 0;
    HashSet<String> distinctDevices = new HashSet<>();
    HashSet<String> distinctNetworks = new HashSet<>();
    for (ReportRecord record : reportRecordIterable)
    {
        totalImpressions += record.getIntegerValue("Impressions");
        totalClicks += record.getIntegerValue("Clicks");
        distinctDevices.add(record.getStringValue("DeviceType"));
        distinctNetworks.add(record.getStringValue("Network"));
    }

    outputStatusMessage(String.format("Total Impressions: %s", totalImpressions));
    outputStatusMessage(String.format("Total Clicks: %s", totalClicks));
    outputStatusMessage(String.format("Average Impressions: %s", totalImpressions * 1.0 / recordCount));
    outputStatusMessage(String.format("Average Clicks: %s", totalClicks * 1.0 / recordCount));
    outputStatusMessage(String.format("Distinct Devices: %s", String.join("; ", distinctDevices)));
    outputStatusMessage(String.format("Distinct Networks: %s", String.join("; ", distinctNetworks)));
}       

// Be sure to close the reportRequest before you attempt to clean up files within the working directory.

reportContainer.close();
# Output the reportRequest metadata
record_count = report_container.record_count
output_status_message("ReportName: {0}".format(report_container.report_name))
output_status_message("ReportTimeStart: {0}".format(report_container.report_time_start))
output_status_message("ReportTimeEnd: {0}".format(report_container.report_time_end))
output_status_message("LastCompletedAvailableDate: {0}".format(report_container.last_completed_available_date))
output_status_message("ReportAggregation: {0}".format(report_container.report_aggregation))
output_status_message("ReportColumns: {0}".format("; ".join(str(column) for column in report_container.report_columns)))
output_status_message("ReportRecordCount: {0}".format(record_count))

#Analyze and output performance statistics

if "Impressions" in report_container.report_columns and \
    "Clicks" in report_container.report_columns and \
    "DeviceType" in report_container.report_columns and \
    "Network" in report_container.report_columns:

    report_record_iterable = report_container.report_records

    total_impressions = 0
    total_clicks = 0
    distinct_devices = set()
    distinct_networks = set()
    for record in report_record_iterable:
        total_impressions += record.int_value("Impressions")
        total_clicks += record.int_value("Clicks")
        distinct_devices.add(record.value("DeviceType"))
        distinct_networks.add(record.value("Network"))

    output_status_message("Total Impressions: {0}".format(total_impressions))
    output_status_message("Total Clicks: {0}".format(total_clicks))
    output_status_message("Average Impressions: {0}".format(total_impressions * 1.0 / record_count))
    output_status_message("Average Clicks: {0}".format(total_clicks * 1.0 / record_count))
    output_status_message("Distinct Devices: {0}".format("; ".join(str(device) for device in distinct_devices)))
    output_status_message("Distinct Networks: {0}".format("; ".join(str(network) for network in distinct_networks)))

#Be sure to close the report.

report_container.close()

下載

ReportingServiceManager支援彈性的報表下載工作流程。

使用 ReportingServiceManager 完成背景

您可以建立下載要求, ReportingServiceManager 會將您的下載要求提交至 Reporting 服務、輪詢服務直到完成,然後將檔案下載到本機目錄。

public async Task RunAsync(AuthorizationData authorizationData)
{
    ReportingServiceManager reportingServiceManager = new ReportingServiceManager(authorizationData);

    var reportRequest = GetCampaignPerformanceReportRequest(authorizationData.AccountId);

    var reportingDownloadParameters = new ReportingDownloadParameters
    {
        ReportRequest = reportRequest,
        ResultFileDirectory = FileDirectory,
        ResultFileName = ResultFileName,
        OverwriteResultFile = true,
    };

    // Sets the time interval in milliseconds between two status polling attempts. The default value is 5000 (5 seconds).
    reportingServiceManager.StatusPollIntervalInMilliseconds = 5000;
    // Sets the timeout of the HttpClient download operation. The default value is 100000 (100s).
    reportingServiceManager.DownloadHttpTimeout = new TimeSpan(0, 0, 100);

    // You may optionally cancel the DownloadFileAsync operation after a specified time interval. 
    // Pass this object to the DownloadFileAsync operation or specify CancellationToken.None. 
    var tokenSource = new CancellationTokenSource();
    tokenSource.CancelAfter(3600000);

    // The ReportingServiceManager will submit your download request to the Reporting service, 
    // poll the service until completed, and download the file to your local directory.

    var resultFilePath = await reportingServiceManager.DownloadFileAsync(
        parameters: reportingDownloadParameters, 
        cancellationToken: tokenSource.Token
    );
    Console.WriteLine(string.Format("Download result file: {0}\n", resultFilePath));
}
ReportingServiceManager reportingServiceManager = new ReportingServiceManager(authorizationData);

ReportRequest reportRequest = getCampaignPerformanceReportRequest();

ReportingDownloadParameters reportingDownloadParameters = new ReportingDownloadParameters();
reportingDownloadParameters.setReportRequest(reportRequest);
reportingDownloadParameters.setResultFileDirectory(new File(FileDirectory));
reportingDownloadParameters.setResultFileName(ResultFileName);
reportingDownloadParameters.setOverwriteResultFile(true);

// Sets the time interval in milliseconds between two status polling attempts. The default value is 5000 (5 seconds).
reportingServiceManager.setStatusPollIntervalInMilliseconds(5000);
// Sets the timeout of the HttpClient download operation. The default value is 100000 (100s).
reportingServiceManager.setDownloadHttpTimeoutInMilliseconds(100000);

// The ReportingServiceManager will submit your download request to the Reporting service, 
// poll the service until completed, and download the file to your local directory. 
// You may optionally cancel the downloadFileAsync operation after a specified time interval.
File resultFile = reportingServiceManager.downloadFileAsync(
    reportingDownloadParameters, 
    null
).get(3600000, TimeUnit.MILLISECONDS);

System.out.println(String.format("Download result file: %s\n", resultFile.getName()));
reporting_service_manager=ReportingServiceManager(
    authorization_data=authorization_data, 
    # Sets the time interval in milliseconds between two status polling attempts. 
    # The default value is 5000 (5 seconds).
    poll_interval_in_milliseconds=5000, 
    environment=ENVIRONMENT,
)

report_request=get_keyword_report_request()

reporting_download_parameters = ReportingDownloadParameters(
    report_request=report_request,
    result_file_directory = FILE_DIRECTORY, 
    result_file_name = DOWNLOAD_FILE_NAME, 
    overwrite_result_file = True, # Set this value true if you want to overwrite the same file.
    timeout_in_milliseconds=3600000 # You may optionally cancel the download after a specified time interval.
)

# The ReportingServiceManager will submit your download request to the Reporting service, 
# poll the service until completed, and download the file to your local directory.
result_file_path = reporting_service_manager.download_file(
    reporting_download_parameters=reporting_download_parameters
)
print("Download result file: {0}\n".format(result_file_path))

使用 ReportingServiceManager 提交和下載

提交下載要求,然後使用 ReportingDownloadOperation 結果,使用 GetStatusAsync 自行追蹤狀態。

public async Task RunAsync(AuthorizationData authorizationData)
{
    ReportingService = new ReportingServiceManager(authorizationData);

    var reportRequest = GetCampaignPerformanceReportRequest(authorizationData.AccountId);

    var reportingDownloadOperation = await ReportingService.SubmitDownloadAsync(reportRequest);

    // You may optionally cancel the TrackAsync operation after a specified time interval. 
    var tokenSource = new CancellationTokenSource();
    tokenSource.CancelAfter(3600000);

    var reportingDownloadOperation = await ReportingService.SubmitDownloadAsync(reportRequest);

    ReportingOperationStatus reportingOperationStatus = await reportingDownloadOperation.TrackAsync(tokenSource.Token);

    var resultFilePath = await reportingDownloadOperation.DownloadResultFileAsync(
        FileDirectory,
        ResultFileName,
        decompress: true,
        overwrite: true  // Set this value true if you want to overwrite the same file.
    );   

    Console.WriteLine(string.Format("Download result file: {0}\n", resultFilePath));
}
ReportingServiceManager = new ReportingServiceManager(authorizationData);

ReportRequest reportRequest = getCampaignPerformanceReportRequest();

ReportingDownloadOperation reportingDownloadOperation = ReportingServiceManager.submitDownloadAsync(
    reportRequest,
    null
).get();

// You may optionally cancel the trackAsync operation after a specified time interval.
ReportingOperationStatus reportingOperationStatus = reportingDownloadOperation.trackAsync(
    null
).get(3600000, TimeUnit.MILLISECONDS);

File resultFile = reportingDownloadOperation.downloadResultFileAsync(
    new File(FileDirectory),
    ResultFileName,
    true, // Set this value to true if you want to decompress the ZIP file.
    true,  // Set this value true if you want to overwrite the named file.
    null
).get();

System.out.println(String.format("Download result file: %s\n", resultFile.getName()));
reporting_service_manager=ReportingServiceManager(
    authorization_data=authorization_data, 
    poll_interval_in_milliseconds=5000, 
    environment=ENVIRONMENT,
)

# In addition to ReportingServiceManager, you will need a reporting ServiceClient 
# to build the ReportRequest.

reporting_service=ServiceClient(
    'ReportingService', 
    version=13,
    authorization_data=authorization_data, 
    environment=ENVIRONMENT,
)

report_request=get_keyword_report_request()

reporting_download_operation = reporting_service_manager.submit_download(report_request)

# You may optionally cancel the track() operation after a specified time interval.
reporting_operation_status = reporting_download_operation.track(timeout_in_milliseconds=3600000)
    
result_file_path = reporting_download_operation.download_result_file(
    result_file_directory = FILE_DIRECTORY, 
    result_file_name = DOWNLOAD_FILE_NAME, 
    decompress = True, 
    overwrite = True,  # Set this value true if you want to overwrite the same file.
    timeout_in_milliseconds=3600000 # You may optionally cancel the download after a specified time interval.
)
    
print("Download result file: {0}\n".format(result_file_path))

使用 ReportingServiceManager 下載結果

如果基於任何原因,您必須從先前的應用程式狀態繼續,您可以使用現有的下載要求識別碼,並使用它來下載結果檔案。 使用 TrackAsync 指出應用程式應該等候以確保下載狀態已完成。

public async Task RunAsync(AuthorizationData authorizationData)
{
    ReportingService = new ReportingServiceManager(authorizationData);

    // You may optionally cancel the TrackAsync operation after a specified time interval. 
    var tokenSource = new CancellationTokenSource();
    tokenSource.CancelAfter(3600000);

    var reportingDownloadOperation = new ReportingDownloadOperation(RequestIdGoesHere, authorizationData);

    // Use TrackAsync to indicate that the application should wait to ensure that 
    // the download status is completed.
    var reportingOperationStatus = await reportingDownloadOperation.TrackAsync(tokenSource.Token);

    var resultFilePath = await reportingDownloadOperation.DownloadResultFileAsync(
        FileDirectory,
        ResultFileName,
        decompress: true,
        overwrite: true   // Set this value true if you want to overwrite the same file.
    );   

    Console.WriteLine(string.Format("Download result file: {0}", resultFilePath));
    Console.WriteLine(string.Format("Status: {0}", reportingOperationStatus.Status));
    Console.WriteLine(string.Format("TrackingId: {0}\n", reportingOperationStatus.TrackingId));
}
java.lang.String requestId = RequestIdGoesHere;

ReportingDownloadOperation reportingDownloadOperation = new ReportingDownloadOperation(
    requestId, 
    authorizationData
);

reportingDownloadOperation.setStatusPollIntervalInMilliseconds(5000);

// You can use trackAsync to poll until complete as shown here, 
// or use custom polling logic with getStatusAsync.

// You may optionally cancel the trackAsync operation after a specified time interval.
ReportingOperationStatus reportingOperationStatus = reportingDownloadOperation.trackAsync(
    null
).get(3600000, TimeUnit.MILLISECONDS);

File resultFile = reportingDownloadOperation.downloadResultFileAsync(
    new File(FileDirectory),
    ResultFileName,
    true, // Set this value to true if you want to decompress the ZIP file
    true,  // Set this value true if you want to overwrite the named file.
    null
).get();

System.out.println(String.format("Download result file: %s", resultFile.getName()));
System.out.println(String.format("Status: %s", reportingOperationStatus.getStatus()));
System.out.println(String.format("TrackingId: %s\n", reportingOperationStatus.getTrackingId()));
reporting_download_operation = ReportingDownloadOperation(
    request_id = RequestIdGoesHere, 
    authorization_data=authorization_data, 
    poll_interval_in_milliseconds=5000, 
    environment=ENVIRONMENT,
)

# Use track() to indicate that the application should wait to ensure that 
# the download status is completed.
# You may optionally cancel the track() operation after a specified time interval.
reporting_operation_status = reporting_download_operation.track(timeout_in_milliseconds=3600000)
    
result_file_path = reporting_download_operation.download_result_file(
    result_file_directory = FILE_DIRECTORY, 
    result_file_name = DOWNLOAD_FILE_NAME, 
    decompress = True, 
    overwrite = True,  # Set this value true if you want to overwrite the same file.
    timeout_in_milliseconds=3600000 # You may optionally cancel the download after a specified time interval.
) 

print("Download result file: {0}".format(result_file_path))
print("Status: {0}\n".format(reporting_operation_status.status))

輪詢和重試

ReportingServiceManager會在前五次嘗試的 1000 毫秒間隔內自動輪詢,而且無法設定該行為。 StatusPollIntervalInMilliseconds屬性會決定在初始五次嘗試之後,每個輪詢嘗試之間的時間間隔。 如需範例,請參閱上方 的背景完成 。 預設值為 5000,因此如果您未設定此值, ReportingServiceManager 會依下列順序輪詢:1、2、3、4、5、10、15、20 等等。 如果您將此值設定為 10000,ReportingServiceManager 會依下列順序輪詢:1、2、3、4、5、15、25、35 等等。 最小輪詢間隔為 1000,如果您指定小於 1000 的值,則會擲回例外狀況。

ReportingServiceManager會自動重試下載和輪詢作業,最多可達您指定的逾時持續時間上限。 您可以設定重試逾時持續時間上限。 如果未指定逾時, ReportingServiceManager 會繼續重試,直到伺服器傳回逾時或內部錯誤為止。 另外,如果您要下載大型檔案,您應該考慮設定 DownloadHttpTimeout 屬性。

工作目錄和 ReportingServiceManager

使用 Bing 廣告 .NET 和 JAVA SDK,您可以設定 ReportingServiceManager 應該儲存暫存報表檔案的工作目錄。 例如,當您下載報表容器時,雖然您只會使用 Report 物件,但報表檔案會下載到工作目錄。 如果未指定另一個工作目錄,則會使用系統臨時目錄。

如果您使用如 Microsoft Azure 的託管服務,您會想要確保不會超過臨時目錄限制。 使用自訂工作目錄可能還有其他原因。 您可以藉由設定WorkingDirectory屬性,為每個ReportingServiceManager實例指定不同的工作目錄。 您也必須負責建立和移除任何目錄。

重要事項

反復查看報表記錄之後,您可以從工作目錄清除檔案。 CleanupTempFiles方法會移除工作目錄內 (的所有檔案,但不會移除任何子目錄) ,無論這些檔案是否由目前的ReportingServiceManager實例所建立。

ReportingServiceManager reportingServiceManager = new ReportingServiceManager(
    authorizationData: authorizationData, 
    apiEnvironment: environment
);

var reportRequest = GetReportRequest(authorizationData.AccountId);

var reportingDownloadParameters = new ReportingDownloadParameters
{
    ReportRequest = reportRequest,
    ResultFileDirectory = FileDirectory,
    ResultFileName = ResultFileName,
    OverwriteResultFile = true,
};

// The system temp directory will be used if another working directory is not specified. If you are 
// using a hosted service such as Microsoft Azure you'll want to ensure you do not exceed the file or directory limits. 
// You can specify a different working directory for each ReportingServiceManager instance.

reportingServiceManager.WorkingDirectory = FileDirectory;

// You can get a Report object by submitting a new download request via ReportingServiceManager. 
// Although in this case you won't work directly with the file, under the covers a request is 
// submitted to the Reporting service and the report file is downloaded to a local directory. 

Report reportContainer = await reportingServiceManager.DownloadReportAsync(
    parameters: reportingDownloadParameters,
    cancellationToken: CancellationToken.None
);

IEnumerable<IReportRecord> reportRecordIterable = reportContainer.GetReportRecords();

// Be sure to close the report before you attempt to clean up files within the working directory.

reportContainer.Dispose();

// The CleanupTempFiles method removes all files (but not sub-directories) within the working directory, 
// whether or not the files were created by this ReportingServiceManager instance. 

reportingServiceManager.CleanupTempFiles();
ReportingServiceManager reportingServiceManager = new ReportingServiceManager(authorizationData, API_ENVIRONMENT);
reportingServiceManager.setStatusPollIntervalInMilliseconds(5000);

ReportRequest reportRequest = getReportRequest(authorizationData.getAccountId());

ReportingDownloadParameters reportingDownloadParameters = new ReportingDownloadParameters();
reportingDownloadParameters.setReportRequest(reportRequest);
reportingDownloadParameters.setResultFileDirectory(new File(FileDirectory));
reportingDownloadParameters.setResultFileName(ResultFileName);
reportingDownloadParameters.setOverwriteResultFile(true);

// The system temp directory will be used if another working directory is not specified. If you are 
// using a hosted service such as Microsoft Azure you'll want to ensure you do not exceed the file or directory limits. 
// You can specify a different working directory for each ReportingServiceManager instance.

reportingServiceManager.setWorkingDirectory(new File(FileDirectory));

// You can get a Report object by submitting a new download request via ReportingServiceManager. 
// Although in this case you won't work directly with the file, under the covers a request is 
// submitted to the Reporting service and the report file is downloaded to a local directory. 

Report reportContainer = reportingServiceManager.downloadReportAsync(
    reportingDownloadParameters, 
    null
).get(); 

java.lang.Long recordCount = reportContainer.getReportRecordCount();

// Be sure to close the reportRequest before you attempt to clean up files within the working directory.

reportContainer.close();

// The cleanupTempFiles method removes all files (but not sub-directories) within the working directory, 
// whether or not the files were created by this ReportingServiceManager instance. 

reportingServiceManager.cleanupTempFiles();

另請參閱

沙 箱
Bing 廣告 API 程式碼範例
Bing 廣告 API Web 服務位址