2012-09-12 17 views
12

तोड़ दी है मैंने वीएस 2012 स्थापित किया है और कुछ वेब परियोजनाओं पर सफलतापूर्वक इसका उपयोग कर रहा हूं, लेकिन इसके साथ कुछ ने मेरी वेब सेवा प्रोजेक्ट को तोड़ने का कारण बना दिया है। मैं अभी भी वेब सेवा प्रोजेक्ट पर वीएस 2010 का उपयोग कर रहा हूं और 2012 में इसे खोला नहीं है।विजुअल स्टूडियो 2012 इंस्टॉल ने मेरी 2010 डब्ल्यूसीएफ परियोजना

सब कुछ संकलित और सही तरीके से काम करता है सिवाय इसके कि जब यह मेरे संदर्भित वेबलॉग प्रोजेक्ट में किसी वर्ग का उदाहरण बनाने का प्रयास करता है, तो यह इसे फेंकता है त्रुटि:

यह विधि या संपत्ति HttpRequest.GetBufferlessInputStream के बाद समर्थित नहीं है।

मुझे इस परियोजना में कहीं भी नहीं मिल रहा है जहां GetBufferlessInputStream स्पष्ट रूप से उपयोग किया जाता है।

यदि मैं वेबलॉग कोड पर कूदता हूं, तो सब ठीक से निष्पादित होता है।

मैं किसी और को नहीं ढूंढ सकता जिसने यह त्रुटि प्राप्त करने और इसे कम करने के लिए यह त्रुटि प्राप्त की है, किसी भी विचार को कहां से शुरू करना है?

ढेर

at System.Web.HttpRequest.get_InputStream() 
    at OAS.Web.Log.WebEvent..ctor(EventType type, HttpContext context, String applicationName) 
    at OAS.Web.Log.WebTrace..ctor(HttpContext context, String applicationName) 
    at OAS.Web.AdvisorServices.Extensions.OperationLoggerParameterInspector.BeforeCall(String operationName, Object[] inputs) in C:\SourceControl\OAS\IM.NET3.0\Web\AdvisorServices\OAS.Web.AdvisorServices.Extensions\OperationLogger\OperationLoggerParameterInspector.cs:line 54 



** संपादित - बोनस प्रश्न

क्यों इन फ्रेमवर्क 4.5 गुण मेरी 4.0 समाधान प्रभावित कर रहे हैं?

+0

मुझे लगता है कि हाँ ... लेकिन क्या आपने अपना समाधान "साफ" किया था? – zapico

+1

बस साफ और पुनर्निर्मित, कोई बदलाव नहीं। एक माइक्रोसॉफ्ट लड़के का जवाब यहां था, लेकिन अब यह चला गया। ने कहा कि मुझे एक HttpModule बनाने की कोशिश करनी चाहिए जिसे डब्ल्यूसीएफ मॉड्यूल कहने से पहले get_InputStream को कॉल करना चाहिए और यह ReadEntityBodyMode प्रॉपर्टी को किसी के बजाए क्लासिक में मजबूर नहीं करेगा, लेकिन मुझे यकीन नहीं था कि wcf से पहले हिट करने के लिए मेरे मॉड्यूल को कैसे मजबूर किया जाए । –

+0

बोनस: आपको यह करने से नफरत है, लेकिन http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c05a8c02-de67-47a9-b4ed-fd8b622a7e4a देखें। संक्षिप्त उत्तर: .NET 4.5 एक इन-प्लेस अपग्रेड है, और असल में .NET 4.0 में बग को हल करता है। –

उत्तर

27

नोट: यह समस्या .NET 4.5.1 में तय की गई है। आप 4.5.1 के साथ फिक्स देख सकते हैं। आपके पास .NET 4.5.1 हो जाने के बाद, पुराने व्यवहार पर वापस जाने के लिए निम्न ऐप सेटिंग सेट करें।

<configuration>  
<appSettings> 
     <add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" /> 
</appSettings> 
</configuration> 

यहाँ कैसे आप "क्लासिक" होने के लिए ReadEntityBodyMode मजबूर करने के लिए एक HttpModule बना सकते हैं: (? क्यों इन फ्रेमवर्क 4.5 गुण मेरी 4.0 समाधान प्रभावशाली रहे हैं कर रहे हैं) http://blogs.msdn.com/b/praburaj/archive/2012/09/13/accessing-httpcontext-current-request-inputstream-property-in-aspnetcompatibility-mode-throws-exception-this-method-or-property-is-not-supported-after-httprequest-getbufferlessinputstream-has-been-invoked.aspx

