2009-08-28 177 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

相关问题