Microsoft BizTalk Server では、SOAP アダプターで使用したり、オーケストレーションを Web サービスとして発行したりするために、Web サービスを幅広く使用しています。 このトピックでは、Web サービスのトラブルシューティングに使用できるいくつかの手順と、一般的な Web サービスの問題とその解決方法について説明します。
.NET Framework トレースを使用して Web サービスのエラーをキャプチャおよびログに記録する
.NET Framework System.Diagnostics.Trace クラスを使用すると、テキスト ファイルにエラーをキャプチャして書き込むことができます。
System.Diagnostics.Trace クラスを使用してエラーをキャプチャしてテキスト ファイルに書き込むには
Web サービスの web.config ファイルを更新して 、TRACE コンパイラ ディレクティブを true に設定し、 TraceSwitch 値を追加します。
<?xml version="1.0"?> <configuration> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:TRACE" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="1" /> </compilers> </system.codedom> <system.diagnostics> <switches> <add name="WebSvcTraceSwitch" value="2" /> <!-- Set to 0, 1, 2, 3, or 4, which corresponds to TraceLevel.Off, TraceLevel.Error, TraceLevel.Warning TraceLevel.Info, and TraceLevel.Verbose. --> </switches> </system.diagnostics> </configuration>
注
TRACE コンパイラ ディレクティブが true に設定されていない場合、トレース出力は生成されません。 TraceSwitch 値は呼び出し元のクラスでも設定できますが、ここでは便宜上、web.config ファイルで設定します。 TraceSwitch の値を開発目的で適切なレベルに設定し、開発が完了した後に値を変更して、トレース出力を減らすか禁止します。
TraceSwitch クラスと TextWriterTraceListener クラスのインスタンスを作成し、Web サービスの [WebMethod] 呼び出しに try...catch ブロックを使用してエラーをトレース出力ファイルにキャプチャして書き込みます。 たとえば、次のコードは、整数変数 s2 をオブジェクト変数 o2 の null インスタンスに設定しようとしたときに生成されるエラーをトラップします。
using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Diagnostics; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { TraceSwitch WebSvcTraceSwitch = new TraceSwitch("WebSvcTraceSwitch", "Web Service Trace"); TextWriterTraceListener TestTracer = new TextWriterTraceListener("C:\\traceout.txt"); // Note that by default the local ASPNET account(IIS 5.x) or the // local NETWORK SERVICE account(IIS 6.0) needs write access to // this directory so that the instance of the // TextWriterTraceListener can write to the trace output file. ); public Service () { } [WebMethod] public string HelloWorld() { string h2 = "Hello World"; //object o2 = 1; object o2 = null; try { int s2 = (int)o2; //Error if o2 set to null return h2; } catch(Exception e) { Trace.Listeners.Add(TestTracer); Trace.WriteLineIf(WebSvcTraceSwitch.Level = TraceLevel.Warning, "Exception caught: " + e.Message); //Writes to the trace file if specified TraceLevel switch value (in web.config) >= 2 TestTracer.Dispose(); return "An error occurred in the Web service, please contact the web server administrator."; } } }
注
このコードは、Microsoft Visual Studio で新しい ASP.Net Web サービス プロジェクトを作成するときに生成される既定の HelloWorld Web サービスの変更されたバージョンです。
注
Windows Vista の場合、ルート フォルダーにトレース出力ファイルを書き込むには管理者特権が必要になる場合があります。
Web サービス プロジェクトをリビルドします。 Try ステートメントでエラーが発生した場合、例外は Catch ステートメントで処理され、エラーはトレース出力ファイルに書き込まれます。
既知の問題
Web サービスから HTTP 404 (ファイルが見つかりません) エラーが返される
問題
Web サービスを呼び出そうとすると、HTTP 404 (ファイルが見つかりません) エラーが返されます。
原因
このエラーは、web サービスをホストする IIS サーバーに ASP.NET がインストールされていない、または有効になっていない場合に発生する可能性があります。
解決策
ASP.NET がインストールされ、有効になっていることを確認します。 .NET Framework がインストールされていない場合はインストールするか、IIS サーバーの %WinDir%\ Microsoft.NET \Framework\vXXX.XXX\ フォルダーにある aspnet_regiis.exe プログラムを実行します。
Web サービスが呼び出されたときに "System.IO.FileNotFoundException" エラーが発生する
問題
Microsoft ASP.NET Web アプリケーションで Web サービスを呼び出すと、次のエラーが表示されることがあります。
System.IO.FileNotFoundException
原因
このエラーは、次のいずれかの条件に該当する場合に発生する可能性があります。
ワーカー プロセスには、プロセスの Temp ディレクトリに対する読み取りアクセス許可がありません。また、ワーカー プロセスには、プロセスの一時ディレクトリに書き込むアクセス許可がありません。
XmlSerializer によって生成されたコードにはコンパイル エラーがあります。
解決策
このエラーは PRB に記載されています。クライアント アプリケーションが Web サービスを呼び出すと、"System.IO.FileNotFoundException" エラーが発生します。
こちらもご覧ください
IIS のアクセス許可の問題を解決するためのガイドライン Web サービスのアクセス許可の問題を解決するためのガイドライン