2010-12-27 10 views
5

Per supportare un'applicazione legacy presente nel campo, ho bisogno della mia app ASP.NET MVC per restituire una risposta vuota che ha anche un Content-Type. Uno di IIS, ASP.NET o ASP.NET MVC sta rimuovendo il mio Content-Type quando invio una risposta nulla. C'è un modo per aggirare questo?Impostazione del tipo di contenuto di una risposta vuota in ASP.NET MVC

(pur non richiedendo una risposta vuota con una serie Content-Type sarebbe ovviamente la soluzione ideale, i clienti sono già là fuori, e molti di loro non possono essere aggiornati.)

EDIT: Poiché non v'è stato un richiesta di codice: sto trasmettendo la richiesta dalla nuova applicazione web a quella su cui i client più vecchi fanno affidamento. Per fare questo, ho una sottoclasse di ActionResult, chiamata LegacyResult, che puoi semplicemente restituire per quei metodi che devono essere gestiti dal vecchio software. Questa è la parte rilevante del suo codice:

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

Se legacyInput ha dati, quindi Content-Type è impostato in modo appropriato. Altrimenti, non lo è. Posso effettivamente usare il vecchio backend per inviare una risposta vuota non vuota per esattamente la stessa richiesta, e osservare la differenza in Fiddler.

EDIT 2: Frugando in giro con riflettore rivela che, se le intestazioni non sono stati scritti nel momento in cui HttpResponse.Flush si chiama, quindi Flush scrive le intestazioni stesso. Il problema è che scrive solo un piccolo sottoinsieme delle intestazioni. Uno di quelli mancanti è Content-Type. Quindi, se riesco a forzare le intestazioni verso il flusso, posso evitare questo problema.

+0

Mostra il codice, per favore. –

+0

Mi chiedo se Flushing il flusso vuoto? Cosa succede se commentate tutto dopo aver impostato 'ContentType'? –

+0

Commentare tutto dopo il 'ContentType' non fa differenza; il comportamento è lo stesso. Ciò risulta essere dovuto al fatto che "Flush" viene ancora chiamato, ma da altrove nello stack ASP.NET. (In altre parole, sembra che la linea possa essere rimossa senza effetti negativi, ma farlo non cambia il comportamento, neanche). –

risposta

8

si deve ingannare la risposta a scrivere le intestazioni, dicendo falsamente che c'è contenuto, quindi 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; 
} 
Problemi correlati