SSRS: получить список всех отчетов и параметров в одном вызове веб-службы?

Короткий и сладкий вариант: существует ли один метод веб-службы, который бы возвращал имена всех доступных отчетов и каждый параметр отчета?

У меня есть мой веб-код (С#/MVC), подключенный к веб-службе SSRS, и я могу получать отчеты через эти службы.

Я знаю, что могу получить список доступных отчетов вроде этого:

var rService = new ReportingService2005
{
 Url = @"http://domain.com/ReportServer/ReportService2005.asmx?wsdl",
 Credentials = System.Net.CredentialCache.DefaultCredentials
};

var reportList = rService.ListChildren(@"/Blah", true);

Результат ListChildren() дает много информации, но не отображает параметры для каждого отчета. Чтобы получить параметр для отчета, мне нужно сделать отдельный вызов:

string historyId = null;
ReportService.ParameterValue[] values = null;
ReportService.DataSourceCredentials[] credentials = null;

var parameters = rService.GetReportParameters(@"/Blah/" + reportName, historyId, true, values, credentials);

Итак, если я хочу получить все доступные отчеты и их параметры, мне нужно будет просмотреть результаты ListChildren, что означает, что я буду делать вызов веб-службы для каждого из этих отчетов.

Есть ли лучший способ сделать это?

Ответ 1

Существует такой вызов bulitin для интерфейса webservices. В качестве альтернативы вы могли бы добиться чего-то подобного, напрямую обратившись к таблицам систем служб отчетов в базе данных ReportServer; но это будет зависящим от версии, и MS, вероятно, не поддержит его.

При этом я использовал эти таблицы для создания нескольких отчетов adhoc в прошлом. и не испытывал никаких проблем с YMMV.

Ответ 2

Я использовал ListChildren таким образом.

ReportingService2005 rService = new ReportingService2005();
rService.Credentials = System.Net.CredentialCache.DefaultCredentials;

CatalogItem[] catalogItems = rService.ListChildren("/", true);

они предоставят вам все отчеты, папки и источник данных из диспетчера отчетов. затем отфильтруйте его с помощью своего кода, например,

foreach (CatalogItem item in catalogItems.Where(m => m.Name.ToLower().Contains(model.ReportName.ToLower())))
{
  Your code;    
}