2011-12-14 9 views
5

हम 4.0 फ्रेमवर्क पर चल रहे एएसपी.नेट एमवीसी 3 एप्लिकेशन के 3.5 फ्रेमवर्क का उपयोग करके एएसपी.नेट एमवीसी 2 एप्लिकेशन को अपग्रेड करने में व्यस्त हैं।एएसपी.नेट एमवीसी 3: एचटीटीपी हेडर भेजे जाने के बाद सर्वर हेडर नहीं जोड़ सकता

एक ऐसा पृष्ठ है जो ब्राउज़र बैक बटन का उपयोग करके संपर्क करते समय अपवाद फेंकता है। इस पृष्ठ पर ब्राउज़र बैक बटन का समर्थन करने के लिए हमने एक सिस्टम लागू किया है जो पृष्ठ पर वापस आने पर उस पृष्ठ के परिणामों के लिए अनुरोध करता है। मेरे पास कोई स्पष्ट संकेत तथापि के बाद से मैं इस समस्या को देखने के लिए जहां हमेशा ही त्रुटि

Server cannot append header after HTTP headers have been sent. 
स्टैकट्रेस

at System.Web.HttpResponse.AppendHeader(String name, String value) 
at System.Web.HttpResponseWrapper.AppendHeader(String name, String value) 
at System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase httpContext) 
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2() 
at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() 
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) 
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

साथ

कैसे आ HTTP हेडर पहले ही भेजा गया है खोजने के लिए है?

अग्रिम धन्यवाद, IvanL

संपादित करें: मैं नई जानकारी और अंतर्दृष्टि द्वारा जोड़ा जा रहा मैं, जबकि इस समस्या के लिए शिकार प्राप्त की। Asynch नियंत्रक ने जवाबों में से एक का उल्लेख मुझे आश्चर्यचकित कर दिया। जब मैंने पाया कि मैं काम करने के लिए वर्ष MVC2 विधि के लिए निम्नलिखित बदलना पड़ा:

[HttpPost, ValidateInput(false)] 
public void SearchResultOverview(SearchResultViewModel model, string searchUrl) 
{ 
    if (!string.IsNullOrEmpty(searchUrl)) 
    { 
     searchUrl = searchUrl.Replace("SearchPartial", "SearchPartialInternal"); 

     //NOTE MVC 3 
     HttpContext.Server.TransferRequest(searchUrl, true); 

     //NOTE MVC 2 
     //System.Web.HttpContext.Current.RewritePath(searchUrl, false); 

     //IHttpHandler httpHandler = new MvcHttpHandler(); 
     //// Process request 
     //httpHandler.ProcessRequest(System.Web.HttpContext.Current); 
    } 
} 

जब मैं TransferRequest विधि मैंने पाया यह Performs an asynchronous execution of the specified URL and preserves query string parameters. (http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transferrequest.aspx)

भी है कि वहाँ एक अपवाद है ऊपर देखा मैंने जो अपवाद पोस्ट किया था, उससे पहले फेंक दिया गया था (जब से मैंने अपवाद को देर से खरीदा था तब से मैं बस इसे छोड़ दिया था)। यह अपवाद है:

