2012-04-02 20 views
16

द्वारा अपहरण कर लिया गया है, मैं एक वेब एपीआई सेवा लिख ​​रहा हूं और यदि मेरा मॉडलस्टेट अमान्य है तो एक (400) खराब अनुरोध वापस करने का प्रयास कर रहा है। मैं नहीं चाहता कि प्रतिक्रिया शरीर से जुड़ा हो। ऐसा लगता है कि आईआईएस मेरी प्रतिक्रिया को अपहरण कर रहा है और हमेशा एक लंबा, स्टाइल त्रुटि पृष्ठ के साथ एक पाठ/एचटीएमएल सामग्री प्रकार लौट रहा है। यह एक समस्या है।एएसपी.नेट वेब एपी एचटीपी रेस्पॉन्स एक्सेप्शन 400 (खराब अनुरोध) IIS

[HttpPost] 
    public void Link(LinkDeviceModel model) 
    { 

     if (ModelState.IsValid) 
     { 
      try 
      { 
       model.Save(); 
      } 
      catch (Exception ex) 
      { 
       ErrorSignal.FromCurrentContext().Raise(ex); 
       throw new HttpResponseException(ex.Message, HttpStatusCode.InternalServerError); 
      } 
     } 
     else 
     { 
      throw new HttpResponseException(HttpStatusCode.BadRequest); 
     } 
    } 

यहाँ मेरी Fiddler अनुरोध है:

POST http://localhost/myapp/service/link HTTP/1.1 
Host: localhost 
Content-Length: 112 
Content-Type: application/json 
Accept: application/json 

{"DeviceUniqueId":"CC9C6FC0-7D06-11E1-8B0E-31564824019B", "UserName": "[email protected]"," Pin": "111111"} 

