Ben*_*ack 5 asp.net asp.net-mvc content-type
为了支持现场的遗留应用程序,我需要我的ASP.NET MVC应用程序返回一个空的响应,它也有一个Content-Type.Content-Type当我发回null响应时,IIS,ASP.NET或ASP.NET MVC之一正在删除我.有没有办法解决?
(虽然不需要空集的响应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, 0, rgb.Length)) > 0)
{
clientOutput.Write(rgb, 0, cb);
}
clientOutput.Flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果legacyInput有数据,则Content-Type适当设置.否则,事实并非如此.我实际上可以克服旧的后端为完全相同的请求发送空的v.非空响应,并观察Fiddler的差异.
编辑2:使用Reflector查看,如果在HttpResponse.Flush调用时没有写入头文件,则会Flush自己写出头文件.问题是它只写出一小部分标题.其中一个缺失的是Content-Type.所以看来,如果我可以强制标题输出到流,我可以避免这个问题.
你必须欺骗响应写入标题,错误地告诉它有内容,然后抑制它:
/// [inside the writing block]
var didWrite = false;
while ((cb = legacyInput.Read(rgb, 0, rgb.Length)) > 0)
{
didWrite = true;
clientOutput.Write(rgb, 0, 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3092 次 |
| 最近记录: |