अपने अन्य सवाल का जवाब करने के लिए: .NET 4.5 .NET 4.0 का एक इन-प्लेस अपग्रेड है। इसलिए यदि आपकी परियोजना 4.0 को लक्षित कर रही है, क्योंकि वीएस 2012 4.5 रनटाइम स्थापित करता है, तो 4.5 व्यवहार में से कुछ प्रभावी होते हैं।

संपादित

ब्लॉग प्रविष्टि:

.net 4.5 WCF में scalability लाभ के लिए बफर कम इनपुट धारा का लाभ लिया। नतीजतन जब आप HttpContext.Current.Request.InputStream प्रॉपर्टी तक पहुंचने का प्रयास करते हैं, तो आप नीचे दिए गए अपवाद के साथ समाप्त हो सकते हैं, क्योंकि इनपुटस्ट्रीम प्रॉपर्टी क्लासिक स्ट्रीम को संभालने का प्रयास करती है क्योंकि वे दोनों असंगत हैं।

“This method or property is not supported after HttpRequest.GetBufferlessInputStream has been invoked.”

आप एक WCF 4.0 अनुप्रयोग जो पूरी तरह से 4 करने के लिए अपने .नेट फ्रेमवर्क के उन्नयन पर लेकिन काम किया था।

  • जो प्रत्येक अनुरोध के लिए InputStream संपत्ति का उपयोग करने से पहले WCF पढ़ता ही WCF परियोजना में एक सरल HttpModule जोड़ें: 5 आप सेवा इस संपत्ति तक पहुँचने में नाकाम रहने पर नोटिस, यहाँ तरीके से काम के आसपास मुद्दा है ऐसा इसलिए है कि यह HttpContext.Request.ReadEntityBody को "क्लासिक" होने के लिए लागू करेगा और संगतता सुनिश्चित करेगा।

    public class WcfReadEntityBodyModeWorkaroundModule : IHttpModule  
    {  
        public void Dispose() { } 
    
        public void Init(HttpApplication context) {  
         context.BeginRequest += context_BeginRequest;  
        }  
    
        void context_BeginRequest(object sender, EventArgs e) { 
         //This will force the HttpContext.Request.ReadEntityBody to be "Classic" and will ensure compatibility..  
         Stream stream = (sender as HttpApplication).Request.InputStream;  
        }  
    } 
    
  • रजिस्टर अपने web.config में इस मॉड्यूल <configuration><modules> सेटिंग में इन पंक्तियों को जोड़ने के द्वारा।

    <system.webServer> 
        <modules> 
         <!-- Register the managed module --> 
         <add name="WcfReadEntityBodyModeWorkaroundModule" type="MyAssembly.WcfReadEntityBodyModeWorkaroundModule, MyAssembly" /> 
        </modules> 
    
  • आप क्लासिक मोड में कोई एप्लिकेशन पूल का उपयोग कर रहे हैं, तो आप web.config में इस खंड के लिए मॉड्यूल जोड़ने की आवश्यकता होगी: अपनी परियोजना नहीं किया जा सकता है, तो

    <system.web> 
        <httpModules> 
         <add name="WcfReadEntityBodyModeWorkaroundModule" type="MyAssembly.WcfReadEntityBodyModeWorkaroundModule, MyAssembly" /> 
        </httpModules> 
    

संशोधित, फिर आप इस एचटीपी मॉड्यूल को एक अलग असेंबली में लिख सकते हैं, जीएसी इसे अलग से और web.config में इस मॉड्यूल को पंजीकृत कर सकते हैं।

अब सेवा की पहुंच करने का प्रयास करें जो आपके लिए सफल होना चाहिए!

+4

यह आज मेरे गधे को बचाया। धन्यवाद! –

+0

मेरे गधे को बचाया # 2 – Paden

+1

मुझे नहीं पता कि क्यों, लेकिन यह मेरे लिए काम नहीं किया है। मैंने WcfReadEntityBodyModeWorkaround मॉड्यूल कोड की प्रतिलिपि बनाई और मॉड्यूल कॉन्फ़िगरेशन को web.config में जोड़ा। ReadEntityBodyMode अभी भी बफरलेस है। मैं 4.5 का उपयोग कर रहा हूँ। क्या इसके लिए कुछ और है? – bsayegh

संबंधित मुद्दे