加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在ASP.NET MVC中设置空响应的Content-Type

发布时间:2020-12-16 07:15:50 所属栏目:asp.Net 来源:网络整理
导读:为了支持现场的遗留应用程序,我需要我的ASP.NET MVC应用程序返回一个也有Content-Type的空响应.当我发回null响应时,IIS,ASP.NET或ASP.NET MVC之一正在删除我的Content-Type.有没有办法解决? (虽然不需要设置Content-Type的空响应显然是理想的解决方案,但客
为了支持现场的遗留应用程序,我需要我的ASP.NET MVC应用程序返回一个也有Content-Type的空响应.当我发回null响应时,IIS,ASP.NET或ASP.NET MVC之一正在删除我的Content-Type.有没有办法解决?

(虽然不需要设置Content-Type的空响应显然是理想的解决方案,但客户已经在那里,其中许多都无法升级.)

编辑:由于存在代码请求:我正在将新Web应用程序的请求代理到旧客户端所依赖的请求.为此,我有一个ActionResult的子类,名为LegacyResult,您只需返回那些需要由旧软件处理的方法.这是其代码的相关部分:

public override void ExecuteResult(ControllerContext context)
    {
        using (var legacyResponse = GetLegacyResponse(context))
        {
            var clientResponse = context.HttpContext.Response;
            clientResponse.Buffer = false;
            clientResponse.ContentType = legacyResponse.ContentType; /* Yes,I checked that legacyResponse.ContentType is never string.IsNullOrEmpty */
            if (legacyResponse.ContentLength >= 0) clientResponse.AddHeader("Content-Length",legacyResponse.ContentLength.ToString());

            var legacyInput = legacyResponse.GetResponseStream();
            using (var clientOutput = clientResponse.OutputStream)
            {
                var rgb = new byte[32768];
                int cb;
                while ((cb = legacyInput.Read(rgb,rgb.Length)) > 0)
                {
                    clientOutput.Write(rgb,cb);
                }
                clientOutput.Flush();
            }
        }
    }

如果legacyInput有数据,则适当地设置Content-Type.否则,事实并非如此.我实际上可以克服旧的后端为完全相同的请求发送空的v.非空响应,并观察Fiddler的差异.

编辑2:使用Reflector调试显示,如果在调用HttpResponse.Flush时尚未写入标题,则Flush会自行写出标题.问题是它只写出一小部分标题.其中一个缺少的是Content-Type.所以看来,如果我可以强制标题输出到流,我可以避免这个问题.

解决方法

你必须通过错误地告诉它有内容来欺骗响应写入标题,然后 suppressing it:

/// [inside the writing block]
var didWrite = false;
while ((cb = legacyInput.Read(rgb,rgb.Length)) > 0)
{
  didWrite = true;
  clientOutput.Write(rgb,cb);
}
if (!didWrite)
{
  // The stream needs a non-zero content length to write the correct headers,but...
  clientResponse.AddHeader("Content-Length","1");
  // ...this actually writes a "Content-Length: 0" header with the other headers.
  clientResponse.SuppressContent = true;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读