Victor Rodrigues
Victor Rodrigues

Reputation: 11711

Why Javascript calling to Page WebMethod results in "500: Unknown web method"?

I have a page with this method in CreateTicket.aspx.cs:

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

    return categories.Json();
}

And the javascript/jquery code on the page (same page, .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
    });
}

Running it on firebug, I get the following error on console:

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

Why is this happening?

Upvotes: 3

Views: 7726

Answers (3)

Victor Rodrigues
Victor Rodrigues

Reputation: 11711

I resolved this problem.

What was happening? Something stupid (as usual):

  • 'Inherits' attribute was missing in the CreateTicket.aspx page declaration, so the CreateTicket.aspx.cs wasn't bound as the partial class, even using the CodeBehind attribute.

Upvotes: 6

Powerlord
Powerlord

Reputation: 88796

If you have .NET 3.5 or newer, you can also set up a WCF service.

There's a quick guide on CodeProject on how to set up the OperationsContract and DataContract annotations on your classes in order to create said service.

Upvotes: 0

Powerlord
Powerlord

Reputation: 88796

Does CreateTicket.aspx inherit from WebService?

Even if it does, your class should also have the ScriptService attribute on it, so that .NET generates additional classes to assist in calling it from JavaScript.

Note: This only applies to non-WCF web services. WCF adds in its own attributes for doing web services.

Upvotes: 0

Related Questions