繁体   English   中英

无法托管Asp.net MVC应用程序并正常工作

[英]Asp.net MVC application cannot be hosted and working properly

我面临的问题到目前为止尚未解决,请在三个星期内完成。 我应该创建一个执行以下操作的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 / Administrators授予了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模板文件模板开始,我仍然遇到问题,该模板阻止执行应用程序的其余步骤,因为我必须打开文件,用数据填充文件,用新名称保存文件,然后下载新创建的文件!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM