如何定制一个Reporting Service的站点

 我来答
huanglenzhi
2015-01-22 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517193
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  转载 最近在为一家客户提供SQL Server 2005报表服务的咨询过程中,客户提出了定制报表服务访问站点的需求。客户需要的是一个可以浏览报表目录以及报表内容的站点,为了确保界面的简洁和用户访问速度,因此客户需要进一步简化ReportServer。(客户觉得Report Manager站点过于复杂,而且对Report Manager站点的速度也不满意。其实Report Manager站点没有ReportServer站点快的原因非常简单,因为Report Manager站点调用了很多报表服务的Web Service,而Web Service的调用本身就非常消耗资源。)

  在清晰了客户的需求后,我就开始着手设计报表站点的原形了。因为我不熟悉.Net的编程,而客户有不能确保下达服务订单,所以就不能请求组内.Net方向的同事正式介入了。诶,结果那就一个惨哪。不过还好,最后还是给出了一个可以运行的原型。

  在原型设计过程中,我设计了两种方案。

  第一种非常简单,页面有两个Frame构成。

  左侧的Frame调用一个ASP .Net页面,通过调用报表服务的Web Service获得报表的目录结构(Web Service中有一个方法就List Childrent),然后利用TreeView控件就可以显示报表目录结构了。

  在向TreeView加入Node的时候,同时将ListChildren方法返回的item中的ItemPath属性与报表服务的Server Path拼接成一个报表的访问地址,然后将这个访问地址写入到Node的NavigationUrl属性中,并将TreeView的Target设置为右侧的Frame。

  这样我就生成了一个相当简单的报表访问站点(应该只能叫页面?)

  但是第一种方案会有问题,当客户在URL中使用IP地址访问这个页面的时候,在左侧Frame生成的时候页面就会提示用户输入用户名和密码,而在URL中使用服务器名访问的时候,则是在左侧不提示用户输入用户名和密码,但是在用户点击某个TreeView节点右侧Frame显示报表的时候会提示用户输入用户名和密码。

  估计这个问题与程序中serverPath常量中用IP地址还是服务器名有关,但是这个问题还没具体检查,只知道在我的测试环境里面将serverPath常量中的IP地址改成了服务器名就可以确保在左侧TreeView页面显示的时候就要求登录。

  由于第一种原型会要求用户登录,因此我又设计了第二种原型(诶,这次可算是恶补了我那可怜的ASP .Net知识。)

  第二种原型使用了Web Form身份验证,用户在一个登录页面输入自己的域名、用户名和密码,然后在调用Web Service的时候利用新建一个System.Net.Credential实例来提供身份凭证。

  结果呢,在生成TreeView的时候非常顺利,一句“rs.Credentials = new System.Net.Credential(Session["UserName"].ToString(), Session["Password"].ToString(), Session["Domain"].ToString());”就万事OK了。

  可是右侧的有问题啊,因为第一种原型中使用的是URL访问,而URL访问的时候只能传递报表数据源的用户名和密码,不能传递报表服务需要验证的身份信息。这可怎么办呢?

  啊哈,报表服务不是提供了一个ReportViewer控件么,可以使用这个控件阿。接着就是一番实验阿(谁让我没有好好学习ASP .Net呢,估计一个ASP .Net的熟手10分钟就能搞定我这两张页面,结果上海这边好几个.Net的MVP都被我半夜骚扰了,哈)。

  ReportViewer控件可以Render两种类型的报表,一种呢叫做Local Report,也就是直接提供rdl文件让它去Render,还有一种呢叫做Server Report,就是提供一个报表服务的地址以及报表在这个报表服务里面的Path。很明显么,我们需要Server Report,传报表服务地址和报表的Path很容易就搞定了,在ListChildren的时候这些信息非常容易就可以获得。

  不过,我晕倒,ReportViewer的ServerReport.ReportServerCredentials.NetworkCredentials是只读的,“new System.Net.Credential(Session["UserName"].ToString(), Session["Password"].ToString(), Session["Domain"].ToString());”创建出来Credential实例不能传进去!怎么才能把身份凭证传进去呢?
Jtti
2024-10-10 广告
Jtti是一家新加坡全球网络基础服务商,为数百万个网站提供支持,提供香港服务器、新加坡服务器等多种全球服务器,自营全球多个数据中心,为用户提供优质的网络资源和服务。 JTTI服务器整体性能是非常不错的,拥有CN2 GIA+BGP优化线路,多... 点击进入详情页
本回答由Jtti提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式