0

我们的应用程序将合同文件保存到 C:\Contracts。合同在 aspx 网页上填写,并在提交时将合同作为 .htm 文件保存到该目录,合同的文件路径存储在 OnlineCustomerDocuments 对象中,然后将其发送到数据库。稍后,我们希望能够通过网络应用在网络浏览器中打开这些合约。客户显示在网格视图中,每一行都有合同链接。

这是我现在打开合同的代码:

 protected void grdWebs_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        int intId = 0;
        Web objWeb = new Web();
        try
        {
            string strContractFilePath;
            GridViewRow row1;
            List<OnlineCustomerDocuments> lstOnlineCustomerDocuments;
            OnlineCustomerDocuments contract;
            string strContractpath;
            switch (e.CommandName)
            {
                case "View_Details":
                //GridViewRow row = (GridViewRow) (((Button)e.CommandSource).NamingContainer);
                  GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
                intId = Convert.ToInt32(grdWebs.DataKeys[row.RowIndex].Value.ToString());
                Response.Redirect("DetailsForm.aspx?Id=" + intId.ToString(), false);
                break;
            case "Print_Contract":                    
                strContractFilePath = ConfigurationManager.AppSettings["CustomerContractsDirectory"].ToString();
                row1 = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
                intId = Convert.ToInt32(grdWebs.DataKeys[row1.RowIndex].Value.ToString());
                objWeb = QDServiceHelper._QDClient.GetDetails(intId);
                lstOnlineCustomerDocuments = QDServiceHelper._QDClient.GetOnlineCustomerDocumentsByID(intId);
                contract = lstOnlineCustomerDocuments.ElementAt(0);
                strContractpath = contract.DocumentFileName;                    
                System.Diagnostics.Process.Start(strContractpath);                    
                break;                
            default:
                break;            
            }
        }
        catch (Exception ex)
        {
            log.Error(ex.ToString());
        }           
    }

启动合约的按钮:

 <asp:LinkButton ID="btnPrintContract" runat="server"  CommandName="Print_Contract" Text="View Signed Contract" width="100px" CssClass ="GeneralHyperlink"></asp:LinkButton>

基本上,选定的行被抓取,并且该客户 ID 的合同被抓取。在我的本地机器上测试应用程序时,创建了合约,正确更新了数据库,并且能够打开合约。但是,当我将应用程序发布到 Web 服务器时,我无法打开合同。代码执行到 Process.start(),但没有任何反应。我检查了文件路径,并且链接按钮的 __doPostBack 是正确的。我唯一能想到的是存在一些权限问题。如果是这种情况,最好尝试弄清楚如何使用 asp.net 模拟等授予这些权限,还是有更好的方法?

更新*

因此,我尝试阅读 html 文档,并像 nathan 建议的那样使用响应写入,但我确实需要在新窗口中打开合同,并且尝试了几种不同的 window.open 方法,但我无法让它工作。我最终按照建议设置了一个虚拟目录,现在一切正常。更新了下面的代码。感谢所有帮助内森。

string strContractFilePath;
            GridViewRow row1;
            List<OnlineCustomerDocuments> lstOnlineCustomerDocuments;
            OnlineCustomerDocuments contract;
            string strfileName;
            string file;
            string pathlead;
            string vDir = "/Webfiles/";

            switch (e.CommandName)
            {
                case "View_Details":
                    //GridViewRow row = (GridViewRow) (((Button)e.CommandSource).NamingContainer);
                    GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
                    intId = Convert.ToInt32(grdWebs.DataKeys[row.RowIndex].Value.ToString());
                    Response.Redirect("DetailsForm.aspx?Id=" + intId.ToString(), false);
                    break;
                case "Print_Contract":
                    strContractFilePath = ConfigurationManager.AppSettings["CustomerContractsDirectory"].ToString();
                    row1 = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
                    intId = Convert.ToInt32(grdWebs.DataKeys[row1.RowIndex].Value.ToString());
                    lstOnlineCustomerDocuments = QDServiceHelper._QDClient.GetOnlineCustomerDocumentsByID(intId);
                    contract = lstOnlineCustomerDocuments.ElementAt(0);
                    strfileName = contract.DocumentFileName;

                    //path to the virtual directory on server                       
                    pathlead = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
                    if (HttpContext.Current.Request.Url.AbsoluteUri.Contains("CA"))
                    {
                        vDir = "/CA/WebFiles/CA1003/Contracts/";
                        file = pathlead + vDir + strfileName;
                        //Response.Redirect("~/WebFiles/contract.htm");

                        Response.Write("<script>");
                        Response.Write("window.open('" + file + "','_blank')");
                        Response.Write("</script>");
                    }
                    //For testing on local machines
                    else
                    {
                        System.Diagnostics.Process.Start(strContractFilePath + strfileName);
                    }

                    break;
4

1 回答 1

2
System.Diagnostics.Process.Start(strContractpath);

这将在服务器上而不是在客户端上打开文档。由于您是在本地进行测试,因此它可以工作,因为您是服务器客户端

换句话说,这行代码只是在服务器上启动一个进程(在这种情况下是一个 Web 浏览器,因为这是.htm默认与文件关联的)。当您在本地进行测试时,您看到页面打开了,因为您的计算机充当了server,但这实际上并没有将页面提供给客户端,它只是打开了一个程序。当您将其发布到服务器时,您无法看到进程正在启动,因为它发生在服务器上,明白了吗?

您真正想要做的是通过网络服务器将文件内容提供给客户端。

我正在想办法让你做到这一点。


您可以在 IIS 中创建一个虚拟目录并将其指向包含文件的目录,然后在您的响应中执行Response.Redirect(<URL to file>);

或者您可以获取文件的内容并将其填充到响应中。我从来没有亲自这样做过,但是这篇SO帖子可能会为您指明正确的方向。在我看来,这可能是您的最佳选择,因为您不必更改任何服务器设置。

编辑:

是一个如何完成此操作的示例。请注意,这是未经测试的,因为我在没有网络环境的情况下工作。

...
case "Print_Contract":
     strContractFilePath = ConfigurationManager.AppSettings["CustomerContractsDirectory"].ToString();
     row1 = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
     intId = Convert.ToInt32(grdWebs.DataKeys[row1.RowIndex].Value.ToString());
     objWeb = QDServiceHelper._QDClient.GetDetails(intId);
     lstOnlineCustomerDocuments = QDServiceHelper._QDClient.GetOnlineCustomerDocumentsByID(intId);
     contract = lstOnlineCustomerDocuments.ElementAt(0);
     strContractpath = contract.DocumentFileName;                    

     //System.Diagnostics.Process.Start(strContractpath);

     StreamReader sr = new StreamReader(strContractpath);
     while(sr.Peek() >= 0)
     {
          line=sr.ReadLine();
          Response.Write(line);
     }

     break;               
...
于 2012-07-25T18:33:46.717 回答