Web 服务疑难解答

Microsoft BizTalk Server 广泛使用 Web 服务,以便与 SOAP 适配器一起使用,并在将业务流程发布为 Web 服务时使用。 本主题提供了一些可以遵循的步骤来对 Web 服务进行故障排除,以及一些常见的 Web 服务问题以及如何解决这些问题。

使用 .NET Framework 跟踪捕获和记录 Web 服务中的错误

.NET Framework System.Diagnostics.Trace 类可用于捕获错误并将其写入文本文件。

使用 System.Diagnostics.Trace 类捕获错误并将其写入文本文件

  1. 更新 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 值设置为用于开发目的的适当级别,并在开发完成后更改值,以减少或抑制跟踪输出。

  2. 创建 TraceSwitchTextWriterTraceListener 类的实例,并使用 try... Web 服务 [WebMethod] 调用中的 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.";
            }
        }
    }
    

    注释

    此代码是默认 HelloWorld Web 服务的修改版本,在 Microsoft Visual Studio 中创建新的 ASP.Net Web 服务 项目时生成。

    注释

    对于 Windows Vista,可能需要管理员权限才能将跟踪输出文件写入根文件夹。

  3. 重新生成 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

原因

如果满足以下任一条件,则可能会出现此错误:

  • 工作进程无权读取到进程临时目录,而工作进程无权写入进程临时目录。

  • XmlSerializer 生成的代码中存在编译错误。

决议

PRB 中记录了此错误 :当客户端应用程序调用 Web 服务时,会收到“System.IO.FileNotFoundException”错误

另请参阅

解决 IIS 权限问题的指南解决 Web 服务权限问题的指南