2009-08-28 48 views
3

我有一個頁面,這個方法在CreateTicket.aspx.cs:爲什麼JavaScript調用Page WebMethod會導致「500:未知的Web方法」?

[WebMethod()] 
public static string Categories() 
{ 
    var business = new CategoryBusiness(); 
    var categories = business.ListRootCategories(); 

    return categories.Json(); 
} 

和JavaScript/jQuery代碼在頁面上(同一頁,的.aspx):

function LoadRootCategories() { 
    PageMethod("CreateTicket.aspx", "Categories", [], LoadCategoriesSucceded, LoadCategoriesFailed); 
} 


function PageMethod(page, fn, paramArray, successFn, errorFn) 
{ 
    //Create list of parameters in the form: 
    //{"paramName1":"paramValue1","paramName2":"paramValue2"} 
    var paramList = ''; 
    if (paramArray.length > 0) 
    { 
     for (var i=0; i<paramArray.length; i+=2) 
     { 
      if (paramList.length > 0) paramList += ','; 
       paramList += '"' + paramArray[i] + '":"' + paramArray[i+1] + '"'; 
     } 
    } 
    paramList = '{' + paramList + '}'; 
    //Call the page method 
    $.ajax({ 
     type: "POST", 
     url: page + "/" + fn, 
     contentType: "application/json; charset=utf-8", 
     data: paramList, 
     dataType: "json", 
     success: successFn, 
     error: errorFn 
    }); 
} 

上運行它螢火蟲,我在控制檯上得到以下錯誤:

500 Internal Server Error 
Unknown web method Categories. 
[ArgumentException: Unknown web method Categories. 
Parameter name: methodName] 
    System.Web.Script.Services.WebServiceData.GetMethodData(String methodName) +517489 
    System.Web.Handlers.ScriptModule.OnPostAcquireRequestState(Object sender, EventArgs eventArgs) +168 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +75 

爲什麼會發生這種情況?

回答

6

我解決了這個問題。

發生了什麼事?愚蠢的東西(像往常一樣):

  • 「繼承」屬性缺失在CreateTicket.aspx頁聲明,所以CreateTicket.aspx.cs沒有義務爲部分類,甚至使用代碼隱藏屬性。
+0

這是怎麼發生的? – 2009-08-28 18:10:25

+2

可能是CopyAndPasteException。 – 2009-08-28 18:33:50

0

CreateTicket.aspx是否繼承自WebService?

即使這樣做,您的班級也應該具有ScriptService屬性,以便.NET生成其他類以協助從JavaScript調用它。

注意:這僅適用於非WCF Web服務。 WCF添加了自己的屬性來完成Web服務。

+0

CreateTicket.aspx繼承自System.Web.UI.Page。它沒有ScriptService屬性,但我添加了它並且錯誤仍然保持不變=/ – 2009-08-28 17:41:28

+0

我在Microsoft網站上看​​到的每個aspx web服務示例都有一個aspx頁面,它繼承自System.Web.Services.WebService比System.Web.UI.Page。但是,在.NET 2.0中處理Web服務的唯一情況是使用了ashx頁面,所以我沒有很多編寫aspx服務頁面的經驗。 – Powerlord 2009-08-28 17:42:59

+0

@R。 Bembrose:他沒有使用Web服務,他使用了PageMethods,如下所示:http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ – 2009-08-28 17:47:27

0

如果你有.NET 3.5或更新版本,你也可以設置一個WCF服務。

CodeProject上有一個quick guide關於如何在您的類上設置OperationsContract和DataContract註釋以創建所述服務。

+0

我想要在同一個頁面中有一個WebMethod(代碼隱藏,CreateTicket.aspx.cs),WCF可以做到這一點嗎? – 2009-08-28 17:42:17

相關問題