2010-12-27 20 views
5

Para admitir una aplicación heredada que está en el campo, necesito que mi aplicación ASP.NET MVC devuelva una respuesta vacía que también tiene un Content-Type. Uno de IIS, ASP.NET o ASP.NET MVC está eliminando mi Content-Type cuando devuelvo una respuesta nula. ¿Hay alguna forma de evitar esto?Configuración del tipo de contenido de una respuesta vacía en ASP.NET MVC

(Mientras que no requieren una respuesta vacía con un conjunto Content-Type, obviamente, sería la solución ideal, los clientes que ya están ahí fuera, y muchos de ellos no se pueden actualizar.)

EDITAR: Dado que hubo una solicitud de código: estoy procesando la solicitud de la nueva aplicación web a la que los clientes más antiguos confían. Para hacer esto, tengo una subclase de ActionResult, llamada LegacyResult, que simplemente puede devolver para aquellos métodos que necesitan ser manejados por el software anterior. Esta es la parte relevante de su código:

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(); 
      } 
     } 
    } 

Si legacyInput tiene datos, entonces Content-Type un valor apropiado. De lo contrario, no lo es. De hecho, puedo utilizar el viejo backend para enviar una respuesta vacía v. No vacía para exactamente la misma solicitud, y observar la diferencia en Fiddler.

EDIT 2: hurgando con reflector revela que, si los encabezados no se han escrito en el momento en que HttpResponse.Flush se llama, entonces Flush escribe ella misma los encabezados. El problema es que solo escribe un pequeño subconjunto de los encabezados. Uno de los desaparecidos es Content-Type. Entonces parece que, si puedo forzar encabezados a la corriente, puedo evitar este problema.

+0

Muestre su código, por favor. –

+0

Me pregunto si está vaciando la secuencia vacía? ¿Qué sucede si comenta todo después de configurar 'ContentType'? –

+0

Comentando todo después de que 'ContentType' no hace diferencia; el comportamiento es el mismo Esto termina siendo porque todavía se llama a 'Flush', pero por otro lado en la pila de ASP.NET. (En otras palabras, parece que la línea podría eliminarse sin efectos nocivos, pero al hacerlo tampoco cambia el comportamiento). –

Respuesta

8

Tienes que engañar a la respuesta por escrito las cabeceras, por falsamente diciendo que no hay contenido, a continuación, suppressing it:

/// [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; 
} 
Cuestiones relacionadas