سؤال

أنا يتدفقون PDF إلى المتصفح في ASP.NET 2.0.هذا يعمل في جميع المتصفحات عبر HTTP وجميع المتصفحات إلا أي عبر HTTPS.بقدر ما أعرف هذا العمل (على مدى 5 سنوات أو نحو ذلك) في جميع إصدارات IE, ولكن عملائنا قد بدأت مؤخرا فقط إلى تقرير القضايا.أظن عدم حفظ الصفحات المشفرة إلى القرص الأمن خيار يتم تعطيل بشكل افتراضي في مرحلة أصبحت تمكين افتراضيا (خيارات الإنترنت -> خيارات متقدمة -> الأمن).إيقاف هذا الخيار يساعد ، ، ولكن غير قابلة للتطبيق كما حل على المدى الطويل.

رسالة الخطأ أتلقى هو:

يتعذر على Internet Explorer تحميل OutputReport.من aspx www.sitename.com.

Internet Explorer لم يكن قادرا على فتح هذا الموقع على الانترنت.إما أن الموقع المطلوب غير متوفر أو لا يمكن العثور عليه.يرجى المحاولة مرة أخرى في وقت لاحق.

أداة تستخدم لإنشاء PDF هو ActiveReports من DataDynamics.مرة PDF إنشاء هنا هو رمز لإرسال عليه:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()  

ملاحظة:إذا لم تحدد صراحة cache-control ثم .صافي يرسل no-cache نيابة عني ، لذلك حاولت وضع ذاكرة التخزين المؤقت-التحكم:الخاصة أو العامة أو maxage=# لا يبدو أن العمل.

هنا هو تحريف:عند تشغيل العابث لتفقد رؤوس استجابة, كل شيء يعمل بشكل جيد.الرؤوس التي تصلني هي:

HTTP/1.1 200 OK
Cache-Control:max-age=1
التاريخ:الأربعاء, 29 Jul 2009 17:57:58 GMT
نوع المحتوى:application/pdf
الخادم:Microsoft-IIS 6.0/
MicrosoftOfficeWebServer:5.0_Pub
X-Powered-By:ASP.NET
X-AspNet-الإصدار:2.0.50727
ترتيب المحتوى:المرفق ؛ filename=بيان.pdf
المحتوى-ترميز:gzip
تختلف:تقبل ترميز
نقل-ترميز:المقسم

في أقرب وقت كما كنت تتحول العابث خارج وحاول مرة أخرى, أنه فشل مرة أخرى.واحد الشيء الآخر الذي لاحظته هو أنه عندما العابث يعمل لي هناك مشكلة مع هذا الموقع الشهادة رسالة تحذير لا بد لي من فوق الاستمرار في هذا الموقع (غير مستحسن) من خلال الحصول على.عندما عازف الكمان هو خارج ، لا تواجه هذا التحذير الأمني وأنه فشل الحق بعيدا.

أنا الغريب ما يحدث بين الكمان و المتصفح بحيث يعمل عند العابث يعمل ولكن فواصل عندما لا ولكن الأهم من ذلك هل من أحد لديه أي أفكار كيف يمكنني تغيير التعليمات البرمجية حيث تدفق ملفات Pdf على IE سوف يعمل من دون إجراء تغييرات على العميل الجهاز ؟

تحديث: عازف يتم حل المسائل, شكرا جزيلا EricLaw حتى الآن فإنه يتصرف باستمرار (مكسورة ، مع أو بدون عازف الكمان على التوالي).

على أساس البحث جوجل ، يبدو أن هناك الكثير من التقارير من هذه المشكلة نفسها في جميع أنحاء شبكة الإنترنت, كل مع انها تركيبة معينة من رؤوس استجابة التي يبدو أن حل المشكلة عن الحالات الفردية.لقد حاولت العديد من هذه الاقتراحات ، بما في ذلك إضافة ETag, LastModified تاريخ إزالة رأس Vary (باستخدام عازف الكمان) وعشرات من مجموعات من ذاكرة التخزين المؤقت-مراقبة و/أو Pragma رؤوس.حاولت "محتوى-نقل-ترميز:ثنائي" وكذلك "تطبيق/القوة-تحميل" عن ContentType.ساعدت شيئا حتى الآن.وهناك قليل مايكروسوفت KB المواد, جميعها تشير إلى أن Cache-Control:no-cache هو الجاني.أي أفكار أخرى ؟

