PageMehod中使用Linq出現WebServiceFailedException
今天在撰寫PageMethod時,其中有用到Linq去處理Web站台裡使用來設定UserProfile.xml,
因為PageMethod是一個static,我們沒有辦法直接使用Server.MapPath的指令,因此,我自己
就自作聰明寫了一個Utility的Class,讓我可以直接讀取站台裡檔案的實際路徑,然後取得該
份XML的內容。大概的程式碼如下:
‧UserProfile.xml
<?xml version="1.0" encoding="utf-8" ?>
<UserProfile>
<User>
<ID>Pou</ID>
<Products>
<Product name="WM">
<Process id="App1">
<isRecordCalled>true</isRecordCalled>
<isRecordMail>false</isRecordMail>
</Process>
</Product>
</Products>
</User>
</UserProfile>
[System.Web.Services.WebMethod]
public static string PhoneCallService(string pNumber, string pUID, string pProcess)
{
string tResult = string.Empty;
XMLHandler tXMLHandler = new XMLHandler(LoadConfig.GetWebConfig("UserProfile"));
var tApp1 = from App1 in tDocument.Descendants("User").Elements()
where App1.Element("ID").Value.Equals("DS")
select App1;
string tIsRecord=tApp1.Element("isRecordCalled").Value;
if (tIsRecord== "true")
{
tResult = "record:" + pNumber;
}
else
{
tResult = "norecord:" + pNumber;
}
return tResult;
}
最後的執行結果竟然是這個樣子,它出錯在於一個很奇妙的地方。我自己也不太清楚錯在那裡,debug時也發現Linq的結果是對的。
但在產生到var tApp1時就會出錯了。一開始找不到什麼原因,後來參考了一下Using LINQ in a WebMethod,它裡面有提到使用可以直
接使用HttpContent.Current.Server.MapPath的方法,也可以正常取得Web站台下的內容。這個讓我想到在ASP.NET中操作.resx資源檔中的內容,
所提到取得GlobalResource的用法。因此,我修改了一下程式碼如下:
1: XDocument tDocument =XDocument.Load(HttpContext.Current.Server.MapPath("temp/UserProfile.xml"));
發現就可以正常取得我要的資料了。老實說我還真有點懷疑是不是我自己的Utitlity類別內寫錯了,哈哈。
不過既然.NET已經幫我們包好了,我就把他調整一下就可以完成我要的功能,只能說我太傻了。哈哈。
References:
[ASP.NET AJAX]如何使用 PageMethods 實現非同步機制(一)-基本介紹
[ASP.NET AJAX]如何使用 PageMethods 實現非同步機制(二)-集中管理
[ASP.NET AJAX]如何使用 PageMethods 實現非同步機制(三)-改變傳輸模式
LINQ in webmethod InvalidOperationException