2013-07-17 7 views
6

मैं वर्तमान में एएसपी.नेट वेब एपीआई का उपयोग करके एएसपी.नेट एमवीसी वेबसाइट के कुछ हिस्सों को अपग्रेड कर रहा हूं। उन सुविधाओं में से एक जो हम एक और अधिक विश्वसनीय डिजाइन में जा रहे हैं फ़ाइल अपलोड है। क्लाइंट के लिए, हम एक jquery प्लगइन का उपयोग कर रहे हैं, ajaxForm, एक आईफ्रेम के निर्माण को लपेटने के लिए जो फ़ाइल इनपुट तत्व वाले फॉर्म को सबमिट करेगा। यह एएसपी.नेट एमवीसी के साथ बहुत अच्छा काम कर रहा था।आईई आईफ्रेम एप्लिकेशन/जेसन प्रतिक्रिया को ठीक से संभाल नहीं करता

हमारे वेब एपीआई एंडपॉइंट का उपयोग करने के लिए इसे बदलते समय, जो "एप्लिकेशन/जेसन" के एक सामग्री-प्रकार के साथ प्रतिक्रिया देता है, हमने इंटरनेट एक्सप्लोरर 9 के साथ समस्याएं देखीं। ऐसा लगता है कि AJAXForm सफलता समारोह कभी नहीं कहा गया था। जो मैं बता सकता हूं, उससे ऐसा लगता है कि आईई में आईफ्रेम डाउनलोड करने के लिए फ़ाइल अटैचमेंट के रूप में "एप्लिकेशन/जेसन" के एक सामग्री-प्रकार के साथ प्रतिक्रिया के शरीर को व्याख्या करता है। इसका मतलब है कि यह आईफ्रेम की "लोडेड" घटना को कभी भी नहीं चलाता है, जिसका अर्थ है कि AJAXForm ऑनलोड इवेंट हैंडलर कभी ट्रिगर नहीं किया जाएगा, और हमारे AJAXForm सफलता फ़ंक्शन को कभी भी नहीं बुलाया जाएगा।

हमने आईई 7 में भी इस मुद्दे को देखा, लेकिन हम फ़ायरफ़ॉक्स या क्रोम के नवीनतम रिलीज़ संस्करणों में इस मुद्दे को फिर से नहीं बना पाएंगे, भले ही उन्हें फॉर्मडाटा के साथ फ़ाइल एपीआई के बजाय आईफ्रेम का उपयोग करने के लिए मजबूर किया जा सके।

अब इस समस्या को हल करने के लिए, अब मैं प्रतिक्रिया-प्रकार को "टेक्स्ट/सादा" पर वापस मजबूर कर रहा हूं, जो कि हम एएसपी.नेट एमवीसी नियंत्रक कार्यों से पहले वापस लौट रहे थे, जो फ़ाइल अपलोड को संभाला था। यह सब कुछ फिर से काम करता है।

मेरे सवालों का:

  • वहाँ एक रास्ता मैं के रूप में "application/json" वेब एपीआई प्रतिक्रिया सामग्री प्रकार रख सकते और IE इसे सही ढंग से व्याख्या की है है?
  • क्या आईई और वेब एपीआई का उपयोग करते समय फ़ाइल अपलोड करने का कोई बेहतर तरीका है? शायद एक अलग प्लगइन या बेहतर तकनीक?

अतिरिक्त प्रतिबंध: मैं इस वेबसाइट के लिए ActiveX या Flash का उपयोग नहीं कर सकता। मैं एक अलग प्लगइन का उपयोग कर सकता हूं, लेकिन केवल अगर इसमें सामान्य क्रॉस-ब्राउज़र समर्थन है। (आईई, क्रोम, फायरफॉक्स, सफारी, आदि)

मेरे HTML:

<form id="uploadFormId" action="" method="post" enctype="multipart/form-data" encoding="multipart/form-data"> 
    <input type="file" name="files[]"/> 
</form> 

मेरे जावास्क्रिप्ट:

