web-dev-qa-db-fra.com

Comment l'erreur 'Type de contenu de réponse trouvé par le client de' text/html '.. peut être interprétée

J'utilise C # et me connecte à un WebService via un objet proxy C # généré automatiquement. La méthode que j'appelle peut être longue, et parfois expirée. Je reçois des erreurs différentes, parfois, je reçois un System.Net.WebException ou un System.Web.Services.Protocols.SoapException. Ces exceptions ont des propriétés que je peux interroger pour trouver le type d'erreur spécifique à partir duquel je peux afficher une version conviviale de l'utilisateur.

Mais parfois, je reçois juste un InvalidOperationException, et il contient le message suivant. Est-ce que je peux interpréter de quoi il s'agit sans fouiller dans la chaîne pour trouver des choses que je reconnais, qui se sentent très sales et qui ne sont pas agnostiques pour l'internationalisation, le message d'erreur pourrait revenir dans une langue différente.

Client found response content type of 'text/html; charset=utf-8', but expected 'text/xml'.
The request failed with the error message:
--
<html>
    <head>
    <title>Request timed out.</title>
                        <style>
         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
         pre {font-family:"Lucida Console";font-size: .9em}
         .marker {font-weight: bold; color: black;text-decoration: none;}
         .version {color: gray;}
         .error {margin-bottom: 10px;}
         .expandable { text-decoration:underline; font-weight:bold;     color:navy;         cursor:hand; }
        </style>
    </head>

    <body bgcolor="white">

            <span><H1>Server Error in '/PerformanceManager' Application.<hr     width=100% size=1 color=silver></H1>

            <h2> <i>Request timed out.</i> </h2></span>

            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">

            <b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

            <br><br>

            <b> Exception Details: </b>System.Web.HttpException: Request timed out.<br><br>

            <b>Source Error:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
               <tr>
                  <td>
                      <code>

An unhandled exception was generated during the execution of the current web request. Information regarding the Origin and location of the exception can be identified using the exception stack trace below.</code>

                  </td>
               </tr>
            </table>

            <br>

            <b>Stack Trace:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
                   <tr>
                  <td>
                      <code><pre>

[HttpException (0x80004005): Request timed out.]
</pre></code>

                  </td>
               </tr>
            </table>

            <br>

            <hr width=100% size=1 color=silver>

            <b>Version Information:</b> Microsoft .NET Framework Version:2.0.50727.312; ASP.NET Version:2.0.50727.833

            </font>

    </body>
</html>
<!-- 
[HttpException]: Request timed out.
-->
--.

Edit: J'ai un try-catch autour de la méthode sur le serveur web. Je l'ai débogué et la méthode du serveur Web est renvoyée (après une minute environ) sans aucune exception. J'ai également ajouté un gestionnaire d'exceptions non géré dans le service Web et un point d'arrêt n'a pas été touché. Dès que le service Web est de retour, j'obtiens cette erreur dans le client au lieu du résultat escompté.

25
Scott Langham

Cela se produit car il existe une exception non gérée dans votre service Web et que le moteur d'exécution .NET crache sa page d'écran HTML jaune de la page de vidage des erreurs/exceptions du serveur de mort, au lieu de XML.

Étant donné que le consommateur de votre service Web attendait un en-tête text/xml et obtenait text/html, il génère cette erreur.

Vous devriez aborder la cause de vos délais (par exemple une requête SQL longue?).

En outre, checkout cet article de blog sur le blog de Jeff Atwood qui explique comment implémenter un gestionnaire d'exceptions global non géré et utiliser des exceptions SOAP.

40
Seibar

Cela signifie que votre consommateur attend du XML du service Web, mais que celui-ci, comme l'indique votre erreur, renvoie le code HTML car il échoue en raison d'un délai d'attente. 

Vous devez donc contacter le fournisseur de services Web à distance pour l'informer de l'échec et prendre les mesures qui s'imposent. À moins que vous ne soyez le fournisseur du service Web, auquel cas vous devriez capturer les exceptions et renvoyer XML en indiquant au consommateur quelle erreur s'est produite (le "fournisseur distant" devrait probablement le faire également).

9
Vinko Vrsalovic

Si vous utilisez .NET version 4.0. validateRequestion est activé par défaut pour toutes les pages. dans les versions précédentes 1.1 et 2.0, c'était uniquement pour la page aspx. Vous pouvez désactiver la validation par défaut. Dans ce cas, vous devez faire preuve de diligence raisonnable et vous assurer que les données sont propres. Utilisez HtmlEncode. Procédez comme suit pour désactiver la validation.

Dans le fichier web.config, ajoutez les lignes suivantes pour system.web

 <httpRuntime requestValidationMode="2.0" />

et 

 <pages validateRequest="false" />

Vous pouvez en savoir plus à ce sujet http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes Ainsi que http://msdn.Microsoft.com/en-us/library /ff649310.aspx

J'espère que cela t'aides.

5
Mhoque

Cela s'est produit à la suite d'une erreur de configuration dans web.config. Vérifier la chaîne de connexion, etc. pourrait être la réponse au délai d'attente.

4
oekstrem

Le serveur Web renvoie un code d'erreur http 500. Ces erreurs surviennent généralement lorsqu’une exception est émise sur le serveur Web et qu’il n’ya aucune logique pour l’attraper, de sorte qu’elle génère une erreur http 500. Vous pouvez généralement résoudre le problème en plaçant des blocs try-catch dans votre code.

4
bastos.sergio

Supprimez le fichier web.config et réinsérez-le. http://forums.asp.net/post/916808.aspx

3
aolmez

J'avais eu cette erreur après avoir changé le type de retour du service Web et SoapDocumentMethod .

Au départ c'était:

[WebMethod]
public int Foo()
{
    return 0;
}

J'ai décidé de le faire feu et oublier type comme ceci:

[SoapDocumentMethod(OneWay = true)]
[WebMethod]
public void Foo()
{
    return;
}

Dans de tels cas, la mise à jour de la référence Web a été utile.

Pour mettre à jour une référence de service Web:

  • Développer la solution Explorer
  • Localiser Références Web - cela ne sera visible que si vous avez ajouté une référence de service Web dans votre projet.
  • Faites un clic droit et cliquez sur mettre à jour la référence Web
1
student

Votre service Web est-il correctement configuré dans IIS? Le pool utilisé, la version d’ASP.NET (2.0) est définie? Pouvez-vous parcourir le .asmx?

En parlant d’exceptions, essayez de placer un bloc try-catch dans la ligne qui accède à votre service Web. Put et catch (System.Web.Services.Protocolos.SoapException).

En outre, vous pouvez définir un délai d'expiration pour votre objet Webservice.

1
Erup

Le problème que je rencontrais était lié à la version de SOAP. Le service asmx a été configuré pour accepter les deux versions, 1.1 et 1.2. Je pense donc que lorsque vous utilisez le service, le client ou le serveur ne sait pas quelle résolution de version.

Pour résoudre ce problème, il faut ajouter:

using (wsWebService yourService = new wsWebService())
{
    yourService.Url = "https://myUrlService.com/wsWebService.asmx?op=someOption";
    yourService.UseDefaultCredentials = true; // this line depends on your authentication type
    yourService.SoapVersion = SoapProtocolVersion.Soap11; // asign the version of SOAP
    var result = yourService.SomeMethod("Parameter");
}

wsWebService est le nom de la classe générée en tant que référence.

0
Phi