共用方式為


針對 BizTalk Web 服務進行疑難解答

本節提供如何識別和解決常見 Web 服務問題的建議。

一般疑難排解

啟用 Web 服務發佈精靈追蹤

您可以取消批注 <BTSWebSvcWiz.exe.config 檔案中的新增> 節點,以啟用追蹤以偵錯 BizTalk Web 服務發佈精靈。 如需從 Web 服務發布精靈取得追蹤資訊的詳細資訊,請參閱 如何修改 BTSWebSvcWiz.exe.config

啟用SOAP訊息追蹤

您可以啟用SOAP訊息追蹤,以協助您使用SOAP擴充功能偵錯Web服務發佈應用程式。 如需SOAP延伸模組的詳細資訊,請參閱 如何:實作SOAP擴充功能

使用 ThrowDetailedError 選項

如果發生錯誤,Web 用戶端會收到泛型 SoapException

若要偵錯已發佈的 Web 服務,您可以將開關新增至 web.config 檔案,以控制已發佈 Web 服務傳回的例外詳情層級。 參數為 ThrowDetailedError,當參數設定為 True 時,伺服器 Proxy 會將內部例外狀況資訊傳回至 Web 用戶端,讓您偵錯已發佈的 Web 服務。

下列 XML 程式代碼顯示於 <appSettings> 節點下 web.config 檔案中的 ThrowDetailedError 選項:

<appSettings>
  <add key="ThrowDetailedError" value="False" />
<appSettings/>

警告

內部例外狀況可能包含敏感性資訊。 偵錯之後,您應該將 ThrowDetailedError 參數設定為 False

使用 .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類別的實例,並在 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.";
            }
        }
    }
    

    備註

    當您在 Visual Studio 中建立新的 ASP.Net Web 服務 專案時,此程式代碼是預設產生的 HelloWorld Web 服務修改版本。

    備註

    針對 Windows Vista,可能需要系統管理員許可權,才能將追蹤輸出檔案寫入根資料夾。

  3. 重建 Web 服務專案。 現在,如果在 Try 語句中發生錯誤,則會在 Catch 語句中處理例外狀況,並將錯誤寫入追蹤輸出檔。

常見疑難解答與問答

本節包含一組問題和解答,旨在協助您解決 Web 服務的問題。

我在取用 Web 服務時收到錯誤;如何避免它們?

取用 Web 服務時需要考慮許多詳細數據,包括下列各項:

  • 避免在參數名稱中使用兩個底線字元。

  • Web 方法不支援 any 元素或 anyAttribute 屬性。

  • 請避免使用 XLANG/s 關鍵詞作為 Web 服務名稱或 Web 方法名稱。

  • 避免使用 XLANG/s 不支援的 Web 方法參數類型。

  • 請勿在您的架構中使用 C# 關鍵詞或將來會被視為 C# 識別碼無效的元素名稱。

  • 避免具有多個服務或埠類型定義的 Web 服務描述語言 (WSDL) 檔案。

  • Web 方法參數必須是 Xml Serializable。

  • 請避免參考包含多根架構的已取用 Web 服務。

  • 避免使用需要泛型類型參數的 Web 方法來參考 Web 服務,例如可為 Null 值的參數。

  • 不支援 WSDL 匯入專案。

    如需這些和相關考慮的詳細資訊,請參閱 取用Web服務時的考慮

為什麼我在發佈使用 <include> 元素的架構時會出現錯誤?

如果架構包含循環參考(被包含的架構具有指向包含架構的 include 元素),則無法發佈,或如果架構具有未解析的 schemaLocation 屬性也無法發佈。

如需 include 元素限制的詳細資訊,請參閱 Include 元素系結支援。 Web 服務發佈精靈與 .NET Framework 2.0 中的 XSD.exe 相同限制:如需詳細資訊,請參閱 Import Element Binding Support

為什麼我在發佈信封架構時收到錯誤?

如果您有要發佈為 Web 服務的信封架構,則必須手動修改產生的 Web 專案。

修改信封架構產生的 Web 專案
  1. <開啟 myWebService>.asmx.cs 檔案。

  2. 編輯檔案並變更 bodyTypeAssemblyQualifiedName = <dll.name.version>bodyTypeAssemblyQualifiedName = null

備註

如果先前的 .dll 檔案仍在 ASP.NET 背景工作進程中,您可能需要重設 Internet Information Services (IIS)。

已發佈 Web 服務的客戶端可能不會收到伺服器腳本執行超時錯誤

如果使用 .NET Framework 的 Web 用戶端在呼叫透過 BizTalk Server 網頁服務發佈精靈產生的 Web 服務時,該用戶端可能無法接收到伺服器腳本逾時錯誤,因為預設情況下,客戶端請求逾時會先發生。 若要解決此問題,您可以執行下列其中一項作業:

  • 藉由增加用戶端上 HttpWebRequest.Timeout 屬性的值,將用戶端要求逾時增加為大於伺服器腳本逾時的值。

  • 藉由減少伺服器上的 HttpServerUtility.ScriptTimeout 屬性值,將伺服器腳本逾時減少為小於用戶端要求逾時的值。

常見錯誤

Web 服務會傳回 HTTP 404 (找不到檔案) 錯誤

問題

嘗試呼叫 Web 服務傳回 HTTP 404(找不到檔案)錯誤。

原因

如果未在裝載 Web 服務的 IIS 伺服器上安裝及/或啟用 ASP.NET,就會發生此錯誤。

解決辦法

請確定已安裝並啟用 ASP.NET。 如果未安裝 .NET Framework,請安裝 .NET Framework,或執行位於 IIS 伺服器的 %WinDir%\Microsoft.NET\Framework\vXXX.XXX\ 資料夾中的 aspnet_regiis.exe 程式。

日期欄位會從使用 BizTalk Server Web 服務發布精靈產生的 Web 服務所處理的文件中移除

問題

當您使用 BizTalk Server Web 服務發布精靈所產生的 Web 服務來處理檔時,會從檔中移除含有 xs:date數據類型之欄位中的任何數據。

原因

如果已發佈的編排包含具有一個或多個字段,這些字段的數據類型xs:date,且Nillable屬性為True,就可能發生此問題。

因應措施

若要解決此問題,請找出已發佈架構中具有 xs:date數據類型的欄位,並確認這些欄位的 Nillable 屬性設定為 False

呼叫 Web 服務時,會發生「System.IO.FileNotFoundException」錯誤

問題

當您在 Microsoft ASP.NET Web 應用程式中呼叫 Web 服務時,您可能會收到下列錯誤:

System.IO.FileNotFoundException(檔案未找到例外狀況)

原因

如果下列任一條件成立,就可能發生此錯誤:

  • 背景工作進程沒有讀取至進程 Temp 目錄的許可權,而且背景工作進程沒有寫入進程暫存目錄的許可權。

  • XmlSerializer 產生的程式代碼中有編譯錯誤。

解決辦法

此錯誤記載於Microsoft知識庫文章 823196。 請遵循此知識庫文章的解決一節中的步驟來解決此錯誤。