تحديث: بالمناسبة اكتمال نفس هذه المشكلة تحدث مع Excel و Word النواتج كذلك.

تحديث: لم يحرز أي تقدم.لي بالبريد الإلكتروني .ساز الملف من عازف الكمان إلى EricLaw وكان قادرا على إعادة إنشاء المشكلة عند تصحيح أي ولكن لا توجد حلول حتى الآن.فضله سوف تنتهي...

هل كانت مفيدة؟

المحلول 2

بعد أسبوعين على خائب ، لم أكن قادرة على العثور على أي مزيج من تغييرات في التعليمات البرمجية التي من شأنها أن تسمح هذه الطريقة من تدفق PDF أو Excel أو Word المستندات عند 'عدم حفظ الصفحات المشفرة إلى القرص'الخيار تشغيل.

وقالت مايكروسوفت هذا السلوك حسب التصميم في عدد من مقالات و رسائل البريد الإلكتروني الخاصة.ويبدو أنه عندما 'عدم حفظ الصفحات المشفرة إلى القرص'تشغيل الخيار على أن أي يتصرف بشكل صحيح و ما هو قال أن تفعل. هذا المنصب هو أفضل مورد لقد وجدت حتى الآن أن يفسر لماذا هذا الإعداد سيكون تمكين إيجابيات وسلبيات مكنها من:

"إن 'عدم حفظ الصفحات المشفرة إلى القرص'يأتي دور عند التعامل مع SSL (HTTPS) اتصالات.تماما مثل خادم الويب يمكن أن يتم إرسال المعلومات حول كيفية ذاكرة التخزين المؤقت ملف واحد يمكن أن الأساس في تعيين Internet Explorer حتى يتم حفظ الملفات إلى ذاكرة التخزين المؤقت خلال SSL (HTTPS) اتصال بغض النظر إذا كان ملقم ويب تنصح يمكنك.

ما هو الاتجاه الصعودي تحول هذه الميزة على الأمن هو السبب رقم واحد لماذا يتم تشغيل ميزة.الصفحات لا يتم تخزينها في ملفات إنترنت المؤقتة ذاكرة التخزين المؤقت.

ما هو الجانب السلبي ؟ بطء الأداء ، حيث يتم حفظ أي شيء إلى ذاكرة التخزين المؤقت حتى أن 1 بايت صورة gif تستخدم عشرات المرات على الصفحة يجب أن تكون المنال من خادم الويب في كل مرة.لجعل الأمور أسوأ من ذلك بعض إجراءات المستخدم قد تفشل مثل الملفات التي تم تحميلها سيتم حذف خطأ عرض أو فتح وثائق PDF سوف تفشل في اسم بعض السيناريوهات."

أفضل حل يمكن أن نجد في هذه النقطة هو التواصل لعملائنا ومستخدمي أن البدائل موجودة إلى استخدام هذا الإعداد:

"استخدام 'فارغة" ملفات إنترنت المؤقتة "المجلد عند إغلاق المتصفح'.في كل مرة المتصفح يغلق جميع الملفات سيتم تطهير من ذاكرة التخزين المؤقت على افتراض عدم وجود قفل على ملف من مثيل آخر من متصفح أو تطبيق خارجي.

الكثير من إيلاء الاعتبار قبل استخدام 'عدم حفظ الصفحات المشفرة إلى القرص'.يبدو ميزة أمنية كبيرة ولكن من نتائج استخدام هذه الميزة قد تسبب المكالمات مكتب المساعدة على تحميل أعطال أو بطء الأداء."

نصائح أخرى

الخاص بك Cache-Control رأس هو غير صحيح.ينبغي أن يكون Cache-Control:max-age=1 مع اندفاعة في الوسط.في محاولة إصلاح هذا أولا لمعرفة ما إذا كان هذا يحدث فرقا.

عادة, أود أن أقول أن الاحتمال الأرجح هو رأس Vary, مثل رؤوس كثير من الأحيان يسبب مشاكل مع التخزين المؤقت في أي: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx.قد ترغب في محاولة إضافة ETAG إلى رؤوس استجابة.

عازف الكمان لا يجب أن يؤثر على cacheability (إلا إذا كنت قد كتبت قواعد), و يبدو أنك تقول ذلك ، مما يشير إلى أنه ربما هناك مشكلة التوقيت من نوع ما.

>عدم حفظ الصفحات المشفرة إلى القرص الأمن خيار يتم تعطيل بشكل افتراضي

