Come accettare una replicazione di sapone sul lato client
-
13-12-2019 - |
Domanda
Mi stava ottenendo il temuto "client ha trovato il tipo di contenuto di risposta del testo di" Testo / HTML "ma previsto" Test / XML ", ma dopo alcuni googling ho trovato Questo post su come restituire una excexception.
Così sono andato avanti e ho implementato che, ma ora sto ancora ottenendo lo stesso errore. Ci sono cambiamenti che ho bisogno di fare sul lato del cliente per poter accettare l'eccesso di sapone (non lo penserei, tutto semplicemente eredita da eccezione, giusto?)
Perché sto ancora ottenendo quella temuta risposta sul lato 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);
}
}
.
Modifica: so che l'eccezione in questo blocco di cattura è esattamente ciò che devo vedere, ma sto ancora ricevendo il sistema.invalidoperationException sul lato client.
Edit2: mi sto connettendo ai servizi Web tramite un Webbreference (chiamando un file * .asmx) se questo aiuta / conta.
Edit3: Ecco cosa viene scritto nel nostro lato server di eccezione (nella chiamata PublishingManager.Publish ()). Il mio pensiero era che questo dovrebbe essere ciò che è tornato al cliente ...
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: Vuoi solo lanciare questo codice extra codice in modo che le persone vedano come sto testando queste eccezioni (e forse è il modo sbagliato per testare ...). Nel mio primo codice Chunk, ho la chiamata all'interno del blocco Try per "restituire componenti.pwd.getconversionerrors ();", ecco questo metodo:
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;
}
}
.
Come puoi vedere, ho commentato la chiamata effettiva, e ho appena lanciato la mia linea che getterà un'eccezione ogni volta che fa il test ...
Edit4: @GBVB Ecco il nuovo metodo:
[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: Che Fiddler2 ha visto:
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>
.
Se qualcuno sa come formato bene questa sezione, per favore fai :)
Soluzione
Allora, l'ho capito.Ecco cosa ho scoperto:
Durante la visualizzazione delle proprietà del mio sito Web in IIS, scegliendo "Moduli", c'è una voce chiamata "PersonerRoRORRORORRODULO" che sta tentando di elaborare gli errori che vengono lanciati dal sito web / servizio Web.
La correzione è rimuovere quella voce "PersonerRoRORRORORRODULE" o aggiornare il mio file di configurazione da:
<httpErrors errorMode="Custom" existingResponse="Replace">
.
A:
<httpErrors errorMode="Custom" existingResponse="Auto">
.
Grazie a tutti per l'aiuto, mi ha guidato nella giusta direzione.(BTW, sto aggiornando il file di configurazione in modo da non dover scherzare con il modulo del modulo)
anche, Ecco un link spiegando questa situazione.
Altri suggerimenti
Solo per le risatine, puoi provare esplicitamente la nuova soapexception () con Saplexception.ClientFaultCode come il tipo da quella chiamata?Ovviamente, hai diversi livelli che potrebbero non riuscire nel codice che si mostra sopra ed è facile da confondere (credimi, lo so :)).E non chiamare gli altri metodi come Publisher.Publish .. che indicherà se è la dichiarazione dei messaggi (I.e. Asmx infrastruttura) o è il tuo codice che sta scherzando con l'eccezione ..