سؤال

أقوم بإرسال ملف للمستخدم باستخدام HTTPhandler. على جميع المتصفحات، بعد عرض / تنزيل الملف مرة واحدة على الأقل، يتوقف المتصفح / التطبيق على طرق العرض / التنزيلات اللاحقة. هنا هو الرمز:

    private void TransmitFile(HttpContext context, string filePath, string downloadName, bool forceDownload)
    {
        if (File.Exists(filePath))
        {
            string fileName = System.IO.Path.GetFileName(filePath);
            string extension = Path.GetExtension(filePath);
            FileInfo fileInfo = new FileInfo(filePath);

            // set the response info/headers
            context.Response.ClearContent();
            context.Response.ClearHeaders();
            context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            if (forceDownload)
            {
                context.Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName.Replace(" ", "_") + extension);
                context.Response.BufferOutput = false;
            }

            string type = "";
            // set known types based on file extension  
            if (extension != null)
            {
                switch (extension.ToLower())
                {
                    case ".tif":
                    case ".tiff":
                        type = "image/tiff";
                        break;
                    case ".jpg":
                    case ".jpeg":
                        type = "image/jpeg";
                        break;
                    case ".gif":
                        type = "image/gif";
                        break;
                    case ".doc":
                    case ".rtf":
                        type = "Application/msword";
                        break;
                    case "pdf":
                        type = "Application/pdf";
                        break;
                    case "png":
                        type = "image/png";
                        break;
                    case "bmp":
                        type = "image/bmp";
                        break;
                    default:
                        type = "application/octet-stream";
                        break;
                }
            }

            context.Response.ContentType = type;
            context.Response.TransmitFile(filePath);
            context.Response.Flush();
        }
        else
        {
            Immersive.Diagnostics.Log.Warn("Requested file does not exist: " + filePath, this);
            Immersive.Diagnostics.Log.Warn("", this);
        }
    }

لقد قرأت أن استدعاء الاستجابة. close () والاستجابة. أدخل () ليست فكرة جيدة؟ لقد جربوا كلاهما مغادرتين، وإزالته، وما زال يحدث.

تعديل:

يبدو أن إرسال القضايا المعروفة. يمكن العثور على شرح أكثر شمولا في:http://www.improve.dk/blog/2008/03/29/Response-Transmitfile-close-will-kill-your-application.

لقد قمت بإزالة TransmitFile وتغيرت إلى كتابة، ويعمل الآن تماما.

context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
هل كانت مفيدة؟

المحلول

قد تكون هذه مشكلة معروفة إذا كان الخادم الذي تقوم بتنزيله من يدير Windows Server 2003 المزود بحزمة الخدمة SP1.

هنا هو الإصلاح العاجل: http://support.microsoft.com/kb/902780.

أيضا، تحقق مما إذا كان لديك OutputCache ممكن على الصفحة، إذا كان الأمر كذلك، جرب التنزيل مرة أخرى دون ذلك.

نصائح أخرى

أي سبب أنت لا تستخدم التخزين المؤقت؟ أنت تدفق () جي على الرغم من أنك لا تستخدمه. ونعم، أعتقد أنه يجب عليك أيضا إجراء استجابة. عند () بعد التدفق ().

اسمحوا لي أن أعرف إذا كان هذا يعمل وربما يمكنني تشغيل بعض الاختبارات الخاصة بي.

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