Pregunta

Estaba obteniendo el temido "Tipo de contenido de respuesta" de "TEXT / HTML", pero se esperaba un error "prueba / xml" esperado, pero después de algún googling encontré esta publicación sobre cómo devolver un Soapexception.

Así que seguí adelante e implementé eso, pero ahora todavía estoy recibiendo el mismo error. ¿Hay cambios que debo hacer en el lado del cliente para poder aceptar la etapa de Soapex (no lo creo, todo lo que simplemente hereda desde la excepción, ¿verdad?)

¿Por qué sigo obteniendo esa respuesta temida en el lado del 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: Sé que la excepción en este bloque de captura es exactamente lo que necesito ver, pero sigo obteniendo el sistema.InvalidoproationException en el lado del cliente.

Edit2: Me estoy conectando a los servicios web a través de una referencia web (llamando a un archivo * .asmx) si eso ayuda / asuntos.

Edit3: Esto es lo que se está escribiendo en nuestro lado del servidor ExcepcionLog (en la llamada publishmanager.publish ()). Mi pensamiento fue que esto debería ser lo que se devuelve 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: Solo quiero tirar este trozo de código extra para que la gente vea cómo estoy probando estas excepciones (y tal vez sea la forma equivocada de probar ...). En mi primer código, tengo la llamada dentro del bloque de prueba para "devolver componentes.pwd.getconversionerrors ();", aquí está ese 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 puede ver, he comentado la llamada real, y acaba de arrojar mi propia línea que lanzará una excepción cada vez para fines de prueba ...

Edit4: @gbvb Aquí está el nuevo 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);
        }
    }

Edit5: Lo que Fiddler2 sierra:

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 alguien sabe bien formatear esta sección, hágalo :)

¿Fue útil?

Solución

Entonces, lo puse para trabajar.Esto es lo que descubrí:

Al ver las propiedades de mi sitio web en IIS, luego elegir "Módulos", hay una entrada llamada "Customerrumdule" que está tratando de procesar los errores que son lanzados por el sitio web / servicio web.

La corrección es para eliminar esa entrada "Customerrumodule", o actualizar mi archivo de configuración de:

<httpErrors errorMode="Custom" existingResponse="Replace">

a:

<httpErrors errorMode="Custom" existingResponse="Auto">

Gracias a todos por la ayuda, me dirigió a la dirección correcta.(BTW, estoy actualizando el archivo de configuración, por lo que no tengo que meterme con las cosas del módulo)

Además, Aquí hay un enlace explicando esta situación.

Otros consejos

Solo para risitas, ¿puede intentar lanzar explícitamente el nuevo Soapexception () con el Soapexception.clientFaultCode como el tipo de esa llamada?Obviamente, tiene varias capas que podrían estar fallando en el código que se muestran de arriba y es fácil arruinar (créeme, lo sé :)).Y no llame a los otros métodos, como Publisher.publish. Eso apuntará a si es la declaración de mensajes (I.E. INFRAESTRUCCIÓN ASMX) o es su código que está jugando con la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top