简体   繁体   English

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

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

I am facing a problem that has not been resolved so far and do it over three weeks. 我面临的问题到目前为止尚未解决,请在三个星期内完成。 I am supposed to create a web application that do the following: 我应该创建一个执行以下操作的Web应用程序:

1- Allow the user to select the search criteria from drop down list and click the export button. 1-允许用户从下拉列表中选择搜索条件,然后单击导出按钮。 2- The button click event calls an API that in its turn fetches the data from the data store based on search criteria, opens an existing Excel template file and fill it with the returned data, and save it with a new name (ie, original template named abc.xlsx and it will saved as abc[date]-[time].xlsx). 2-按钮单击事件调用一个API,该API依次根据搜索条件从数据存储中获取数据,打开现有的Excel模板文件,并用返回的数据填充它,并用新名称(即原始名称)保存名为abc.xlsx的模板,它将另存为abc [date]-[time] .xlsx)。 3- Finally download the newly created Excel file. 3-最后下载新创建的Excel文件。

I created the application and on the development environment it did the first two steps successfully, when I tired to deploy the application on either my local machine IIS, or on the production server IIS the application did only the first step and part of the second one (ie, fetching the data from the data store), however, the rest of steps cannot be achieved. 我创建了该应用程序,并在开发环境中成功完成了前两个步骤,当我厌倦了将应用程序部署到本地计算机IIS或生产服务器IIS上时,该应用程序仅执行了第一步,而仅执行了第二步的一部分(即从数据存储中获取数据),但是其余步骤无法实现。 Here's my code: 这是我的代码:

$("#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);
        }
    }
}

Here's the code that will be ultimately executed when the invoker.Execute(); 这是在invoker.Execute();时最终将执行的代码。 statement being hit: 声明被击中:

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);
        }
    }
}

Here's how the IIS features being selected/installed on either my local machine IIS or the production server IIS: 这是在本地计算机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

I also gave both the IIS_IUSERS / Administrators a full control permissions on the publish folder on which the IIS website is directed. 我还向IIS_IUSERS / Administrators授予了IIS网站所指向的发布文件夹的完全控制权限。

I also configured the following Component Services for Excel 我还为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

I am still having problems starting at opening the existing Excel template file template which blocking the rest of steps of the application from being executed as I have to open the file, fill it with the data, save it with a new name, then download the newly created file!. 从打开现有的Excel模板文件模板开始,我仍然遇到问题,该模板阻止执行应用程序的其余步骤,因为我必须打开文件,用数据填充文件,用新名称保存文件,然后下载新创建的文件!

Finally, I figured out that you will always go in troubles if you are hosting an application that uses the Microsoft Office through COM. 最终,我发现如果托管通过COM使用Microsoft Office的应用程序,您将总是遇到麻烦。 I used an third party XML based API instead EPPlus and it works very well for me even I do not have to install Microsoft Office at the hosting machine. 我使用了基于第三方XML的API而不是EPPlus ,即使我不必在托管计算机上安装Microsoft Office,它也对我非常有效。

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

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