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 :)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top