2013-05-16 2 views
12

विषय selfexplanatory है। मेरे पास डेवलपर और उत्पादन वातावरण हैं। डेवलपर एनवी। मेरी लोकलहोस्ट मशीन है। मेरे पास contolers में क्रिया विधियां हैं जो प्रतिक्रिया स्थिति कोड 500 को सेट करती हैं जब कुछ गलत होती है (त्रुटि हुई, या तार्किक असंगतता) और जेसन-उत्तर देता है। मेरी सामान्य विधि इस तरह दिखती है:आईएसपी एएसपी पर जेएसओएन के बजाय एचटीएमएल के साथ प्रतिक्रिया करता है .NET MVC3

[HttpPost] 
public ActionResult DoSomething(int id) 
{ 
    try 
    { 
     // some useful code 
    } 
    catch(Exception ex) 
    { 
     Response.StatusCode = 500; 
     Json(new { message = "error" }, JsonBehaviour.AllowGet) 
    } 
} 

क्लाइंट साइड उत्पादन एनवी में। जब ऐसी त्रुटि हुई AJAX.response अपेक्षित JSON की बजाय HTML-कोड की तरह दिखता है।

इस पर विचार करें:

<div class="content-container"> 
<fieldset> 
    <h2>500 - Internal server error.</h2> 
    <h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3> 
</fieldset> 
</div> 

फ़िल्टर संदर्भ एक विकल्प नहीं है। मुझे लगता है कि यह किसी प्रकार का आईआईएस या web.config मुद्दा है।

समाधान: हम Global.asax में BeginRequest में TrySkipIisCustomErrors जोड़ने का निर्णय लिया है और यह हमारे आवेदन में प्रत्येक विधि में समस्याओं को हल किया गया है।

+1

इससे पहले कि आप 'Json' समारोह कॉल' return' है? – Zoka

+0

@ ज़ोका, हाँ का हाँ ** वापसी ** अभी भी वहां है। धन्यवाद। – kokosda

उत्तर

12

मुझे लगता है कि आईआईएस कुछ दोस्ताना त्रुटि पृष्ठ की सेवा कर रहा है। आप प्रतिक्रिया पर TrySkipIisCustomErrors संपत्ति की स्थापना करके यह पेज लंघन की कोशिश कर सकते:

catch(Exception ex) 
{ 
    Response.StatusCode = 500; 
    Response.TrySkipIisCustomErrors = true; 
    return Json(new { message = "error" }, JsonBehaviour.AllowGet) 
} 
+0

@ खान, आईआईएस त्रुटियों को छोड़ने की कोशिश करने के लिए कुछ प्रकार का हैक लगता है। – kokosda

+1

नहीं, बिल्कुल नहीं। यह नहीं है हैक। दोस्ताना त्रुटि पृष्ठ एएसपी.NET में बनाया गया एक कार्यक्षमता है। यदि आप उन्हें पसंद नहीं करते हैं तो उनका उपयोग न करें। लेकिन अगर आपने उनका उपयोग करने का निर्णय लिया है तो आपको परिणामों के बारे में पता होना चाहिए (आप त्रुटि स्थिति कोड सेट नहीं कर सकते कस्टम प्रतिक्रियाओं के साथ) IIS को स्पष्ट रूप से बताए बिना। –

+0

मुझे लगता है कि यह एक अच्छा समाधान है लेकिन अभी भी एक आईआईएस मुद्दा प्रतीत होता है। हमने ग्लोबल.एक्सएक्स में BeginRequest में 'TrySkipIisCustomErrors' जोड़ने का निर्णय लिया है और यह हमारे प्रत्येक विधि में समस्याएं हल कर रहा है आवेदन। धन्यवाद। – kokosda

0

क्या आपका आईआईएस application/json को वैध mime-type के रूप में इलाज करने के लिए कॉन्फ़िगर किया गया है? आप आईआईएस प्रबंधक में सर्वर के गुणों में जांच सकते हैं और एमआईएमई प्रकारों पर क्लिक कर सकते हैं। यदि जेसन वहां नहीं है तो "नया" पर क्लिक करें, एक्सटेंशन के लिए "JSON" दर्ज करें, और MIME प्रकार के लिए "एप्लिकेशन/जेसन" दर्ज करें।

+0

नहीं :(इस प्रकार वास्तव में मेरे आईआईएस पर पंजीकृत नहीं था। मैंने इसे जोड़ा लेकिन कुछ भी नहीं बदला। – kokosda

0

मैं एक कस्टम json परिणाम है, जो serializer के रूप में json.net का उपयोग करता है लिख कर इस को हल किया। यह सिर्फ आईआईएस फिक्स के लिए अधिक है लेकिन इसका मतलब है कि यह पुन: प्रयोज्य है।

public class JsonNetResult : JsonResult 
{ 
    //public Encoding ContentEncoding { get; set; } 
    //public string ContentType { get; set; } 
    public object Response { get; set; } 
    public HttpStatusCode HttpStatusCode { get; set; } 

    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult(HttpStatusCode httpStatusCode = HttpStatusCode.OK) 
    { 
     Formatting = Formatting.Indented; 
     SerializerSettings = new JsonSerializerSettings { }; 
     SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
     HttpStatusCode = httpStatusCode; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     HttpResponseBase response = context.HttpContext.Response; 

     response.TrySkipIisCustomErrors = true; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     response.StatusCode = (int) HttpStatusCode; 

     if (Response != null) 
     { 
      JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Response); 

      writer.Flush(); 
     } 
    } 
} 

उपयोग:

  try 
      { 
       return new JsonNetResult() 
       { 
        Response = "response data here" 
       }; 
      } 
      catch (Exception ex) 
      { 
       return new JsonNetResult(HttpStatusCode.InternalServerError) 
       { 
        Response = new JsonResponseModel 
        { 
         Messages = new List<string> { ex.Message }, 
         Success = false, 
        } 
       }; 
      } 
संबंधित मुद्दे