版本升級對目前的設計所造成的衝擊,有以下幾點:
1.原先使用的 WebService http://Repsdev/ReportServer/ReportService.asmx ,現在已經不能用了,取而代之的,是可以選擇使用 http://Repsdev/ReportServer/ReportService2005.asmx 或 http://Repsdev/ReportServer/ReportService2010.asmx。確切來說,要知道你的主機上可以使用哪些 WebService,主要是看主機上安裝了哪些版本的 SQL Server。將各個版本的 Reporting Service 列出來比較,就能明瞭了。
SQL Server 2000 Reporting Server >>ReportService.asmx
SQL Server 2005 Reporting Server >>ReportService2005.asmx
SQL Server 2008 Reporting Server >>ReportService2006.asmx
SQL Server 2008R2 Reporting Server >>ReportService2010.asmx
目前我可以使用 ReportService2005.asmx 與 ReportService2010.asmx,是因為主機上裝了 SQL 2005 與 SQL 2008R2,由此解釋,應該可以通吧!
2. Render( ) 方法的入口點,已由 ReportService.asmx 改為 ReportExecutionService2005.asmx,這改變真的也讓人理不出個所以然來。只能靠網友間口耳相傳才會知道,自己則是在 Rendering a report using web services with 2008 R2 (ReportService2010) 這篇文章找到原因的。
3. Render( ) 引數的改變。 Render( ) 所接受的引數,在 ReportExecutionService2005.asmx 是跟 ReportService.asmx 不一樣的。新的 Render( ) 內容,可以參考 ReportExecutionService.Render Method。
折騰一陣子後,終於把透過 Proxy 來產生 Reporting Service 報表的問題解決了。最後將完整的測試程式整理於後,以便有興趣的朋友或未來的自己參考參考。
範例是用 VS2003 所撰寫,所以有點懷舊的味道...只差程式沒辦法強調是黑白的而已。
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Configuration;
namespace WebApplication1
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button btnPDF;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}
private void btnPDF_Click(object sender, System.EventArgs e)
{
MakePDF();
}
private void MakePDF()
{
//PDF 暫存檔路徑(必須已經存在的檔案路徑)
string filepath = "D:\\upload\\engage_upd\\PDF\\";
string filename = filepath+"Quote.PDF";
//取得 WebService 服務(SQL 2008R2 的 webservice 要使用 ReportExecution2005.asmx )
string strRSTmp="http://Repsdev/ReportServer/ReportExecution2005.asmx";
repsdev.ReportExecutionService rs=new WebApplication1.repsdev.ReportExecutionService();
//設定 windows 帳號認證(正式使用時,採用此行)
//rs.Credentials=System.Net.CredentialCache.DefaultCredentials;
//測試資料【連接Reporting Server】(測試時,採用此行,固定測試帳號)
rs.Credentials=new System.Net.NetworkCredential("52xxxx","passwd","network");
//重新指派 WebService 服務位址
rs.Url=strRSTmp;
Byte [] result=null;
//參數收集(呼叫報表時必須傳入的參數,目前範例要傳入 seqsn,ver,isdraft 三個參數)
repsdev.ParameterValue [] parameter=new WebApplication1.repsdev.ParameterValue[3] ;
parameter[0]=new WebApplication1.repsdev.ParameterValue();
parameter[0].Name="seqsn";
parameter[0].Value="545";
parameter[1]=new WebApplication1.repsdev.ParameterValue();
parameter[1].Name="ver";
parameter[1].Value="";
parameter[2] = new WebApplication1.repsdev.ParameterValue();
parameter[2].Name="isdraft";
parameter[2].Value="1";
repsdev.ExecutionInfo execInfo=new WebApplication1.repsdev.ExecutionInfo();
repsdev.ExecutionHeader execHeader=new WebApplication1.repsdev.ExecutionHeader();
//報表位置
string reportPath = "/EPath/rptTest";
string historyID = null;
rs.ExecutionHeaderValue = execHeader;
execInfo = rs.LoadReport(reportPath, historyID);
rs.SetExecutionParameters(parameter, "en-us");
string mimeType;
repsdev.Warning [] warnings=null;
string [] streamIDs=null;
string devInfo=@"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
string extension;
string encoding;
try
{
result=rs.Render("PDF",devInfo,out extension,out mimeType,out encoding,out warnings,out streamIDs);
}
catch(Exception e)
{
if(e.Message.IndexOf("401")>-1)
{
//HTTP 401:沒通過授權
String scriptString = @"
<script language=JavaScript>
<!-- begin
alert('您必須登入網域,才能有權限讀取本報表!') ;
//end -->
</script>
";
this.RegisterStartupScript("AccessDeny",scriptString);
return;
}
else
return;
}
FileStream fs=new FileStream(filename,FileMode.Create);
fs.Write(result,0,result.Length);
fs.Close();
rs.Dispose();
}
}
}
參考:
01.ReportExecutionService.Render Method
02.What is reportexecution2005.asmx i used this as webreference
03.Rendering a report using web services with 2008 R2 (ReportService2010)
04.SSRS 2008, C# and ReportingService.Render()
05.SSRS 亂七八糟的SOAP API 配對
沒有留言:
張貼留言