这里的关键是它在自定义属性过滤器中设置一个带有请求的 cookie,该过滤器告诉浏览器文件何时完成生成,然后删除加载消息并将文件流式传输到浏览器。
当我在本地测试时,这一切都很好,但是当它部署到服务器时,我得到一个 System.NullReferenceException。错误指向属性过滤器 - 上面的链接有一个如何在 ASP.NET MVC 3 中执行此操作的示例,但我使用的是 4 所以转换为这个 -
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class FileDownloadAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public string CookieName { get; set; }
public string CookiePath { get; set; }
public FileDownloadAttribute(string cookieName = "fileDownload", string cookiePath = "/")
{
CookieName = cookieName;
CookiePath = cookiePath;
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
CheckAndHandleFileResult(actionExecutedContext);
base.OnActionExecuted(actionExecutedContext);
}
/// <summary>
/// Write a cookie to inform jquery.fileDownload that a successful file download has occured
/// </summary>
/// <param name="filterContext"></param>
private void CheckAndHandleFileResult(HttpActionExecutedContext filterContext)
{
List<CookieHeaderValue> cookies = new List<CookieHeaderValue>();
CookieHeaderValue cookie = new CookieHeaderValue(CookieName, "true"){ Path = CookiePath };
cookies.Add(cookie);
filterContext.Response.Headers.AddCookies(cookies);
}
}
这是我得到的错误
System.NullReferenceException at API.Attributes.FileDownloadAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 在 c:\Dev\Pensions\Main\API\Attributes\FileDownloadAttribute.cs: System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted (HttpActionContext actionContext) 的第 28 行, HttpResponseMessage 响应, 异常异常) 在 System.Web.Http.Filters.ActionFilterAttribute.<>c_ DisplayClass2.b _1(CatchInfo 1 info) at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass4
1.b__3() 在 System.Threading.Tasks.TaskHelpersExtensions.CatchImpl[TResult](任务任务, Func `1 延续,CancellationToken cancelToken)
有人有想法么?我不明白为什么它在本地(通过 IIS)运行良好,但在部署到服务器时却不行。
编辑 -
错误中的第 28 行指的是这一行
CheckAndHandleFileResult(actionExecutedContext);
编辑 2- 更新为完整的属性过滤器类