هذا الخيار هو لا تزال معطلة بشكل افتراضي (في IE6, 7, 8), على الرغم من أنه يمكن للمسؤولين تشغيله عبر "نهج المجموعة" ، و بعض الشركات الكبرى تفعل ذلك.

بالمناسبة, السبب ترى الشهادة خطأ أثناء تشغيل عازف الكمان هو أنك لم انتخب الثقة العابث جذر الشهادة ؛ انظر http://www.fiddler2.com/fiddler/help/httpsdecryption.asp لمزيد من المعلومات حول هذا الموضوع.

كان لي مشكلة مماثلة مع ملفات PDF أردت أن تيار.حتى مع Response.ClearHeaders() رأيت Pragma و ذاكرة التخزين المؤقت-السيطرة على رؤوس وأضاف في وقت التشغيل.الحل هو مسح رؤوس في IIS (انقر بزر الماوس الأيمن -> خصائص على صفحة تحميل PDF, ثم "رؤوس Http" علامة التبويب).

لقد وجدت أن هذا يبدو أن العمل بالنسبة لي:

Dim browser As System.Web.HttpBrowserCapabilities = Request.Browser
If (browser.Browser = "IE") Then
  Response.AppendHeader("cache-control", "private") ' ie only
Else
  Response.AppendHeader("cache-control", "no-cache") ' all others (FF/Chrome tested)
End If

حلها:هذا أي مشكلة ، وليس من رابط...اصلاحها مع هذا: http://support.microsoft.com/kb/323308 يعمل مثالية بالنسبة لي ، بعد محاولة لفترة طويلة.

ATT:سيد الظلام

لقد واجهت مشكلة مشابهة منذ وقت طويل مرة أخرى - ماذا فعلنا نحن (هذا هو جافا EE).في تطبيق ويب التكوين نضيف

<mime-mapping>
    <extension>PDF</extension>
    <mime-type>application/octet-stream</mime-type>
</mime-mapping>

هذا سيجعل أي pdf القادمة من تطبيق الويب الخاص بك ليتم تحميلها بدلا من المتصفح تحاول أن تجعل.

تحرير:يبدو أنك يتدفقون ذلك.في هذه الحالة سوف تستخدم mime نوع التطبيق/ثماني بتات-الدفق في التعليمات البرمجية الخاصة بك و ليس في التكوين.حتى هنا بدلا من

Response.ContentType = "application/pdf"

سوف تستخدم

Response.ContentType = "application/octet-stream"

ما هو إصدار IE ؟ وأذكر أن أصدرت Microsoft إصلاح عاجل ل IE6 من أجل هذه المسألة.نأمل ذلك من استخدام بعض ؟

قرأت من ذاكرة التخزين المؤقت الخاصة بك-التحكم في مطاردة أوزة ، ولكن سوف أشارك الألغام ، التي تلبي احتياجات بلدي, في حال لم يساعد.

محاولة تعطيل ضغط gzip.

مضيفا أنه هنا على أمل أن شخصا ما قد تجد هذه مفيدة بدلا من الذهاب من خلال الروابط.

هنا هو بلدي رمز

    byte[] bytes = // get byte array from DB

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.Buffer = true;

    // Prevent this page from being cached.
    //  NOTE: we cannot use the CacheControl property, or set the PRAGMA header value due to a flaw re: PDF/SSL/IE
    Response.Expires = -1; 

    Response.ContentType = "application/pdf";
    // Specify the number of bytes to be sent
    Response.AppendHeader("content-length", bytes.Length.ToString());

    Response.BinaryWrite(bytes);    

            // Wrap Up
    Response.Flush();
    Response.Close();
    Response.End();

مثل البروتوكول الاختياري لاتفاقية كنت الخدش رأسي منذ أيام في محاولة للحصول على هذا العمل ، ولكن أنا فعلت هذا في النهاية إذا اعتقدت أن حصة بلدي 'تركيبة' من رؤوس:

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

نأمل أن يحفظ شخص ما في مكان ما بعض الألم!

كنت تعمل في مشكلة مشابهة مع محاولة تيار PDF عبر SSL ووضع هذا داخل iframe أو كائن.لقد وجدت أن بلدي صفحة aspx شأنها أن تبقي إعادة توجيه إلى عدم تأمين نسخة URL المتصفح ستمنع ذلك.

وجدت التبديل من صفحة ASPX إلى ASHX معالج إصلاح بلدي إعادة توجيه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top