2013-03-07 4 views
5

क्यों नहीं चल रहा है मैंने एक एएसपी.नेट एमवीसी 4 साइट के लिए एक httpHandler लिखा है जो एक छवि उत्पन्न करता है। ProcessRequest फ़ंक्शन नहीं कहा जा रहा है। क्यों कोई विचार?प्रेजेंटफैंडर

MVC4, आईआईएस एक्सप्रेस, विंडोज 8 प्रो

Web.config> system.webServer

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <remove name="TextImage" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
     <add name="TextImage" path="textimage/*.png" verb="*" resourceType="Unspecified" type="MultiStepUI.TextImageHandler, MultiStepUI_MOBETTER" /> 
    </handlers> 
    </system.webServer> 

उपयोग

<img src="/textimage/step1.png?q=Step 1&c=404040&w=30&h=250&z=12" /> 
+0

http://forums.asp.net/post/3416052.aspx –

+0

अच्छी तरह से, उस लिंक के लिए धन्यवाद, जो बताता है कि एक प्रेस्फोन्डर क्या है। दुर्भाग्य से मेरे प्रश्न के साथ बिल्कुल कुछ नहीं है। –

+0

yyyyyyep। स्वयं को ध्यान दें, skimming बंद करो। –

उत्तर

12

जवाब वेब पर पाया जा सकता है अगर कोई जानता है कि क्या देखना है।

एमवीसी रूटिंग इंजन नियंत्रक को सभी अनुरोधों को मैप करने का प्रयास करता है - जो हम इस मामले में नहीं चाहते हैं। Web.config में हैंडलर को पंजीकृत करने के अलावा हमें httpHandler path को अनदेखा करने के लिए एमवीसी रूट इंजन को बताने की आवश्यकता है ताकि एएसपी.नेट इंजन अपने रूटिंग को संभाल सके।

मैं example from Phil Haack

उपयोग करने के लिए लिंक रोट का मुकाबला करने के लिए इस लेख

डिफ़ॉल्ट रूप से से एक अंश है चुन लिया है, ASP.NET रूटिंग फ़ाइलों को नहीं है के लिए अनुरोध पर ध्यान नहीं देता डिस्क पर मौजूद है। मैंने पिछले पोस्ट में आगामी रूटिंग परिवर्तनों पर इसके कारण का समझाया। लंबी कहानी छोटी, हम पर छवियों जैसे स्थैतिक फ़ाइलों के अनुरोधों को रूट करने का प्रयास नहीं करना चाहते थे। दुर्भाग्यवश, इससे हमें सिरदर्द हुआ जब हमें याद आया कि एएसपी.NET की विशेषताएं .axd फ़ाइलों के लिए अनुरोध करती हैं जो डिस्क पर मौजूद नहीं हैं।

इसे ठीक करने के लिए, हम RouteCollection, IgnoreRoute, बनाता है कि एक मार्ग StopRoutingHandler मार्ग हैंडलर को मैप किया (वर्ग कि IRouteHandler लागू करता है) पर एक नया विस्तार विधि शामिल थे। प्रभावी रूप से, किसी भी अनुरोध से " मार्ग" को अनदेखा किया जाएगा, रूटिंग और सामान्य एएसपी.NET हैंडलिंग मौजूदा http हैंडलर मैपिंग के आधार पर अनदेखा कर दिया जाएगा। इसलिए हमारे डिफ़ॉल्ट टेम्पलेट में, आप देखेंगे कि हमारे पास निम्न मार्ग परिभाषित है।

मार्ग। इग्नोर रूट ("{resource} .axd/{* pathInfo}");

यह मानक .axd अनुरोधों को संभालता है। हालांकि, ऐसे अन्य मामले हैं जहां आप में उन फ़ाइलों के अनुरोध हैं जो डिस्क पर मौजूद नहीं हैं। उदाहरण के लिए, यदि आप सीधे एक HTTP हैंडलर को उस प्रकार पर पंजीकृत करते हैं जो IHttpHandler लागू करता है। Favicon.ico के लिए अनुरोधों का उल्लेख नहीं करना है कि ब्राउज़र स्वचालित रूप से बनाता है। एएसपी.NET रूटिंग इन अनुरोधों को को नियंत्रक को रूट करने का प्रयास करता है। इसका एक समाधान यह है कि रूटिंग को इन अनुरोधों को अनदेखा करना चाहिए, यह इंगित करने के लिए मार्ग को उचित अनदेखा करना है। दुर्भाग्यवश, हम ऐसा कुछ नहीं कर सकते:

{* पथ}।एएसपीएक्स/{* pathinfo}

हम केवल एक पकड़-सभी मार्ग की अनुमति देते हैं और इसे URL के अंत में होता है। हालांकि, आप निम्नलिखित दृष्टिकोण ले सकते हैं। इस उदाहरण में, मैंने निम्नलिखित दो मार्ग जोड़े।

मार्ग। इग्नोर रूट ("{* allaspx}", नया {allaspx = @ "। * \। Aspx (/.*)?"});
मार्ग। इग्नोर रूट ("{* फेविकॉन}", नया {फेविकॉन = @ "(। * /)? Favicon.ico (/.*)?"});

क्या मैं यहाँ कर रहा हूँ एक तकनीक Eilon मुझे पता चला है जो इन मार्गों, लिए किए गए सभी URL मैप करने के लिए, लेकिन फिर जो मार्गों बाधाओं शब्दकोश के माध्यम से अनदेखी करने के लिए प्रतिबंधित है। तो इस मामले में, इन मार्गों से मिलान होगा (और इस प्रकार अनदेखा) favicon.ico (चाहे कोई निर्देशिका चाहे) के साथ-साथ किसी .aspx फ़ाइल के लिए अनुरोधों के लिए सभी अनुरोध। चूंकि हमने इन अनुरोधों को अनदेखा करने के लिए रूटिंग को बताया है, इसलिए इन अनुरोधों की सामान्य एएसपी.NET प्रसंस्करण होगी।

+0

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। आलेख में यह सुधार था "डिफ़ॉल्ट रूप से, एएसपी.NET रूटिंग डिस्क पर मौजूद फ़ाइलों के लिए अनुरोधों को अनदेखा करता है।" –

0

पिछला उत्तर सही है, लेकिन आलेख यहां दिए गए अंश से संपादित किया गया है। उपेक्षा बयान पढ़ना चाहिए:

routes.IgnoreRoute("{*allaspx}", new {[email protected]".*\.aspx(/.*)?"}); 
routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}); 

नोट '*' में {* allaspx} और {* फ़ेविकॉन} तार कि मूल में याद आ रही है। मैं इसे तब तक काम नहीं कर सका जब तक कि मैंने लिंक का पालन नहीं किया और अद्यतन आलेख में उदाहरण का पालन किया।

+0

फ्रैंक, इसे इंगित करने के लिए धन्यवाद। लेख में कोई संपादन नहीं था। मैंने इसे पकड़ नहीं लिया, लेकिन एसओ मार्कडाउन रेंडरर ने सोचा कि ब्लॉक उद्धरण में '*' एस प्रारूपण नहीं कर रहा था, सामग्री नहीं। मैं उचित प्रतीकों से बच निकला हूं और अब ब्लॉक उद्धरण की सामग्री का उद्देश्य क्या होना चाहिए - हालांकि अब ब्लॉक उद्धरण के पीछे "वास्तविक" सामग्री प्रदान की गई चीज़ों से अलग है ... अगर यह कोई समझ में आता है। –