Почему вызов Javascript для Page WebMethod приводит к «500: неизвестный веб-метод»? - PullRequest
3 голосов
/ 28 августа 2009

У меня есть страница с этим методом в CreateTicket.aspx.cs:

[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
    });
}

Запустив его на firebug, я получаю следующую ошибку на консоли:

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

Почему это происходит?

Ответы [ 3 ]

6 голосов
/ 28 августа 2009

Я решил эту проблему.

Что происходило? Что-то глупое (как обычно):

  • Атрибут «Inherits» отсутствовал в объявлении страницы CreateTicket.aspx, поэтому CreateTicket.aspx.cs не был связан как частичный класс, даже с использованием атрибута CodeBehind.
0 голосов
/ 28 августа 2009

Если у вас есть .NET 3.5 или новее, вы также можете настроить службу WCF.

В CodeProject есть краткое руководство о том, как настроить аннотации OperationsContract и DataContract в ваших классах для создания указанного сервиса.

0 голосов
/ 28 августа 2009

наследует ли CreateTicket.aspx от WebService?

Даже если это так, у вашего класса также должен быть атрибут ScriptService , чтобы .NET генерировал дополнительные классы для помощи в вызове его из JavaScript.

Примечание. Это относится только к веб-службам, не относящимся к WCF. WCF добавляет свои собственные атрибуты для выполнения веб-сервисов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...