The SessionStateTempDataProvider class requires session state to be enabled. 
    at System.Web.Mvc.SessionStateTempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary`2 values) 
    at System.Web.Mvc.TempDataDictionary.Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider) 
    at System.Web.Mvc.Controller.PossiblySaveTempData() 
    at System.Web.Mvc.Controller.ExecuteCore() 
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 
    at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d() 
    at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) 
    at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

तो मैं यह काम कैसे कर सकता हूं?

+2

ठीक है, मुझे देखने अगर मैं यह मान सकते हैं इस psychicly ... ... ... उम्म .. नहीं .. आप कुछ कोड प्रदान करने के लिए करने जा रहे हैं। आप कौन से शीर्षलेख जोड़ रहे हैं, और कब? –

+1

शायद यह मदद मिलेगी: http://stackoverflow.com/questions/2383169/server-cannot-set-status-after-http-headers-have-been-sent-iis7-5 –

+1

@Mystere मैन: यह बिल्कुल सही बात है। मैं खुद को किसी भी शीर्षलेख में शामिल नहीं कर रहा हूं, ऐसा लगता है कि एमवीसी 2 से एमवीसी 3 में बदलने से यह समस्या उत्पन्न हुई क्योंकि कोड एमवीसी 2 में किसी भी अपवाद के बिना ठीक चलाता है। यदि आप स्टैकट्रैक में देखते हैं तो आप नोटिस करते हैं: 'System.Web.Mvc.MvcHandler.AddVersionHeader (HttpContextBase httpContext) पर जिसका अर्थ है कि एमवीसी स्वयं ही हेडर जोड़ने की कोशिश कर रहा है, लेकिन यह नहीं कर सकता है। मैंने उस प्रश्न का समाधान करने का प्रयास किया जिसे आपने मुझे 'reponse.BufferOutput = true' से जोड़ा है लेकिन यह काम नहीं करता है। मुझे हमेशा यह अपवाद और स्टैकट्रैक प्राप्त होता है। – IvanL

उत्तर

2

अच्छी खबर है, आज मैं अपवाद के कारण की गहन छानबीन के बाद अपने ही समस्या हल हो। पहली कड़ी है कि मुझे समझ में वास्तव में क्या मेरी अपवाद और त्रुटियों का कारण हो सकता है मदद की निम्नलिखित: http://www.eggheadcafe.com/tutorials/asp-net/79c73563-408a-493e-a369-d4b380bce549/aspnet-using-servertransferrequest.aspx

यह Server.TransferRequest के कामकाज का विवरण और सभी महत्वपूर्ण चेतावनी का उल्लेख है: सत्र मुख्य अनुरोध द्वारा जारी किया जाना चाहिए बच्चे के अनुरोध को स्थानांतरित करने से पहले। मैं कैसे MVC के साथ ऐसा होता है की गहन जानकारी के मैं stackoverflow पर निम्नलिखित पोस्ट यहाँ भर में आया था: How to simulate Server.Transfer in ASP.NET MVC?

बदले में इस पोस्ट में मुझे एक अत्यंत महत्वपूर्ण बात की ओर इशारा किया है पता करने के: throw new ApplicationException("TempData won't work with Server.TransferRequest!"); तो मैं TransferResult वर्ग पाया जा सकता है बनाया उस पोस्ट में और जिन कार्यों को जरूरी है उन्हें उस बिंदु के माध्यम से लौटाने दें। मैंने पाया कि इस अपवाद को उन विशिष्ट मामलों में मारा जा रहा था जिन्हें मैंने पहले उल्लेख किया था। मैंने खुद टेम्पाडाटा का कभी भी उपयोग नहीं किया लेकिन स्पष्ट रूप से मेरे सहयोगियों में से एक ने किया।

महत्वहीन डेटा की प्रकृति के अंदर मैं किसी भी Server.TransferRequest() जो बना मेरी अपवाद और समस्याओं सूरज को बर्फ की तरह पिघल से पहले TempData Clear() करने का निर्णय लिया के कारण।

मैं उन सभी लोगों का शुक्रिया अदा करना चाहता हूं जो इस समस्या को हल करने के लिए देख रहे हैं और मुझे खुशी है कि मैं एक समापन निष्कर्ष और समाधान प्रदान कर सकता हूं ताकि यह उन समस्याओं को लाभ पहुंचा सके जो एक ही समस्या को देख रहे हैं।

निष्ठा से, IvanL

+0

क्या आपको पता है कि ट्रांसफररवेस्ट को कॉल करने से पहले हमें टेम्पपडाटा में डेटा की जांच क्यों करनी है? – yurart

+1

@yurart जैसा ऊपर उल्लिखित सत्र राज्य जारी किया जाना चाहिए और tempdata सत्र को 'लॉक' लगता है जिससे आप अनुरोध को स्थानांतरित करने में असमर्थ हो जाते हैं। उत्तर के लिए – IvanL

+0

धन्यवाद – yurart

2

यह तब हो सकता है जब पृष्ठ पर बफरिंग बंद कर दी गई हो। बफरिंग का मतलब है कि एएसपीनेट प्रतिक्रिया भेजने से पहले पूरे अनुरोध को पूरा करने की प्रतीक्षा करता है। इसका मतलब है कि हेडर किसी भी समय बदला जा सकता है। जब बफरिंग बंद होती है, तो आउटपुट क्लाइंट को भेजा जाता है क्योंकि यह उत्पन्न होता है। इसलिए आप हेडर को इच्छानुसार बदल नहीं सकते हैं, क्योंकि उन्हें पहले ही भेज दिया गया है।

अपने स्टैकट्रैक से, यह एक एसिंक नियंत्रक & प्रतीत होता है कि मुझे आश्चर्य है कि इसके साथ इसका कोई संबंध नहीं है। मैं केवल आपके द्वारा पोस्ट की गई चीज़ों से अनुमान लगा रहा हूं।

अद्यतन

सुधार, async उल्लेख वास्तव में ढांचे कोड & कुछ भी नहीं अपने कोड के साथ क्या करना है। हालांकि उपरोक्त आपके कोड से, SearchResultOverview नियंत्रक पर एक क्रिया है? यदि ऐसा है, तो निष्पादन को स्थानांतरित करने के लिए उपयोग की जाने वाली विधियों का उपयोग करना मुझे लगता है कि आपकी समस्याओं का कारण है।

यह 2 mvchandlers को & निष्पादित करने का कारण बनता है, वे एक दूसरे के साथ हस्तक्षेप कर रहे हैं। अनुरोध को पुनर्निर्देशित करने के लिए रूटिंग एक बेहतर तरीका होगा।

+0

मैं मिस्टेर मैन के जवाब में लिखी गई टिप्पणी का उल्लेख करूंगा। मैंने BeginRequest में बफरिंग को सक्षम करने की कोशिश की लेकिन यह कुछ भी नहीं बदला। एमवीसी 2 और एमवीसी 3 के बीच क्या परिवर्तन है कि अचानक हेडर पहले भेज रहे हैं और मुझे बफरिंग जैसे व्यवहार बदलने की जरूरत है? आप कहते हैं कि यह एक एसिंक नियंत्रक प्रतीत होता है लेकिन यह अवधारणा एमवीसी 2 में मौजूद नहीं है, जहां तक ​​मुझे पता है और यह पूरी तरह से एक परियोजना है जिसे एएसपी द्वारा लिखित कोडप्लेक्स से अपडेट टूल का उपयोग करके एमवीसी 2 से एमवीसी 3 में अपग्रेड किया गया था। नेट टीम – IvanL

+0

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

0

मुझे कुछ समय पहले यह समस्या याद है। मुझे सटीक परिस्थितियों को याद नहीं है, लेकिन इसे कस्टम एक्शन फ़िल्टर के अंदर सीधे हेडर और http स्थिति कोड सेट करने के साथ कुछ करना था।

मेरा लक्ष्य वापस कस्टम पृष्ठ/संदेश दिखाना था जब उपयोगकर्ता प्रमाणीकरण का समय समाप्त हो गया था और AJAX एक्शन लिंक पर क्लिक किया गया था (जैसे कि वह थोड़ी देर के लिए पृष्ठ खोलता है, तो वह वापस आता है और लिंक पर क्लिक करता है) , इसलिए asp.net mvc ने div के अंदर डिफ़ॉल्ट लॉगिन पृष्ठ नहीं दिखाया (बदसूरत)। मैं हाथ में कोड अभी नहीं है, लेकिन यह कुछ इस तरह था:

public class AjaxFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.HttpContext.Response.AddHeader("name", "value"); 
      filterContext.HttpContext.Response.StatusCode = 200; 
      filterContext.Result = something; 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

बात यह है कि asp.net MVC के के पिछले संस्करण पर यह एक ही कोड की कोशिश कर मुझे दिया "शीर्षक संलग्न नहीं कर सकते "त्रुटि। मुझे याद नहीं है कि मैंने इसे कैसे तय किया, लेकिन यह वैसे भी आसान नहीं था। यदि आपको लगता है कि यह मामला आपके लिए लागू होता है तो मैं निश्चित कोड के लिए अपनी पुरानी परियोजनाओं के माध्यम से खोज सकता हूं।

आशा है कि यह मदद करता है

+0

बताता हूं कि डाउनवोट क्यों? हो सकता है कि यह पूछताछकर्ता की सही समस्या पर लागू न हो, लेकिन यह अन्य लोगों की मदद कर सकता है। गीज़ ... – Francisco

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। केवल अंतर यह है कि मेरे पास OnActionExecuted में तर्क है। क्या आप फिक्स साझा करना चाहते हैं? –

+0

मेरे पास यह नहीं है, यह समय में खो गया है ... लेकिन मुख्य भाग परिणाम को सीधे सेट करना है, उदाहरण के लिए: filterContext.Result = new HttpUnauthorizedResult(); – Francisco

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