Como aceitar uma SoapException no lado do cliente
-
13-12-2019 - |
Pergunta
Eu estava recebendo o temido "o cliente encontrou o tipo de conteúdo de resposta" texto/html ", mas esperava o erro" teste / xml ", mas depois de pesquisar no Google, descobri esta postagem sobre como retornar uma SoapException.
Então fui em frente e implementei isso, mas agora ainda estou recebendo o mesmo erro.Há mudanças que preciso fazer no lado do cliente para poder aceitar o SoapException (acho que não, tudo herda do Exception, certo?)
Por que ainda estou recebendo aquela temida resposta do lado do cliente?
[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);
}
}
Editar:Eu sei que a exceção neste bloco catch é exatamente o que preciso ver, mas ainda estou recebendo System.InvalidOperationException no lado do cliente.
Editar2:Estou me conectando aos serviços da web por meio de um WebReference (chamando um arquivo *.asmx), se isso ajudar/importar.
Editar3:Aqui está o que está sendo gravado em nosso servidor de exceção (na chamada PublishingManager.Publish()).Meu pensamento era que isso deveria ser o que é devolvido ao 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
Editar3:Só quero lançar esse pedaço de código extra para que as pessoas vejam como estou testando essas exceções (e talvez seja a maneira errada de testar...).No meu primeiro trecho de código, tenho a chamada dentro do bloco try para "return Components.PWD.GetConversionErrors();", aqui está esse método:
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;
}
}
Como você pode ver, comentei a chamada real e apenas incluí minha própria linha que lançará uma exceção sempre para fins de teste...
Editar4:@gbvb Aqui está o novo método:
[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);
}
}
Editar5:O que o Fiddler2 viu:
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 alguém souber formatar bem esta seção, por favor faça :)
Solução
Então, fiz funcionar.Aqui está o que descobri:
Ao visualizar as propriedades do meu site no IIS, escolhendo "Módulos", há uma entrada chamada "CustomErrorModule" que está tentando processar os erros que estão sendo gerados pelo site/serviço web.
A correção é remover a entrada "CustomErrorModule" ou atualizar meu arquivo de configuração de:
<httpErrors errorMode="Custom" existingResponse="Replace">
para:
<httpErrors errorMode="Custom" existingResponse="Auto">
Obrigado a todos pela ajuda, isso me guiou na direção certa.(Aliás, estou atualizando o arquivo de configuração para não precisar mexer nas coisas do módulo)
Também, aqui está um link explicando esta situação.
Outras dicas
Apenas para rir, você pode tentar lançar explicitamente new SoapException() com SoapException.ClientFaultCode como o tipo dessa chamada?obviamente, você tem várias camadas que podem estar falhando no código mostrado acima e é fácil bagunçar (acredite, eu sei :)).E não chame outros métodos, como Publisher.publish.isso apontará se é a declaração da mensagem (ou seja,Infraestrutura ASMX) ou é o seu código que está mexendo com a exceção.