Несколько отчетов с ReportViewer и SSRS 2008 в Silverlight - PullRequest
1 голос
/ 06 апреля 2011

Существует много информации об использовании элемента управления ReportViewer в Silverlight для отображения нескольких отчетов, но я не могу заставить ни один из них работать на меня в моей ситуации, потому что способ, которым я все настроил, немного отличается , Мы должны были иметь возможность отправлять данные постов на страницу, на которой находится ReportViewer, поэтому пришлось добавить немного javascript для фактического открытия страницы.

Большая часть информации в Интернете говорит о простом добавлении строки ReportViewerCtrl.reset (), и она должна работать, но для меня это не имеет абсолютно никакого значения. Я уверен, что код лучше объяснит ситуацию, но если вам нужно больше подробностей о настройке, просто спросите.

Итак ... с самого начала ... кнопка гиперссылки для отчета вызывает это по клику: HtmlPage.Window.Invoke("showAspPage", par);

Это вызывает этот скрипт (я вырезал все, что обрабатывает параметры отчета и прочее, потому что он работает точно так же, когда эти данные все равно исключаются):

<script type="text/javascript">
var g_htmlWindow;

function showAspPage(param) {
    var to = param["to"];
    var myForm = document.createElement("form");
    myForm.method = "post";
    myForm.action = to;
    myForm.setAttribute("target", "_blank");  

    //handle parameters here

    document.body.appendChild(myForm);
    myForm.submit();
    document.body.removeChild(myForm);
 }
</script>

param["to"] - это ссылка на страницу, на которой находится фактический элемент управления ReportViewer ... из части aspx этой страницы:

<body>
<form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
        <rsweb:ReportViewer ID="ReportViewer4" runat="server"> </rsweb:ReportViewer>
</form>
</body>

И важный фрагмент из части aspx.cs на странице ReportViewer ... (может быть слишком много для настройки свойств и т. Д., Но я добавил много вещей, пытаясь выяснить, какие предложения я нашел на сеть)

ReportViewer4.Reset();  
ReportViewer4.ShowCredentialPrompts = false;
ReportViewer4.ServerReport.ReportServerCredentials = new ReportCredentials();
ReportViewer4.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
ReportViewer4.ServerReport.ReportServerUrl = reportServerURL
ReportViewer4.AsyncRendering = false;

ReportViewer4.ServerReport.ReportPath = reportPath;
ReportViewer4.KeepSessionAlive = true; 

ReportViewer4.ServerReport.SetParameters(params);

ReportViewer4.SizeToReportContent = true; 
ReportViewer4.Width = Unit.Pixel(900);
ReportViewer4.ServerReport.Refresh();

Когда я хочу видеть только один отчет, все работает нормально - все настроено правильно. Но когда я хочу вызвать HtmlPage.Window.Invoke("showAspPage", par); два раза подряд для двух разных отчетов, я начинаю получать эту ошибку либо при загрузке одного из отчетов, либо при попытке изменить параметры отчета в любом из двух отчетов: ASP Сеанс .NET истек или не может быть найден Оба отчета загружаются 95% времени - с параметрами, данными, всем; один отчет всегда загружается, но это зависит от того, какой из них завершает загрузку первым; но вы не можете изменить параметры без этой ошибки.

Так что ... в качестве небольшой альтернативы, в этой ситуации возможность изменить отчет на самом деле не нужна, и я мог бы сделать прямой экспорт в PDF, но с использованием сценариев вы не можете просто добавить "rs: Формат = PDF "до конца пути отчета. Однако, если параметры видны, они должны работать, если они изменены. Я думаю, я мог бы скрыть весь раздел параметров? Но это все еще не решает проблему получения ошибки, когда отчет иногда загружается ....

Также .... может быть совершенно не связано, но параметры зашифрованы, и мне нужно получить соль и хэш из базы данных (Entity Framework и WCF RIA Services), прежде чем я вызову HtmlPage.Window.Invoke .... Я нахожу этот вид странным .... но после загрузки экрана отчета, если пользователь сидит там и ничего не нажимает (но не сидит там достаточно долго, чтобы фактически выйти из системы, может быть, всего 5 минут или итак) я получаю эту ошибку: 'Операция загрузки не выполнена для запроса' GetStuff '. Удаленный сервер возвратил ошибку: Not Found. ', но опять же, он работает нормально, если щелкнуть сразу. У меня никогда не было такого, пока я не начал эти два отчета одновременно.

Пожалуйста ... любые советы .... или предложения ... или альтернативы ... или ссылки ...

Спасибо.


Итак ... Я пытался скрыть весь раздел параметров, но пользователю все еще нужно иметь возможность печатать и экспортировать. Он отлично работает для одного из отчетов, но в другом я получаю это для всего окна (при экспорте в PDF для обоих отчетов):

[AspNetSessionExpiredException: ASP.NET session has expired or could not be found]
Microsoft.Reporting.WebForms.ViewerDataOperation..ctor() +330
Microsoft.Reporting.WebForms.ReportDataOperation..ctor(Boolean requiresFullReportLoad) +120
Microsoft.Reporting.WebForms.ReportDataOperation..ctor() +33
Microsoft.Reporting.WebForms.ExportOperation..ctor() +29
Microsoft.Reporting.WebForms.HttpHandler.GetHandler(String operationType) +188
Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +111
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
...