2012-07-14 8 views
5

मैं नैन्सी का उपयोग कर एक साधारण वेब एप्लिकेशन लिख रहा हूं। कम से कम एक अनुरोध अज्ञात लंबाई की धारा में परिणाम देता है, इसलिए मैं Content-Length प्रदान नहीं कर सकता। मैं Transfer-Encoding: chunked का उपयोग करना चाहता हूं, या (इस मामले में समान रूप से स्वीकार्य, Connection: close)।मैं नैन्सीएफएक्स में स्ट्रीम आउटपुट कैसे लिखूं?

मेरे पास नैन्सी स्रोत कोड पर एक त्वरित हैक है, और मैंने Response.BufferOutput और HttpContext.Response.BufferOutputfalse पर सेट करने के लिए कोड जोड़ा है। आप इसे यहां देख सकते हैं:

public class HomeModule : NancyModule 
{ 
    public HomeModule() 
    { 
     Get["/slow"] = _ => new SlowStreamResponse(); 
    } 

    private class SlowStreamResponse : Response 
    { 
     public SlowStreamResponse() 
     { 
      ContentType = "text/plain"; 
      BufferOutput = false; 
      Contents = s => { 
       byte[] bytes = Encoding.UTF8.GetBytes("Hello World\n"); 
       for (int i = 0; i < 10; ++i) 
       { 
        s.Write(bytes, 0, bytes.Length); 
        Thread.Sleep(500); 
       } 
      }; 
     } 
    } 

ऐसा कोई प्रतीत नहीं होता है। 5 सेकंड के बाद प्रतिक्रिया एक बार में बदल जाती है। मैंने इसे एक साधारण WebRequest-आधारित क्लाइंट का परीक्षण किया है।

मैं नैन्सी में काम करने के लिए खंडित आउटपुट कैसे प्राप्त करूं? मैं एएसपी.नेट होस्टिंग का उपयोग कर रहा हूं, लेकिन मुझे अन्य होस्टिंग विकल्पों के उत्तर में दिलचस्पी होगी।

अगर मैं HttpListener का उपयोग कर एक सरल सर्वर लिखते हैं, मैं true को SendChunked सेट कर सकते हैं, और यह chunked उत्पादन है, जो मेरी सरल ग्राहक सही ढंग मात्रा में प्राप्त करता है भेजता है।

+0

आपने नैन्सी कोड में HttpContext.Response.BufferOutput कहां सेट किया? और क्या आपको कभी ओविन के साथ काम करने का कोई तरीका मिला? – Hooligancat

+0

मुझे याद नहीं है, क्षमा करें। –

+0

इस प्रश्न पर चिह्नित उत्तर देखें => http://stackoverflow.com/questions/29953301/stream-an-sqlfile-stream-using-nancy – sp3tsnaz

उत्तर

4

प्रत्येक Write() के बाद आपको Flush() पर कॉल करना होगा, अन्यथा प्रतिक्रिया किसी भी तरह से बफर की जाती है। इसके अलावा, Google Chrome आउटपुट प्रस्तुत नहीं करता है जब तक कि यह सब प्राप्त नहीं हो जाता है।

मैंने इसे एक साधारण क्लाइंट एप्लिकेशन लिखकर खोजा जिसने प्रतिक्रिया स्ट्रीम से जो कुछ भी पढ़ा था, उसे लॉग किया था।

+0

तो क्या यह "क्रमबद्ध" है? –

+1

वास्तव में नहीं। 'बफर आउटपुट' परिवर्तन कोर नैन्सी में नहीं है, और यह केवल एएसपी.NET होस्टिंग के लिए वास्तव में काम करता है। डब्ल्यूसीएफ के लिए, आपको WebHttp बाइंडिंग को बदलना होगा, मुझे सही तरीके से काम करने के लिए स्वयं-होस्टिंग नहीं मिल सकता है, और मैं ओविन होस्टिंग के साथ ऐसा करने का कोई तरीका नहीं देख सकता। –

+0

@RogerLipscombe क्या आपने कभी इसके साथ कहीं भी जाना है? मैं इसे नैन्सीएफएक्स + एएसपी.नेट के साथ काम करने की कोशिश कर रहा हूं – RPM1984

5

मेरे प्रयोग के दौरान, मैंने पाया कि मुझे निम्न कॉन्फ़िगरेशन की आवश्यकता है। सबसे पहले, Nancy Wiki में प्रलेखित के रूप में अपनी web.config फ़ाइल सेट करें। यह ध्यान देने योग्य है कि disableoutputbuffer मान (जो हम चाहते हैं) सेट करने के लिए, ऐसा लगता है कि आपको वर्तमान में बूटस्ट्रैपर निर्दिष्ट करने की आवश्यकता है। Nancy.Hosting.Aspnet.DefaultNancyAspNetBootstrapper से प्राप्त होने वाली आपकी असेंबली में एक कक्षा बनाना और इसे कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट करना काम पर प्रतीत होता है।

<configSections> 
    <section name="nancyFx" type="Nancy.Hosting.Aspnet.NancyFxSection" /> 
</configSections> 
<nancyFx> 
    <bootstrapper assembly="YourAssembly" type="YourBootstrapper"/> 
    <disableoutputbuffer value="true" /> 
</nancyFx> 

बाद में, आपको Transfer-Encoding शीर्षलेख सेट नहीं करना चाहिए। न्यूनतम आकार से पहले पहले अन्य में दस्तावेज प्रस्तुत करने के लिए की वजह से

Get["/chunked"] = _ => 
{ 
    var response = new Response(); 
    response.ContentType = "text/plain"; 
    response.Contents = s => 
    { 
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("Hello World "); 
    for (int i = 0; i < 10; ++i) 
    { 
     for (var j = 0; j < 86; j++) 
     { 
     s.Write(bytes, 0, bytes.Length); 
     } 
     s.WriteByte(10); 
     s.Flush(); 
     System.Threading.Thread.Sleep(500); 
    } 
    }; 

    return response; 
}; 

मैं पिछले उदाहरण से हिस्सा प्रति अधिक सामग्री निर्दिष्ट: बल्कि, निम्नलिखित मार्ग परिभाषा को सही ढंग से करने के लिए अपने क्रोम आईआईएस एक्सप्रेस विकास सर्वर से परिणाम स्ट्रीम करने के लिए प्रकट होता है StackOverflow questions

0

यदि .NET 4.5+ का उपयोग कर रहे हैं, तो आप वैकल्पिक रूप से फ्लश के बजाय Stream.CopyTo का उपयोग कर सकते हैं।

Get["/chunked"] = _ => 
{ 
    var response = new Response(); 
    response.ContentType = "text/plain"; 
    response.Contents = s => 
    { 
    using(var helloStream = new MemoryStream(Encoding.UTF8.GetBytes("Hello World "))) 
     helloStream.CopyTo(s); 
    } 
    return response; 
} 
संबंधित मुद्दे