2010-12-27 14 views
5

में एक खाली प्रतिक्रिया का सामग्री-प्रकार सेट करना फ़ील्ड में मौजूद विरासत अनुप्रयोग का समर्थन करने के लिए, मुझे एक खाली प्रतिक्रिया वापस करने के लिए मेरे एएसपी.नेट एमवीसी ऐप की आवश्यकता है जिसमें Content-Type भी है। आईआईएस, एएसपी.नेट, या एएसपी.नेट एमवीसी में से एक मेरे Content-Type को हटा रहा है जब मैं एक शून्य प्रतिक्रिया भेजता हूं। क्या इसके आसपास कोई रास्ता है?एएसपी.नेट एमवीसी

संपादित (जबकि एक सेट के साथ एक खाली प्रतिक्रिया की आवश्यकता नहीं Content-Type स्पष्ट रूप से आदर्श समाधान है, ग्राहकों को पहले से ही वहाँ बाहर हैं, और उनमें से कई उन्नत नहीं किया जा सकता है किया जाएगा।): के बाद से वहाँ एक था कोड के लिए अनुरोध: मैं नए वेब एप्लिकेशन से उस अनुरोध को प्रॉक्सी कर रहा हूं जिस पर पुराने ग्राहक भरोसा करते हैं। ऐसा करने के लिए, मेरे पास 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(); 
      } 
     } 
    } 

तो legacyInput डेटा है, तो Content-Type उचित रूप से सेट किया गया है: यह अपने कोड के प्रासंगिक हिस्सा है। अन्यथा, यह नहीं है। मैं वास्तव में वही अनुरोध के लिए एक खाली वी। खाली रिक्त प्रतिक्रिया भेजने के लिए पुरानी बैकएंड को जोड़ सकता हूं, और फिडलर में अंतर का निरीक्षण कर सकता हूं।

संपादित 2: परावर्तक साथ आसपास poking है कि, अगर हेडर बार हुआ है कि HttpResponse.Flush कहा जाता है पर लिखा नहीं किया गया है, तो Flush बाहर हेडर ही लिखते हैं पता चलता है। समस्या यह है कि यह केवल हेडर के एक छोटे से सबसेट लिखता है। गायब लोगों में से एक Content-Type है। तो ऐसा लगता है कि, अगर मैं धारावाहिकों को धारा में मजबूर कर सकता हूं, तो मैं इस समस्या से बच सकता हूं।

+0

, अपने कोड दिखाएं करें। –

+0

मुझे आश्चर्य है कि क्या यह खाली स्ट्रीम फ्लश कर रहा है? यदि आप 'ContentType' सेट करने के बाद सब कुछ टिप्पणी करते हैं तो क्या होता है? –

+0

'ContentType' के बाद सब कुछ टिप्पणी करने में कोई फर्क नहीं पड़ता; व्यवहार वही है। यह समाप्त होता है क्योंकि 'फ्लश' अभी भी बुलाया जाता है, लेकिन एएसपी.NET स्टैक में कहीं और। (दूसरे शब्दों में, ऐसा प्रतीत होता है कि किसी भी दुष्प्रभाव के साथ लाइन को हटाया जा सकता है, लेकिन ऐसा करने से व्यवहार में कोई बदलाव नहीं होता है।) –

उत्तर

8

आप हेडर लेखन, झूठा यह बताकर में प्रतिक्रिया चाल करने के लिए है वहाँ सामग्री है, तो 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; 
} 
संबंधित मुद्दे