C# 本地ReportViewer在不必要地登录到数据库时失败

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

我继承了一个使用Microsoft Web ReportViewer在本地运行小报告的应用程序。我们的应用程序允许您通过单击特定按钮“预览/打印”报告,该按钮将用户路由到允许他们以PDF格式下载报告的URL。我们最近收到了将这些PDF保存到数据库中文档表的要求。我已经能够让它在localhost上成功运行;但是,当我将应用程序发布到IIS服务器时,出现以下错误:

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());
//结束语
返回参数;
}
通过大量的评论和推送到我们的服务器,我得出以下结论:

  • 据我所知,调用GetReport1Parameters时出错。在上面的代码中,我包含了一个开始和结束注释——我已经注释掉了中间的所有内容,只留下列表初始化和返回语句(空列表),但仍然收到了错误
  • 我已经注释掉了对GetReport1Parameters的调用,并返回了一个无意义的字节数组,没有收到异常
  • 所有功能在localhost上都可以正常工作,当我逐步完成这些功能时,所有变量看起来都正常
  • 我试图做些事情来补救这种情况: 1.从app.config中删除了连接字符串,因此应用程序必须转到web.config才能获得正确的字符串(即使它们是相同的)。 2.注释了代码的不同部分以确定问题区域。 3.尝试调用GetReport1Parameters方法并返回null,导致null引用异常。 4.尝试使用空参数列表调用GetReport1Parameters,导致上述错误。 5.尝试在没有参数(甚至不是空白列表)的情况下运行报表,因缺少参数而获得ReportProcessingException

    一些补充资料:

    • 我们使用web.config中的模拟身份为应用程序使用服务帐户。该行在localhost上被注释掉,但在IIS上运行
    • 所有其他数据库交互都正常工作
    • 我们所有的数据库交互都是使用LINQ到SQL来完成的——模型是一个基于数据库表的对象,带有一些动态计算的附加信息
    我期望的结果是,自动生成的文档和预览/打印文档都可以工作。我有一种感觉,这可能是我忽略的一件简单的事情,但我今天已经花了几个小时试图解决这个问题

    我想不出任何其他相关信息,但如果你有问题,我将非常乐意回答

    编辑:寻找解决方案的其他尝试:

  • 尝试将LINQ延迟加载设置为false。这引起了更多的问题
    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()
    }