2012-06-05 2 views
8

У меня есть сервер служб отчетов, который уже имеет некоторые запущенные отчеты, и теперь мне нужно создать их через пользовательский веб-сайт (работает asp.net MVC3).Службы отчетов: получить PDF-отчет о сгенерированном отчете

Мне нужно получить этот отчет как поток/байт, чтобы отправить его пользователю. Нет «средство просмотра отчетов» или около того.

Последний раз, когда я использовал службы отчетов, был с sql 2005, и мы должны объявить ссылку ссылкой на неясный файл asmx.

Что происходит сейчас, с сервером SQL Server 2008 R2, .Net4 и visual studio 2010? Я не могу найти учебник, объясняющий все это.

(на самом деле я не могу найти учебник, где нет никакого просмотра отчетов для SQL Server 2008 R2)

+1

Я думаю, что вы говорите о доступе к SSRS через й API веб-сервиса. Что именно * неясно * об этом веб-сервисе? – Yuck

ответ

15

Несколько методов представлены в MSDN. Я использовал URL access часто для простых простых кнопок PDF в приложении ASP .NET.

Вот быстрый код кода, выполняющий это. Его можно очистить, чтобы использовать встроенную проверку подлинности, и есть много способов сохранить имя отчета. (Вырезать и вставить это из какого-то старого кода, который я имел, что будет хранить отчет в базе данных, а потом может вернуться, что из БД.

// First read in the report into memory. 

string strReportUser = "RSUserName"; 
string strReportUserPW = "MySecretPassword"; 
string strReportUserDomain = "DomainName"; 

string sTargetURL = "http://SqlServer/ReportServer?" + 
    "/MyReportFolder/Report1&rs:Command=Render&rs:format=PDF&ReportParam=" + 
    ParamValue; 

HttpWebRequest req = 
     (HttpWebRequest)WebRequest.Create(sTargetURL); 
req.PreAuthenticate = true; 
req.Credentials = new System.Net.NetworkCredential(
    strReportUser, 
    strReportUserPW, 
    strReportUserDomain); 

HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

Stream fStream = HttpWResp.GetResponseStream(); 




//Now turn around and send this as the response.. 
byte[] fileBytes = ReadFully(fStream); 
// Could save to a database or file here as well. 

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader(
    "content-disposition", 
    "attachment; filename=\"Report For " + 
     ParamValue + ".pdf\""); 
Response.BinaryWrite(fileBytes); 
Response.Flush(); 
HttpWResp.Close(); 
Response.End(); 

ReadFully является

public static byte[] ReadFully(Stream input) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 
+0

Но как управлять идентификацией? Поскольку все пользователи не должны иметь доступ к службам отчетов, нет? – J4N

+0

Не могли бы вы просто указать мне подходящий класс/пример, чтобы получить отчет от SSRS из URL-адреса? Должен признаться, что я не знаю, как получить доступ к URL-адресу, указав учетные данные и загрузить отчет. спасибо! – J4N

+0

Не уверен, что вы ищете. Ссылка URL-адреса, опубликованная выше, содержит три примера разных URL-адресов, которые можно использовать для доступа к отчетам. Информация о том, как это сделать, зависит от вашего отчета: какие параметры вы используете, как вы получите свои учетные данные. Я добавил пример кода C# к моему ответу. Но если вам нужны лучшие примеры, сообщите нам, с какими деталями вы столкнулись. –

0

Поскольку у вас есть вложенные потоки, вы можете закрыть первый поток после того, как копии, чтобы избежать закрытой ошибки потока. Кроме того, если вы получаете 401 несанкционированные, попробуйте учетные данные по умолчанию.

  req.UseDefaultCredentials = true; 
      req.PreAuthenticate = true; 
      req.Credentials = CredentialCache.DefaultCredentials; 

      HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

      Stream fStream = HttpWResp.GetResponseStream();     

      //Now turn around and send this as the response.. 
      byte[] fileBytes = ReadFully(fStream); 
      // Could save to a database or file here as well. 
      HttpWResp.Close(); 
Смежные вопросы