ASP.NET MVC应用程序不输出内容类型标头

时间:2014-01-16 11:06:47

标签: c# asp.net asp.net-mvc mod-rewrite

我目前在遗留的asp.net mvc 1应用程序中存在问题,在控制器上的POST操作中,响应中的内容类型标头丢失

Cache-Control:private
Date:Thu, 16 Jan 2014 10:43:52 GMT
Server:Microsoft-IIS/7.5
Set-Cookie:cartguid=; expires=Mon, 16-Dec-2013 10:43:53 GMT; path=/; HttpOnly
Transfer-Encoding:chunked

这通常不是问题,但我们现在将Apache反向代理放在Web服务器的前面 - 当没有从下游应用程序定义的内容类型时,mod_rewrite / mod_proxy将内容类型默认为text / plain

因此,虽然我们正在考虑Apache方面的配置选项(我们在反向代理后面有其他应用程序,但我们注意到我们在尝试修复此问题时不会破坏别的东西),我会想知道从应用程序/ MVC的角度来看会有什么选择。我端的代码有以下签名

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult ProcessForm(FormCollection form, Model model)
    {
        // code here
        return View("~/Views/viewpage.aspx");
    }

我到目前为止尝试做的是在viewpage.aspx的标题中添加这段代码

<% HttpContext.Current.Response.AppendHeader("Content-Type", "text/html");    %>

但它没有效果。还更新了代码,只是将视图返回到RedirectToAction,但在设置内容类型方面也没有任何区别

1 个答案:

答案 0 :(得分:0)

不确定它是否可用/适用于MVC1

您可能想尝试返回ContentResult而不是查看。您可以为ActionResult过滤器指定内容类型。

        public static string RenderViewAsString(string viewName, object model,
        ControllerContext controllerContext, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        viewData.Model = model;
        using (var stringWriter = new StringWriter())
        {
            var result = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
            result.View.Render(
                new ViewContext(controllerContext, result.View, viewData, tempData, stringWriter),
                stringWriter);
            return stringWriter.GetStringBuilder().ToString();
        }
    }

然后

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult ProcessForm(FormCollection form, Model model)
{
    // code here
    var resultAsString = RenderViewAsString("~/Views/viewpage.aspx", null, ControllerContext, ViewData, TempData);
    return Content(resultAsString, "text/html");
}