PageMehod中使用Linq出現WebServiceFailedException

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>
‧PageMethod
該PageMethod目的去取得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;
}
‧執行結果:
 

Error

最後的執行結果竟然是這個樣子,它出錯在於一個很奇妙的地方。我自己也不太清楚錯在那裡,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