Asp.net MVC应用程序无法托管并正常运行

时间:2018-04-06 05:32:12

标签: c# asp.net asp.net-mvc asp.net-web-api2

我正面临一个迄今尚未解决的问题,并在三周内完成。我应该创建一个执行以下操作的Web应用程序:

1-允许用户从下拉列表中选择搜索条件,然后单击导出按钮。 2-按钮单击事件调用API,该API依次根据搜索条件从数据存储中获取数据,打开现有Excel模板文件并使用返回的数据填充它,并使用新名称保存(即原始文件)名为abc.xlsx的模板,它将保存为abc [date] - [time] .xlsx)。 3-最后下载新创建的Excel文件。

我创建了应用程序并在开发环境中成功完成了前两个步骤,当我厌倦了在我的本地机器IIS或生产服务器IIS上部署应用程序时,应用程序只执行了第一步和部分然而,第二个(即,从数据存储中获取数据),其余步骤无法实现。这是我的代码:

$("#dataexporter").click(function () {
    if ($("#countrycriteria").val().toString() === "0" || $("#productcriteria").val().toString() === "0") {
        $('from').append('<div class="alert alert-warning" role="alert">Please make sure you select all required fields!</div >');
    }
    else {
        $('div[class*="alert-warning"]').remove();
        $(this).prop('disabled', true);
        $.ajax("api/exportify/export?countrycriteria=" + $("#countrycriteria").val().toString() + "&productcriteria=" + $("#productcriteria").val().toString(), {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            success: function (response, textStatus, jqXHR) {
                if (response !== null)
                    window.location.href = JSON.parse(response).downloadurl

                $(this).prop('disabled', false);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert('An error occurred ' + errorThrown);
                $(this).prop('disabled', false);
            }
        });
    }
});

[RoutePrefix("api/exportify")]
public class ExportController : BaseController
{
    private IExporterProvider provider;
    private Invoker invoker;

    public ExportController()
    {
        switch (AppConfiguration.ExporterProvider)
        {
            case "excel":
                provider = new ExcelExporterProvider();
                break;
            default:
                throw new NotImplementedException();
        }

        invoker = new Invoker();
        invoker.Commands.Add(provider.GetExporter());
    }

private IEnumerable<Analytics> GetData(string countrycriteria, string productcriteria)
    {
        return helper.SelectByCountryAndProduct(countrycriteria, productcriteria);
    }

    private Dictionary<string, object> GetResponseContent()
    {
        string fname = AppConfiguration.SaveAsName;
        int lastBackslash = fname.LastIndexOf("\\");
        int substringLength = fname.Length - lastBackslash;
        string filename = fname.Substring(lastBackslash + 1, substringLength - 1);

        return new Dictionary<string, object> {
            { "downloadurl", Path.Combine(AppConfiguration.ServerAddress, AppConfiguration.Temporaryfolder, filename + AppConfiguration.FileExtension) }
        };
    }

    [HttpGet]
    [Route("export")]
    public IHttpActionResult Export(string countrycriteria, string productcriteria)
    {
        try
        {
            List<Analytics> data = (List<Analytics>)GetData(countrycriteria, productcriteria);
            if (data.Count > 0)
            {
                data.ForEach(d => DeterminetheCategory(d));

                foreach (var Command in invoker.Commands)
                {
                    Command.ExportedData = data;
                }

                invoker.Execute();

                return Ok(JsonConvert.SerializeObject(GetResponseContent()));
            }
            else
            {
                return Content(HttpStatusCode.NoContent, string.Empty);
            }
        }
        catch (Exception e)
        {
            return Content(HttpStatusCode.InternalServerError, e);
        }
    }
}

这是在invoker.Execute()时最终执行的代码。声明被击中:

