开发者

Why instance of the page is created when PageMethod is called from client?

As PageMethods in ASP.NET need to be static methods and marked as web method, I was in a impression that instance of that particular page won't be created when a page method is called.

But when I tried putting a break point in the constructor it was getting hit every time a pagemethod is called. Can somebody let me know what is need for constructing an instance?

Thanks

Server side

public partial class PageMethod : System.Web.UI.Page
{

    public PageMethod()
    {

    }

    [System.Web.Services.WebMethod()]
    public static string GetMessage()
    {
        return "Page Method Call";
    }
}

Client Side (used JQuery)

$.ajax({ type: 'POST',
                url: /PageMethod.aspx/GetMessage,
                data: null,
  开发者_运维技巧              success: onSuccess,
                contentType: "application/json; charset=utf-8",
                dataType: 'JSON',
                error: onError      
            });


EDIT

Indeed constructor is called!! See callstack of pagemethod's call:

PageMethodTest_WebApplication3.DLL!PageMethodTest_WebApplication3._Default._Default() Line 9    C#
  App_Web_iielssqo.dll!ASP.default_aspx.default_aspx() + 0x43 bytes C#
  App_Web_iielssqo.dll!__ASP.FastObjectFactory_app_web_iielssqo.Create_ASP_default_aspx() + 0x43 bytes  C#
  System.Web.dll!System.Web.Compilation.BuildResultCompiledType.CreateInstance() + 0x21 bytes   
  System.Web.dll!System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(System.Web.VirtualPath virtualPath, System.Type requiredBaseType, System.Web.HttpContext context, bool allowCrossApp, bool noAssert) + 0x78 bytes    
  System.Web.dll!System.Web.UI.PageHandlerFactory.GetHandlerHelper(System.Web.HttpContext context, string requestType, System.Web.VirtualPath virtualPath = {/Default.aspx}, string physicalPath) + 0x22 bytes  
  System.Web.dll!System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(System.Web.HttpContext context, string requestType, System.Web.VirtualPath virtualPath, string physicalPath) + 0x29 bytes  
  System.Web.dll!System.Web.HttpApplication.MapHttpHandler(System.Web.HttpContext context, string requestType, System.Web.VirtualPath path, string pathTranslated = "C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2008\\Projects\\PageMethodTest_WebApplication3\\PageMethodTest_WebApplication3\\Default.aspx", bool useAppConfig) + 0xa1 bytes  

ASP.NET engine routes request from pagemethod to aspx-handler-factory (PageHandlerFactory). As far as I understand it's inner logic of ASP.NET. Therefore it's correct :)

Now check asmx-webmethod call:

  PageMethodTest_WebApplication3.DLL!PageMethodTest_WebApplication3.WebService1.HelloWorld() Line 22    C#
  [Native to Managed Transition]    
  [Managed to Native Transition]    
  System.Web.Extensions.dll!System.Web.Script.Services.WebServiceMethodData.CallMethod(object target, System.Collections.Generic.IDictionary<string,object> parameters) + 0x15c bytes   
  System.Web.Extensions.dll!System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(object target, System.Collections.Generic.IDictionary<string,object> parameters) + 0x1f bytes   
  System.Web.Extensions.dll!System.Web.Script.Services.RestHandler.InvokeMethod(System.Web.HttpContext context = {System.Web.HttpContext}, System.Web.Script.Services.WebServiceMethodData methodData = {System.Web.Script.Services.WebServiceMethodData}, System.Collections.Generic.IDictionary<string,object> rawParams) + 0x61 bytes    
  System.Web.Extensions.dll!System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(System.Web.HttpContext context = {System.Web.HttpContext}, System.Web.Script.Services.WebServiceMethodData methodData) + 0x55 bytes    
  System.Web.Extensions.dll!System.Web.Script.Services.RestHandler.ProcessRequest(System.Web.HttpContext context) + 0xc bytes   
  System.Web.Extensions.dll!System.Web.Script.Services.ScriptHandlerFactory.HandlerWrapper.ProcessRequest(System.Web.HttpContext context) + 0xe bytes   
  System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0xb6 bytes   

Here using another httphandler-factory - ScriptHandlerFactory.

PS Moorthy, thanks! Good question :) 'Live and learn!'


static / [WebMethod] - cos page method is called solely by ajax (without page creation).

If you wanna have Page instance you should use UpdatePanel or AJAX.NET Controls (for instance DevExpress, AjaxToolKit).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