Comment accepter une parfaite exception du côté du client
-
13-12-2019 - |
Question
Je reçois le type de contenu de réponse redouté de "Texte de la réponse" de "Text / html", mais prévu "Test / XML", mais après un googling, j'ai trouvé cet article sur la façon de retourner une impression SOAPEXEXE.
Alors je suis allé de l'avant et j'ai mis en œuvre cela, mais maintenant je reçois toujours la même erreur. Existe-t-il des changements que je dois faire sur le côté client pour pouvoir accepter la SoapException (je ne le pense pas, tout ne fait que hériter d'exception, non?)
Pourquoi est-ce que je reçois toujours cette réponse redoutée du côté du client?
[WebMethod]
[SoapHeader("authenticationHeader")]
[WebServiceAuthentication(AuthenticationRequired = false)]
public DataSet GetConversionErrors()
{
try
{
return Components.PWD.GetConversionErrors();
}
catch (Exception ex)
{
PublishingManager.Publish(ex, HttpContext.Current.User.Identity.Name);
throw Components.SoapException.GenerateSoapException(ex, Context);
}
}
Edit: Je sais que l'exception dans ce bloc de capture est exactement ce que j'ai besoin de voir, mais je reçois toujours le système.InvalidoperationException sur le côté client.
Edit2: Je me connecte aux webservices via une différence (appelant un fichier * .asmx) si cela aide / importe.
Edit3: Voici ce qui est écrit à notre côté Server Exceptionnel (dans la publicationMangerager.Publish () appel). Ma pensée était que cela devrait être ce qui est retourné au client ...
Exception Details:
Exception Type: System.Exception
Message: Test the text/html text/xml message.
Method: PWD.Components.PWD.GetConversionErrors
Username: xxxxxx Created 5/22/2012 4:20:53 PM
Application: xxxx Application Identity: NT AUTHORITY\IUSR
Source: xxxx Severity 2
Machine: xxxxxxxxx IP Address 127.0.0.1
AppDomain /LM/W3SVC/1/ROOT-1-129821937733610609
Stack Trace at PWD.Components.PWD.GetConversionErrors() in C:\Vault\Development-New\Web\Main_Logging\PWD\Components\PWD.cs:line 73
at PWD.PWD.GetConversionErrors() in C:\Vault\Development-New\Web\Main_Logging\PWD\PWD.asmx.cs:line 44
Additional Information:
+System.Exception:
Message: Test the text/html text/xml message.
Data: System.Collections.ListDictionaryInternal
InnerException:
TargetSite: System.Data.DataSet GetConversionErrors()
StackTrace: at PWD.Components.PWD.GetConversionErrors() in C:\Vault\Development-New\Web\Main_Logging\PWD\Components\PWD.cs:line 73
at PWD.PWD.GetConversionErrors() in C:\Vault\Development-New\Web\Main_Logging\PWD\PWD.asmx.cs:line 44
HelpLink:
Source: xxxx
UserName: xxxxxxx
TypeName: PublishingManager
MachineName: xxxxxxxxx
TimeStamp: 5/22/2012 4:20:54 PM
FullName: Services.Publishing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null
AppDomainName: /LM/W3SVC/1/ROOT-1-129821937733610609
ThreadIdentity:
WindowsIdentity: NT AUTHORITY\IUSR
Severity: 2
MachineIPAddress: 127.0.0.1
Edit3: Je veux juste jeter ce morceau de code supplémentaire pour que les gens voient comment je teste ces exceptions (et peut-être que c'est la mauvaise façon de tester ...). Dans mon premier chunk de code, j'ai l'appel à l'intérieur du bloc d'essai pour "retourner des composants.pwd.getconversionerrors ();", voici cette méthode:
public static DataSet GetConversionErrors()
{
DB db = new DB();
try
{
//return db.ExecuteDataset(Configuration.GenericConfig.AppConnectionString, CommandType.Text, spGetConversionErrors);
throw new Exception("Test the text/html text/xml message.");
}
catch
{
throw;
}
}
Comme vous pouvez le constater, j'ai commenté l'appel réel et je viens de lancer dans ma propre ligne qui organisera une exception à chaque fois à des fins de test ...
Edit4: @gbvb Voici la nouvelle méthode:
[WebMethod]
[SoapHeader("authenticationHeader")]
[WebServiceAuthentication(AuthenticationRequired = false)]
public DataSet GetConversionErrors()
{
try
{
return Components.PWD.GetConversionErrors();
}
catch (Exception ex)
{
//PublishingManager.Publish(ex, HttpContext.Current.User.Identity.Name);
//throw Components.SoapException.GenerateSoapException(ex, Context);
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
System.Xml.XmlNode detailNode = xmlDoc.CreateNode(System.Xml.XmlNodeType.Element, System.Web.Services.Protocols.SoapException.DetailElementName.Name, System.Web.Services.Protocols.SoapException.DetailElementName.Namespace);
detailNode.InnerText = ex.ToString();
throw new System.Web.Services.Protocols.SoapException(ex.Message, System.Web.Services.Protocols.SoapException.ClientFaultCode, System.Web.HttpContext.Current.Request.Url.AbsoluteUri, detailNode, ex.InnerException);
}
}
EDIT5: Qu'est-ce que Fiddler2 a vu:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 23 May 2012 19:25:56 GMT
Content-Length: 1208
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Internal server error.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
<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>
</div>
</body>
</html>
Si quelqu'un sait à bien formater cette section, veuillez faire:)
La solution
Alors, je l'ai eu pour travailler.Voici ce que j'ai découvert:
Lors de la visualisation des propriétés de mon site Web dans IIS, choisissez "Modules", il existe une entrée appelée "CustomERrormodule" qui tente de traiter les erreurs qui sont lancées par le site web / Web.
Le correctif est de supprimer cette entrée "CustomERormodule" ou mettez à jour mon fichier de configuration de:
<httpErrors errorMode="Custom" existingResponse="Replace">
à:
<httpErrors errorMode="Custom" existingResponse="Auto">
Merci à tout le monde de l'aide, cela m'a dirigé dans la bonne direction.(BTW, je mette à jour le fichier de configuration afin que je n'ai pas à vous désordre avec le module Stuff)
Aussi, Voici un lien Expliquer cette situation.
Autres conseils
Juste pour des rires, pouvez-vous essayer de lancer explicitement une nouvelle soapexception () avec la SoapException.ClientfaultCode comme type de cet appel?De toute évidence, vous avez plusieurs couches qui pourraient échouer dans le code que vous présentez ci-dessus et il est facile de gâcher (croyez-moi, je sais :)).Et ne pas appeler les autres méthodes telles que Publisher.Publish .. Cela indiquera s'il s'agit de la déclaration de message (I.e. Infrastructure ASMX) ou est-ce que votre code qui joue avec l'exception ..