public class ExcelExporter
{
    protected static void ExportToExcel(IEnumerable<Analytics> data)
    {
        if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppConfiguration.Temporaryfolder, AppConfiguration.Filename + AppConfiguration.FileExtension)))
        {
            throw new FileNotFoundException("File Not Found.\nThe requested analytical.xlsx was not found on the server");
        }

        Microsoft.Office.Interop.Excel.Application xlsx = new Microsoft.Office.Interop.Excel.Application();
        Workbook workbook = null;
        Worksheet worksheet = null;

        try
        {
            workbook = xlsx.Workbooks.Open(
            Filename: Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppConfiguration.Temporaryfolder, AppConfiguration.Filename + AppConfiguration.FileExtension),
            ReadOnly: false);
            worksheet = (Worksheet)workbook.Worksheets[1];
            List<Analytics> list = (List<Analytics>)data;

            for (int i = 0; i < list.Count; i++)
            {
                worksheet.Range[string.Format("A{0}", i + 2)].Value = list[i].ProductShare;
                worksheet.Range[string.Format("B{0}", i + 2)].Value = list[i].MarketPotential;
                worksheet.Range[string.Format("C{0}", i + 2)].Value = list[i].RepresnentativeName;
                worksheet.Range[string.Format("D{0}", i + 2)].Value = list[i].DoctorName;
                worksheet.Range[string.Format("E{0}", i + 2)].Value = list[i].CustomerCode;
                worksheet.Range[string.Format("F{0}", i + 2)].Value = list[i].Specialization;
                worksheet.Range[string.Format("G{0}", i + 2)].Value = list[i].ProductName;
                worksheet.Range[string.Format("H{0}", i + 2)].Value = list[i].Category;
            }
        }
        catch (Exception e)
        {
            throw new Exception("Error while processing file", e);
        }
        finally
        {
            AppConfiguration.SaveAsName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppConfiguration.Temporaryfolder, AppConfiguration.Filename + DateTime.Now.ToString("yyyyMMdd-hhmmss"));
            workbook.SaveAs(Filename: AppConfiguration.SaveAsName, FileFormat: XlFileFormat.xlOpenXMLWorkbook);
            workbook.Close(SaveChanges: true);
            xlsx.Quit();
            Marshal.ReleaseComObject(worksheet);
            Marshal.ReleaseComObject(workbook);
            Marshal.ReleaseComObject(xlsx);
        }
    }
}

以下是在本地计算机IIS或生产服务器IIS上选择/安装IIS功能的方法:

Web Management Tools -> IIS Management Console
World Wide Web Services
Application Development Features -> .NET Extensibility 3.5, .NET Extensibility 4.7, ASP.NET 3.5, ASP.NET 4.7, CGI, ISAPI Extensions, ISAPI Filters
Common HTTP Features -> Default Document, Direct Browsing, HTTP Errors, Static Content
Health and Diagnostics -> HTTP Logging
Performance Features -> Static Content Compression
Security -> Request Filtering

我还给 IIS_IUSERS / 管理员两者提供了对 IIS 网站所针对的发布文件夹的完全控制权限。

我还为Excel配置了以下组件服务

Component Services -> Computers -> My Computer -> DCOM Config -> Microsoft 
Excel Application -> Properties
Authentication Level -> None
Security
Launch and Activation Permissions** -> Customize -> 
Administrators/IIS_IUSERS have full permissions
Access Permissions -> Customize -> Administrators/IIS_IUSERS have full 
permissions
Configure Permissions -> Customize -> Administrators/IIS_IUSERS have full 
permissions

我仍然在打开现有的Excel模板文件模板时遇到问题,该模板阻止执行应用程序的其余步骤,因为我必须打开文件,用数据填充它,用新名称保存,然后下载新创建的文件!。

2 个答案:

答案 0 :(得分:0)

问题已解决所有我需要的是设置组件服务 - &gt;计算机 - &gt;我的电脑 - &gt; DCOM配置 - &gt; Microsoft Excel应用程序 - &gt;属性 - &gt;身份交互式用户并使用 [ComVisible(true)] 属性

来装饰使用COM组件ExcelExporter的类

答案 1 :(得分:0)

最后,我发现如果托管通过COM使用Microsoft Office的应用程序,您总是会遇到麻烦。我使用了基于第三方XML的API来代替EPPlus,即使我不必在托管计算机上安装Microsoft Office,它也对我非常有效。