C# 本地ReportViewer在不必要地登录到数据库时失败
我继承了一个使用Microsoft Web ReportViewer在本地运行小报告的应用程序。我们的应用程序允许您通过单击特定按钮“预览/打印”报告,该按钮将用户路由到允许他们以PDF格式下载报告的URL。我们最近收到了将这些PDF保存到数据库中文档表的要求。我已经能够让它在localhost上成功运行;但是,当我将应用程序发布到IIS服务器时,出现以下错误:C# 本地ReportViewer在不必要地登录到数据库时失败,c#,asp.net,reportviewer,C#,Asp.net,Reportviewer,我继承了一个使用Microsoft Web ReportViewer在本地运行小报告的应用程序。我们的应用程序允许您通过单击特定按钮“预览/打印”报告,该按钮将用户路由到允许他们以PDF格式下载报告的URL。我们最近收到了将这些PDF保存到数据库中文档表的要求。我已经能够让它在localhost上成功运行;但是,当我将应用程序发布到IIS服务器时,出现以下错误: System.Data.SqlClient.SqlException: Login failed for user 'Domain\S
System.Data.SqlClient.SqlException: Login failed for user 'Domain\Servername$'.
我已经查看了所有涉及此错误的站点(包括)-大多数指向将服务器帐户添加到SQL数据库;但是,这不应该是一个问题,因为预览/打印文档的按钮仍然可以正常工作,并且在发布应用程序时,所有数据都保存在本地对象中,该对象以前是从数据库中提取的(下面的模型参数)。按钮和自动生成功能使用相同的两种方法创建PDF文档(见下文)
下面是一些代码:
public static byte[] CreatePDFDocument(DocumentTemplateType template, Request model)
{
Warning[] warnings;
string[] streamIds;
string mimeType = string.Empty;
string encoding = string.Empty;
string extension = string.Empty;
ReportViewer viewer = new ReportViewer();
viewer.ProcessingMode = ProcessingMode.Local;
viewer.LocalReport.ReportEmbeddedResource = "Xxx.Xxx.Bll.ReportViewerRDLCs." + template.RdlcFilename;
switch ((DocumentType)template.DocumentTypeId)
{
case eDocumentType.Report1:
viewer.LocalReport.SetParameters(GetForm1Parameters(model));
break;
/**
* Several other reports are in this switch. All reports have the
* same issue - all but one are removed for brevity.
*/
}
byte[] bytes = viewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
return bytes;
//return new byte[5] {5,6,7,8,9}; - used for troubleshooting.
}
public static List<ReportParameter> GetReport1Parameters(Request model)
{
List<ReportParameter> rptParams = new List<ReportParameter>();
//Start comment
rptParams.Add(new ReportParameter("EmployeeFullName", string.Format("{0:NN}", model.Employee)));
rptParams.Add(new ReportParameter("EmployeePhoneNumber", string.Format("{0:(###) ###-####}", Convert.ToInt64(model.Employee.PhoneNumber))));
rptParams.Add(new ReportParameter("HrchyShortDesc", model.Employee.HrchyShortDesc));
rptParams.Add(new ReportParameter("RequestDate", model.RequestDate.ToShortDateString()));
rptParams.Add(new ReportParameter("RequestRequested", model.RequestRequestType));
rptParams.Add(new ReportParameter("ReasonForRequest", model.RequestRequestReason));
rptParams.Add(new ReportParameter("LogNumber", model.CaseId));
if (!string.IsNullOrWhiteSpace(model.TimeSensitiveReason)) rptParams.Add(new ReportParameter("TimeSensitiveReason", model.TimeSensitiveReason));
var lastAction = model.LastActionOfType(WorkflowStateActionType.EmployeeConfirmation);
if (lastAction != null)
{
rptParams.Add(new ReportParameter("TodaysDate", lastAction.ActionDate.ToShortDateString()));
rptParams.Add(new ReportParameter("EmpConfirmed", "true"));
}
else rptParams.Add(new ReportParameter("TodaysDate", DateTime.Now.ToShortDateString()));
//end comment
return rptParams;
}
publicstaticbyte[]CreatePDFDocument(DocumentTemplateType模板,请求模型)
{
警告[]警告;
字符串[]流线;
string mimeType=string.Empty;
字符串编码=string.Empty;
字符串扩展名=string.Empty;
ReportViewer=新的ReportViewer();
viewer.ProcessingMode=ProcessingMode.Local;
viewer.LocalReport.ReportEmbeddedResource=“Xxx.Xxx.Bll.ReportViewerRDLCs。”+template.RdlcFilename;
开关((DocumentType)模板.DocumentTypeId)
{
案例eDocumentType.Report1:
SetParameters(GetForm1Parameters(model));
打破
/**
*此开关中还有其他几个报告。所有报告都具有
*相同的问题-为了简洁起见,除一个问题外,所有问题都被删除。
*/
}
byte[]bytes=viewer.LocalReport.Render(“PDF”、null、out-mimeType、out-encoding、out-extension、out-streamid、out-warnings);
返回字节;
//返回新字节[5]{5,6,7,8,9};-用于故障排除。
}
公共静态列表GetReport1参数(请求模型)
{
List rptParams=新列表();
//开始评论
Add(新的ReportParameter(“EmployeeFullName”,string.Format(“{0:NN}”,model.Employee));
rptParams.Add(新的报告参数(“EmployeePhoneNumber”,string.Format({0:(####)、###-#####),Convert.ToInt64(model.Employee.PhoneNumber));
rptParams.Add(新报告参数(“HrchyShortDesc”,model.Employee.HrchyShortDesc));
Add(新的ReportParameter(“RequestDate”,model.RequestDate.ToShortDateString());
rptParams.Add(新的ReportParameter(“RequestRequested”,model.requestType));
添加(新的报告参数(“ReasonForRequest”,model.RequestReason));
rptParams.Add(新报告参数(“LogNumber”,model.CaseId));
如果(!string.IsNullOrWhiteSpace(model.timesensitereason))rptParams.Add(新报告参数(“timesensitereason”,model.timesensitereason));
var lastAction=model.LastActionOfType(WorkflowStateActionType.EmployeeConfirmation);
if(lastAction!=null)
{
添加(新的ReportParameter(“TodaysDate”,lastAction.ActionDate.ToSortDateString());
rptParams.Add(新的ReportParameter(“EMPConfixed”、“true”);
}
else rptParams.Add(新的ReportParameter(“TodaysDate”,DateTime.Now.ToSortDateString());
//结束语
返回参数;
}
通过大量的评论和推送到我们的服务器,我得出以下结论:
- 我们使用web.config中的模拟身份为应用程序使用服务帐户。该行在localhost上被注释掉,但在IIS上运行
- 所有其他数据库交互都正常工作
- 我们所有的数据库交互都是使用LINQ到SQL来完成的——模型是一个基于数据库表的对象,带有一些动态计算的附加信息
System.Security.Principal.IIdentity id = System.Web.HttpContext.Current.User.Identity
if (id.Name != System.Security.Principal.WindowsIdentity.GetCurrent().Name)
{
context = (id as System.Security.Principal.WindowsIdentity).Impersonate()
}