[英]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.