Web 服务疑难解答

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

使用.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 的空实例时生成的错误:

    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,可能需要管理员权限才能将跟踪输出文件写入根文件夹。

  3. 重新生成 Web Services 项目。 现在,如果 Try 语句中发生错误,则会在 Catch 语句中处理异常,并将错误写入跟踪输出文件。

已知问题

Web Services 返回 HTTP 404(找不到文件)错误

问题

尝试调用 Web Services 时返回 HTTP 404(找不到文件)错误。

原因

如果承载 Web Services 的 IIS 服务器没有安装和/或启用 ASP.NET,可能出现此错误。

解决方法

确保安装并启用了 ASP.NET。 如果未安装.NET Framework并/或运行位于 IIS 服务器的 %WinDir%\Microsoft.NET\Framework\vXXX.XXX\ 文件夹中的aspnet_regiis.exe 程序。

调用 Web Services 时出现“System.IO.FileNotFoundException”错误。

问题

在 Microsoft ASP.NET Web 应用程序中调用 Web Services 时,可能出现以下错误:

System.IO.FileNotFoundException

原因

如果满足以下条件之一,就可能出现此错误:

  • 工作进程没有读取进程 Temp 目录的权限,并且工作进程没有写入进程 Temp 目录的权限。

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

解决方法

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

另请参阅

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