C#を使用しており、自動生成されたC#プロキシオブジェクトを介してWebServiceに接続しています。私が呼び出しているメソッドは長時間実行されることがあり、時にはタイムアウトすることもあります。さまざまなエラーが返され、時々System.Net.WebException
またはSystem.Web.Services.Protocols.SoapException
。これらの例外には、ユーザーにわかりやすいバージョンを表示できる特定のタイプのエラーを見つけるために問い合わせできるプロパティがあります。
しかし、時々InvalidOperationException
を取得するだけで、次のメッセージが表示されます。私が認識しているものの文字列を掘り下げることなく、これが何であるかを解釈する方法はありますか?.
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.
-->
--.
編集:私は、Webサーバー上のメソッドの周りにトライキャッチを持っています。デバッグしましたが、Webサーバーメソッドは例外なく(1分ほどで)戻ります。また、Webサービスに未処理の例外ハンドラーと、ヒットしなかったブレークポイントを追加しました。 Webサービスが戻るとすぐに、予想した結果ではなく、クライアントでこのエラーが発生します。
これは、Webサービスに未処理の例外があり、.NETランタイムがXMLではなく、死亡サーバーエラー/例外ダンプページのHTML黄色い画面を吐き出しているために発生しています。
Webサービスのコンシューマーはtext/xmlヘッダーを予期していましたが、代わりにtext/htmlを取得していたため、そのエラーがスローされます。
タイムアウトの原因に対処する必要があります(おそらく長いSQLクエリですか?)。
また、チェックアウト このブログ記事 Jeff Atwoodのブログで、グローバルな未処理の例外ハンドラーの実装とSOAP exceptions。
つまり、消費者はWebサービスからのXMLを期待していますが、Webサービスはタイムアウトが原因で失敗しているため、エラーが示すようにHTMLを返します。
したがって、リモートWebサービスプロバイダーに連絡して、障害が発生していることを通知し、修正アクションを実行する必要があります。あなたがウェブサービスのプロバイダーでない限り、例外をキャッチして、どのエラーが発生したかをコンシューマに伝えるXMLを返す必要があります(「リモートプロバイダー」もおそらくそれを行う必要があります)。
.NETバージョン4.0を使用している場合。 validateRequestionはすべてのページでデフォルトでオンになっています。以前のバージョン1.1および2.0では、aspxページ専用でした。デフォルトの検証をオフにすることができます。その場合、デューデリジェンスを行い、データがクリーンであることを確認する必要があります。 HtmlEncodeを使用します。検証をオフにするには、次を実行します
Web.configで、system.webに次の行を追加します
<httpRuntime requestValidationMode="2.0" />
そして
<pages validateRequest="false" />
これについて詳しく読むことができます http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes また http://msdn.Microsoft.com/en-us /library/ff649310.aspx
お役に立てれば。
Web.configの構成エラーの結果としてこれが発生しました。接続文字列などをチェックすることは、タイムアウトの答えかもしれません。
Webサーバーがhttp 500エラーコードを返しています。これらのエラーは通常、Webサーバーで例外がスローされたときに発生し、それをキャッチするロジックがないため、HTTP 500エラーが発生します。通常、コードにtry-catchブロックを配置することで問題を解決できます。
Web.configファイルを削除して、もう一度挿入します。 http://forums.asp.net/post/916808.aspx
Webサービスの戻り値のタイプと SoapDocumentMethod を変更すると、このエラーが発生しました。
最初は:
[WebMethod]
public int Foo()
{
return 0;
}
fire and forget type このようにすることにしました:
[SoapDocumentMethod(OneWay = true)]
[WebMethod]
public void Foo()
{
return;
}
このような場合、Web参照の更新が役立ちました。
Webサービス参照を更新するには:
WebサービスはIISで正しく構成されていますか?プールを使用して、ASP.NET(2.0)のバージョンが設定されていますか? .asmxを閲覧できますか?
例外について話して、Webサービスにアクセスする行にtry-catchブロックを入れてみてください。 Put and catch(System.Web.Services.Protocolos.SoapException)。
また、Webサービスオブジェクトのタイムアウトを設定できます。
私が抱えていた問題は、SOAP version。asmx
サービスは1.1と1.2の両方のバージョンを受け入れるように構成されていたため、サービスを使用しているとき、クライアントまたはサーバーは、どのバージョンが解決するかを知りません。
これを修正するには、以下を追加する必要があります:
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
は、参照として生成されたクラスの名前です。