تقديم عرض إلى سلسلة متبوعة بإعادة توجيه النتائج في استثناء

StackOverflow https://stackoverflow.com/questions/1149068

سؤال

إذن إليك المشكلة: أقوم بإرسال رسائل البريد الإلكتروني التي سيتم إرسالها بواسطة طلبي من خلال تقديم صفحات عرض كاملة إلى السلاسل وإرسالها. يعمل هذا دون أي مشكلة طالما أنني لا أعيد توجيه عنوان URL آخر على الموقع بعد ذلك. كلما حاولت، أحصل على "system.web.httpexception: لا يمكن إعادة توجيه بعد إرسال رؤوس HTTP."

أعتقد أن المشكلة تأتي من حقيقة إعادة استخدام السياق من إجراء تحكم حيث تأتي الدعوة لإنشاء البريد الإلكتروني من. وبشكل أكثر تحديدا، فإن httpresponse من السياق. لسوء الحظ، لا يمكنني إنشاء HTTPRESPONSE جديدة تستخدم استخدام HTTPRITER لأن منشئ هذا الفصل غير قابل للوصول، واستخدام أي فئة أخرى مشتقة من TextWriter يؤدي إلى استجابة Response.Flush () لرمي استثناء، نفسه.

هل لأحد حل لهذا؟

    public static string RenderViewToString(
        ControllerContext controllerContext,
        string viewPath,
        string masterPath,
        ViewDataDictionary viewData,
        TempDataDictionary tempData)
    {
        Stream filter = null;
        ViewPage viewPage = new ViewPage();

        //Right, create our view
        viewPage.ViewContext = new ViewContext(controllerContext,
            new WebFormView(viewPath, masterPath), viewData, tempData);

        //Get the response context, flush it and get the response filter.
        var response = viewPage.ViewContext.HttpContext.Response;
        //var response = new HttpResponseWrapper(new HttpResponse
        //    (**TextWriter Goes Here**));
        response.Flush();
        var oldFilter = response.Filter;

        try
        {
            //Put a new filter into the response
            filter = new MemoryStream();
            response.Filter = filter;

            //Now render the view into the memorystream and flush the response
            viewPage.ViewContext.View.Render(viewPage.ViewContext,
                viewPage.ViewContext.HttpContext.Response.Output);
            response.Flush();

            //Now read the rendered view.
            filter.Position = 0;
            var reader = new StreamReader(filter, response.ContentEncoding);
            return reader.ReadToEnd();
        }
        finally
        {
            //Clean up.
            if (filter != null)
                filter.Dispose();

            //Now replace the response filter
            response.Filter = oldFilter;
        }
    }
هل كانت مفيدة؟

المحلول

يجب عليك البدء في طلب جديد. بت، هل تريد حقا إرسال رسائل البريد الإلكتروني بطريقة متزامنة بهذه الطريقة؟ إذا كان خادم البريد لأسفل، فقد ينتظر المستخدم جيدا.

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

نهج واحد آخر هو عدم إعادة توجيه ولكن اكتب صفحة مع علامة إعادة توجيه التعريف

نصائح أخرى

فيما يلي طريقة بديلة لتقديم وجهة نظر إلى سلسلة لا تؤدي أبدا إلى إخراج البيانات إلى الاستجابة (لذلك يجب تجنب مشكلتك): http://callycodeblog.com/2010/05/15/asp-net-mvc-render-partial-vareview-to-string/

لتقديم عرض منتظم بدلا من وجهة نظر جزئية، ستحتاج إلى تغيير "Viewengines.engines.findpartialView" إلى "Viewengines.engines.findView".

إلقاء نظرة على MVC Contriby EmailTemperService الذي يفعل بالضبط ما أنت بعد.

http://mvccontrib.googlecode.com/svn/trunk/src/mvccontrib/services/emailtemplateservice.cs.

آسف كريس، وليس متأكدا تماما ما كنت أفكر فيه ولكن من الواضح أنني لم أقرأ السؤال. على الرغم من أنني لا أستطيع أن أعطيك طريقة حول هذا الأمر، يمكنني أن أخبرك لماذا تحصل على الخطأ - HTTPRESPONSE.FLUSH () يرسل الرؤوس قبل مسح المحتوى إلى عامل التصفية الخاص بك. يحدد هذا علامة داخل الاستجابة بحيث تكون عند محاولة إعادة توجيهك إلى الاستثناء.

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

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