और मेरी प्रतिक्रिया गलत, शरीर, प्रतिक्रिया से भरा:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>IIS 7.5 Detailed Error - 400.0 - Bad Request</title> 
<style type="text/css"> 
<!-- 
body{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;background:#CBE1EF;} 
code{margin:0;color:#006600;font-size:1.1em;font-weight:bold;} 
.config_source code{font-size:.8em;color:#000000;} 
pre{margin:0;font-size:1.4em;word-wrap:break-word;} 
ul,ol{margin:10px 0 10px 40px;} 
ul.first,ol.first{margin-top:5px;} 
fieldset{padding:0 15px 10px 15px;} 
.summary-container fieldset{padding-bottom:5px;margin-top:4px;} 
legend.no-expand-all{padding:2px 15px 4px 10px;margin:0 0 0 -12px;} 
legend{color:#333333;padding:4px 15px 4px 10px;margin:4px 0 8px -12px;_margin-top:0px; 
border-top:1px solid #EDEDED;border-left:1px solid #EDEDED;border-right:1px solid #969696; 
border-bottom:1px solid #969696;background:#E7ECF0;font-weight:bold;font-size:1em;} 
a:link,a:visited{color:#007EFF;font-weight:bold;} 
a:hover{text-decoration:none;} 
h1{font-size:2.4em;margin:0;color:#FFF;} 
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.4em;margin:10px 0 0 0;color:#CC0000;} 
h4{font-size:1.2em;margin:10px 0 5px 0; 
}#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS",Verdana,sans-serif; 
color:#FFF;background-color:#5C87B2; 
}#content{margin:0 0 0 2%;position:relative;} 
.summary-container,.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;} 
.config_source{background:#fff5c4;} 
.content-container p{margin:0 0 10px 0; 
}#details-left{width:35%;float:left;margin-right:2%; 
}#details-right{width:63%;float:left;overflow:hidden; 
}#server_version{width:96%;_height:1px;min-height:1px;margin:0 0 5px 0;padding:11px 2% 8px 2%;color:#FFFFFF; 
background-color:#5A7FA5;border-bottom:1px solid #C1CFDD;border-top:1px solid #4A6C8E;font-weight:normal; 
font-size:1em;color:#FFF;text-align:right; 
}#server_version p{margin:5px 0;} 
table{margin:4px 0 4px 0;width:100%;border:none;} 
td,th{vertical-align:top;padding:3px 0;text-align:left;font-weight:bold;border:none;} 
th{width:30%;text-align:right;padding-right:2%;font-weight:normal;} 
thead th{background-color:#ebebeb;width:25%; 
}#details-right th{width:20%;} 
table tr.alt td,table tr.alt th{background-color:#ebebeb;} 
.highlight-code{color:#CC0000;font-weight:bold;font-style:italic;} 
.clear{clear:both;} 
.preferred{padding:0 5px 2px 5px;font-weight:normal;background:#006633;color:#FFF;font-size:.8em;} 
--> 
</style> 

</head> 
<body> 
<div id="header"><h1>Server Error in Application "DEFAULT WEB SITE/MYAPP"</h1></div> 
<div id="server_version"><p>Internet Information Services 7.5</p></div> 
<div id="content"> 
<div class="content-container"> 
<fieldset><legend>Error Summary</legend> 
    <h2>HTTP Error 400.0 - Bad Request</h2> 
    <h3>Bad Request</h3> 
</fieldset> 
</div> 
<div class="content-container"> 
<fieldset><legend>Detailed Error Information</legend> 
    <div id="details-left"> 
    <table border="0" cellpadding="0" cellspacing="0"> 
    <tr class="alt"><th>Module</th><td>ManagedPipelineHandler</td></tr> 
    <tr><th>Notification</th><td>ExecuteRequestHandler</td></tr> 
    <tr class="alt"><th>Handler</th><td>System.Web.Http.WebHost.HttpControllerHandler</td></tr> 
    <tr><th>Error Code</th><td>0x00000000</td></tr> 

    </table> 
    </div> 
    <div id="details-right"> 
    <table border="0" cellpadding="0" cellspacing="0"> 
    <tr class="alt"><th>Requested URL</th><td>http://localhost:80/myapp/service/link</td></tr> 
    <tr><th>Physical Path</th><td>C:\workspace\myapp\service\link</td></tr> 
    <tr class="alt"><th>Logon Method</th><td>Anonymous</td></tr> 
    <tr><th>Logon User</th><td>Anonymous</td></tr> 

    </table> 
    <div class="clear"></div> 
    </div> 
</fieldset> 
</div> 
<div class="content-container"> 
<fieldset><legend>Most likely causes:</legend> 
    <ul> <li></li> </ul> 
</fieldset> 
</div> 
<div class="content-container"> 
<fieldset><legend>Things you can try:</legend> 
    <ul> <li>Create a tracing rule to track failed requests for this HTTP status code. For more information about creating a tracing rule for failed requests, click <a href="http://go.microsoft.com/fwlink/?LinkID=66439">here</a>. </li> </ul> 
</fieldset> 
</div> 


<div class="content-container"> 
<fieldset><legend>Links and More Information</legend> 
    The request could not be understood by the server due to malformed syntax. 
    <p><a href="http://go.microsoft.com/fwlink/?LinkID=62293&amp;IIS70Error=400,0,0x00000000,7601">View more information &raquo;</a></p> 
    <p>Microsoft Knowledge Base Articles:</p> 
<ul><li></li></ul> 

</fieldset> 
</div> 
</div> 
</body> 
</html> 

मैं बड़ी उम्मीद के साथ TrySkipIisCustomErrors = True स्थापित करने के लिए कोशिश की है, लेकिन कोई भाग्य। कोई विचार? की सराहना की। धन्यवाद।

उत्तर

29

इसे अपने web.config में जोड़ने का प्रयास करें। मुझे एक बहुत ही समस्या थी जो हल हो गई।

<configuration> 
  <system.webServer> 
    <httpErrors existingResponse="PassThrough" /> 
  </system.webServer> 
</configuration> 
+0

आप रॉक। मेरा वेब एपी एक अलग "सेवा" क्षेत्र में है। मैंने उपरोक्त कॉन्फ़िगर के साथ उस क्षेत्र में एक खाली "दृश्य" फ़ोल्डर में एक वेब कॉन्फ़िगरेशन vile जोड़ा और इसे ठीक किया। धन्यवाद। – kmehta

+0

बढ़िया! महान काम करता है और TrySkipIisCustom Asp.NET MVC 4 Web Apis में मेरे लिए काम नहीं कर रहा था। –

+2

मैं यह जवाब +1 करूंगा, लेकिन यह समझाने में विफल रहता है कि यह क्या करता है। क्या आप इसे स्पष्टीकरण जोड़ने के लिए संपादित कर सकते हैं? –

3

आमतौर पर ऐसे मामलों में TrySkipIisCustomErrors = प्रतिक्रिया ऑब्जेक्ट पर सत्य सेट करने के लिए पर्याप्त है, लेकिन वेब एपीआई के मामले में यह कभी-कभी चाल नहीं करता है (वेब ​​एपीआई भी इस ध्वज को आंतरिक रूप से सेट करने का प्रयास करता है)। इस तरह की स्थितियों के लिए आप आईआईएस कॉन्फ़िगरेशन को बदलने पर विचार कर सकते हैं। कृपया here देखें (आपको अधिकतर मौजूदा रेस्पॉन्स = "पासथ्रू" में रुचि होनी चाहिए)।

+1

TrySkipIisCustomErrors WebApi के HttpResponseMessage का सदस्य प्रतीत नहीं होता है। –

2

मान लिया जाये कि आप अपने APIController के अंदर कर रहे हैं और प्रतिक्रिया के लिए किसी भी अतिरिक्त काम करने के लिए एक ExceptionFilterAttribute की जरूरत नहीं है, तो बस त्रुटि स्थिति कोड के साथ एक प्रतिक्रिया वापस एक HttpResponseException फेंकने के बजाय।

return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid model."); 
+0

कैसे संभालना है एक बात मैंने नोटिस की है मुझे दूसरा पैरामीटर (सामग्री) निर्दिष्ट करना होगा या आईआईएस अभी भी कस्टम त्रुटि पृष्ठ प्रदर्शित करेगा। –

0

मैं इस एक ही हालत मार रहा था, लौटने:

httpResponseMessage = context.Request.CreateResponse(statusCode); 

जोड़ना < httpErrors existingResponse = "पासथ्रू"> यह ठीक नहीं हुआ, सामग्री-प्रकार और सामग्री शरीर जवाब में लापता थे ।

क्या तय था कि यह निर्माण करने के लिए था HttpResponseMessage इस तरह:

var httpResponseMessage = context.Request.CreateResponse(statusCode, reasonPhrase); 

'मान' पैरामीटर शामिल करने (इस मामले में, 'reasonPhrase') सामग्री-प्रकार और सामग्री शरीर में उपस्थित थे द्वारा प्रतिक्रिया।

0

मुझे Asp.Net वेबफॉर्म एप्लिकेशन के साथ एक ही समस्या थी। क्लाइंट सर्वर वेब हैंडलर (* .ashx) पर AJAX कॉल भेजता है।

मैं उपयोगकर्ता को अपवाद संदेश वापस प्राप्त करना चाहता था। वेब हैंडलर वापस भेजता है बस अपवाद संदेश और HTTP स्थिति कोड 400

चाल Response.TrySkipIisCustomErrors में है = true

try 
{ 
//do some coding 
} 
catch (Exception exception) 
{ 
    Log.Error(exception); 
    context.Server.ClearError(); 
    context.Response.TrySkipIisCustomErrors = true; 
    context.Response.ContentType = "text/plain"; 
    context.Response.Write(exception.Message); 
    context.Response.StatusCode = 400; 
    //400 Bad Request 
    //The server cannot or will not process the request due to an apparent client error 
    // 
    //intentionally hidden exception 
    //prevent to send yellow page of death in ajax response 
} 
0

मैं जहाँ मैं दूसरे से एक WebAPI endpoint बुला रहा था, और पढ़ कि HttpClients स्थिर होना चाहिए मुझे लगता है कि परिवर्तन किया एक स्थिति थी। कुछ दर्जन संदेशों के लिए ठीक काम किया लेकिन फिर स्वयं-होस्ट उदाहरण से अवरुद्ध हो जाएगा जो 400 खराब अनुरोध वापस करेगा।विशेष रूप से शुरुआती सफलता के साथ कुछ भी गलत नहीं लग रहा था, लेकिन मेरा मूल कोड कॉल से पहले ग्राहक को डिफ़ॉल्ट शीर्षलेख जोड़ देगा। क्लाइंट स्थिर होने के बाद इसका मतलब यह होगा कि मैं एक ही ग्राहक को कई बार हेडर जोड़ रहा था। मैंने कोड को भेजने और क्लाइंट को ऐसा करने के बजाए एक HttpRequestMessage भेजने के लिए कोड बदल दिया, और अनुरोध में हेडर जोड़ा। लगता है कि मेरी समस्या हल हो गई है।

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