views:

756

answers:

3

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?

A: 

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.

R. Bemrose
CreateTicket.aspx inherits from System.Web.UI.Page. It didn't have the ScriptService attribute, but I added it and the error remains the same =/
Victor Rodrigues
Every example of aspx web services that I've seen on Microsoft's site has the aspx page inheriting from System.Web.Services.WebService rather than System.Web.UI.Page. The only time I've dealt with Web Services in .NET 2.0 used ashx pages, though, so I don't have a lot of experience writing aspx service pages.
R. Bemrose
@R. Bembrose: he's not using Web Services, he's using PageMethods as outlined here: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/
Crescent Fresh
A: 

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.

R. Bemrose
I want to have a WebMethod in the same page (codebehind, CreateTicket.aspx.cs), can WCF do this?
Victor Rodrigues
+1  A: 

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.
Victor Rodrigues
How the heck did that happen?
Crescent Fresh
Probably CopyAndPasteException.
Victor Rodrigues