2009-08-28 7 views
3

J'ai une page avec cette méthode dans CreateTicket.aspx.cs:Pourquoi Javascript appelant à Page WebMethod aboutit à "500: méthode web inconnue"?

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

    return categories.Json(); 
} 

Et le javascript/code jquery sur la page (même 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 
    }); 
} 

Courir sur firebug, j'obtiens l'erreur suivante sur la 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 

Pourquoi cela se produit-il?

Répondre

6

J'ai résolu ce problème.

Que se passait-il? Quelque chose stupide (comme d'habitude):

  • attribut 'Hérite de lui manquait dans la déclaration de la page CreateTicket.aspx, de sorte que les CreateTicket.aspx.cs n'a pas été lié comme la classe partielle, même en utilisant l'attribut CodeBehind. CreateTicket.aspx hérite de System.Web.UI.Page.
+0

Comment diable est-ce arrivé? –

+2

Probablement CopyAndPasteException. –

0

Est-ce que CreateTicket.aspx hérite de WebService?

Même si c'est le cas, votre classe devrait également avoir l'attribut ScriptService, afin que .NET génère des classes supplémentaires pour l'aider à l'appeler à partir de JavaScript.

Remarque: Ceci s'applique uniquement aux services Web non-WCF. WCF ajoute dans ses propres attributs pour faire des services Web.

+0

Il n'a pas l'attribut ScriptService, mais je l'ai ajouté et l'erreur reste la même =/ –

+0

Chaque exemple de services Web aspx que j'ai vu sur le site de Microsoft a la page aspx héritant de System.Web.Services.WebService plutôt que System.Web.UI.Page. La seule fois où j'ai traité des services Web dans .NET 2.0, j'ai utilisé des pages ashx, donc je n'ai pas beaucoup d'expérience dans l'écriture de pages de service aspx. – Powerlord

+0

@R. Bembrose: il n'utilise pas Web Services, il utilise PageMethods comme indiqué ici: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ –

0

Si vous avez .NET 3.5 ou plus récent, vous pouvez également configurer un service WCF.

Il existe un quick guide sur CodeProject sur la façon de configurer les annotations OperationsContract et DataContract sur vos classes afin de créer ledit service.

+0

Je veux avoir un WebMethod dans la même page (codebehind, CreateTicket.aspx.cs), est-ce que WCF peut faire cela? –

Questions connexes