ASP.NET l'Api Web HttpResponseException 400 (Bad Request) Détourné par IIS
Je suis en train d'écrire une API Web service et tente de retourner une (400) Bad Demande si mon ModelState est pas valide. Je ne veux pas une réponse du corps à joindre à la présente. Il semble que IIS est le détournement de ma réponse revenant toujours un texte/html type de contenu avec un long, le style de page d'erreur. C'est un problème.
[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);
}
}
Voici mon fiddler demande:
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"}
Et ma réponse erronée, plein de corps, réponse:
<!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&IIS70Error=400,0,0x00000000,7601">View more information »</a></p>
<p>Microsoft Knowledge Base Articles:</p>
<ul><li></li></ul>
</fieldset>
</div>
</div>
</body>
</html>
J'ai essayé de mettre TrySkipIisCustomErrors = True
avec beaucoup d'espoir, mais pas de chance. Des idées? Apprécié. Merci.
OriginalL'auteur kmehta | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
Essayer en ajoutant ceci à votre site web.config. J'ai eu un problème similaire qui cela a résolu.
Super! Fonctionne très bien et TrySkipIisCustom n'étais pas de travail pour moi dans Asp.NET MVC 4 Web Api.
Je dirais +1 cette réponse, mais il ne parvient pas à expliquer ce qu'il fait. Pourriez-vous éditer pour ajouter une explication s'il vous plaît?
Je ne sais pas ce WebAPI n'sous le capot, je sais juste qu'il permet à l'erreur par le biais de mon propre code et ne pas envelopper dans quelque chose d'autre. Désolé!
Cela semble avoir (un peu) explication ici: iis.net/configreference/system.webserver/httperrors
OriginalL'auteur Antony Scott
Habituellement dans de tels cas, il suffit de définir TrySkipIisCustomErrors = true sur la réponse de l'objet, mais dans le cas de l'API Web, il n'a parfois pas faire l'affaire (API Web essaie même de définir cet indicateur en interne par lui-même). Pour des situations comme cela, vous pouvez envisager de modifier la configuration du serveur IIS. Veuillez prendre un coup d'oeil ici (vous devez être surtout intéressé à la existingResponse="PassThrough").
OriginalL'auteur tpeczek
En supposant que vous êtes à l'intérieur de votre APIController et n'ont pas besoin d'un ExceptionFilterAttribute à faire tout le travail supplémentaire pour la réponse, puis il suffit de retourner une réponse avec le code d'état d'erreur au lieu de lancer une HttpResponseException.
OriginalL'auteur Mark Seefeldt
J'ai été frappé de ce même état, le retour:
Ajout <httpErrors existingResponse="PassThrough"> n'ont pas le fixer, le type de Contenu et le contenu du corps ont disparu dans la réponse.
Qu'a corriger il était de construire le HttpResponseMessage comme ceci:
En incluant la valeur du paramètre (dans ce cas, 'reasonPhrase') le type de Contenu et le Contenu étaient présents dans la réponse.
OriginalL'auteur Beans
J'ai eu le même problème avec Asp.Net Formulaire de demande. Le client envoie appel ajax vers le serveur web handler (*.ashx).
Je voulais avoir le message de l'exception à l'utilisateur.
Le Web handler envoie juste le message et le code d'état http de 400.
Le Truc, c'est Réponse.TrySkipIisCustomErrors = true;
OriginalL'auteur Vojta
J'ai eu une situation où j'ai été appeler un WebApi point de terminaison de l'autre, et ayant lu que HttpClients doit être statique j'ai fait ce changement. A bien fonctionné pour quelques dizaines de messages mais serait d'obtenir intercepté par l'autonomie de l'instance de l'hôte qui permettrait le retour d'un 400 Bad Request. Il ne semble pas être quelque chose de mal, surtout avec le succès initial, mais mon code d'origine serait ajouter une valeur par défaut de l'en-tête du client avant l'appel. Après j'ai fait le client statique, cela aurait signifié que j'étais l'ajout de l'en-tête plusieurs fois pour le même client. J'ai changé le code pour envoyer de créer et d'envoyer un HttpRequestMessage au lieu de laisser le client faire, et ajouté de l'en-tête de la demande. Semble avoir résolu mon problème.
OriginalL'auteur William T. Mallard