function onFileChange(e) { 
    if (e.type === e.originalEvent.type) { 
     var filePath = $(e.currentTarget).val(); 
     if (filePath !== '') { 
      $(this).closest('form').submit(); 
     } 
    } 
}; 

$(function() { 
    $('#uploadFormId').ajaxForm({ 
     url: "api/Files/1234", 
     dataType: 'json', 
     success: function (response) { 
      alert(response); 
     }, 
     error: function (xhr, status, error) { 
      alert(status); 
     } 
    }); 
    $('#uploadFormId input[type="file"]').bind('change', onFileChange); 
}); 

"application/json" प्रतिक्रिया हेडर (आईई में काम नहीं करता) :

Cache-Control:no-cache 
Content-Length:337 
Content-Type:application/json; charset=utf-8 
Date:Wed, 17 Jul 2013 13:10:47 GMT 
Expires:-1 
Pragma:no-cache 
Server:Microsoft-IIS/8.0 
X-AspNet-Version:4.0.30319 
X-Powered-By:ASP.NET 

"पाठ/सादे" प्रतिक्रिया हेडर (आईई में काम करता है):

Cache-Control:no-cache 
Content-Length:322 
Content-Type:text/plain 
Date:Wed, 17 Jul 2013 13:17:24 GMT 
Expires:-1 
Pragma:no-cache 
Server:Microsoft-IIS/8.0 
X-AspNet-Version:4.0.30319 
X-Powered-By:ASP.NET 

उत्तर

9

जब AJAXForm iframe सबमिशन मोड का उपयोग करता है, कॉल से प्रतिक्रिया अनिवार्य रूप से iframe के शरीर में प्रदान की जाती है। इसका अर्थ यह है कि यह एक सामग्री प्रकार होना चाहिए जो ब्राउजर प्रस्तुत कर सकता है-आम तौर पर एचटीएमएल, लेकिन text/plain भी काम पर होगा। हालांकि ब्राउज़र एक पृष्ठ के रूप में application/json प्रस्तुत नहीं कर सकता है।

text/plain भी उपयोग करते हुए, कि ब्राउज़रों में सामग्री-सूंघ सकता है यह, और HTML के रूप में संसाधन का इलाज हो, तो कुछ है कि डेटा में HTML टैग की तरह दिखता है के साथ एक विशिष्ट समस्या है। यदि आपका JSON उसमें उपयोगकर्ता द्वारा प्रदत्त डेटा के साथ वापस आता है, जो किसी को आपकी साइट पर एक्जिक्यूटिव जावास्क्रिप्ट इंजेक्ट करने की अनुमति दे सकता है (एक्सएसएस हमला)।

ajaxForm doc आप का पता लगाने जब कॉल AJAX के बजाय एक iframe पद से आता है, और उस मामले में एक पाठ क्षेत्र आवरण के साथ एक text/html प्रतिक्रिया वापसी की उम्मीद कर रहे हैं द्वारा सुझाव दिया गया है:

को दर्शाने के लिए आईफ्रेम मोड का उपयोग करते समय स्क्रिप्ट और जेएसओएन प्रतिक्रियाओं की चुनौतियां, फॉर्म प्लगइन इन प्रतिक्रियाओं को टेक्स्टरेरा तत्व में एम्बेड करने की अनुमति देता है और यह अनुशंसा की जाती है कि आप इन प्रतिक्रिया प्रकारों के लिए ऐसा करते हैं जब फ़ाइल अपलोड और पुराने ब्राउज़र के साथ संयोजन में उपयोग किया जाता है।

+0

"आईई 9 + इस तरह से व्यवहार क्यों करता है" के सवाल के लिए: उचित फ़ाइल प्रकार के रूप में एप्लिकेशन/जेसन का इलाज करना (किसी अन्य प्रारूप में स्नीफ करने के बजाय फ़ाइल डाउनलोड करना) आईई 9 के लिए एक सुरक्षा फिक्स था। – EricLaw

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