本節提供如何識別和解決常見 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 類別來擷取錯誤,並將錯誤寫入文本檔
更新 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."; } } }
備註
當您在 Visual Studio 中建立新的 ASP.Net Web 服務 專案時,此程式代碼是預設產生的 HelloWorld Web 服務修改版本。
備註
針對 Windows Vista,可能需要系統管理員許可權,才能將追蹤輸出檔案寫入根資料夾。
重建 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 專案
<開啟 myWebService>.asmx.cs 檔案。
編輯檔案並變更
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。 請遵循此知識庫文章的解決一節中的步驟來解決此錯誤。