Asp.net 带有自定义处理程序的PageMethod

Asp.net 带有自定义处理程序的PageMethod,asp.net,Asp.net,我有一个基于页面的web方法,它使用[WebMethod]运行良好,即 [WebMethod] public static void DoSomethingOnTheServer() { } 我还有一个自定义页面处理程序,使SEO友好的URL成为可能 e、 g => 我正在使用ProcessRequest处理程序中的Server.Transfer来实现这一点。这一切都很好。此外,当用户请求URL时,my page方法也可以正常工作,例如: 但是,当用户请求自定义处理的URL时,即 客户端报

我有一个基于页面的web方法,它使用[WebMethod]运行良好,即

[WebMethod]
public static void DoSomethingOnTheServer()
{
}
我还有一个自定义页面处理程序,使SEO友好的URL成为可能

e、 g

=>

我正在使用ProcessRequest处理程序中的Server.Transfer来实现这一点。这一切都很好。此外,当用户请求URL时,my page方法也可以正常工作,例如:

但是,当用户请求自定义处理的URL时,即

客户端报告PageMethod已成功完成,但根本没有调用它

我猜它与我的自定义处理程序有关,因此我对其进行了修改,以包含PathInfo:

public void ProcessRequest(HttpContext context) 
{
   // ...  (code to determine id) ...

   // Transfer to the required page
   string actualPath = 
              "~/page.aspx" + context.Request.PathInfo + "?id=" + determinedId;
   context.Server.Transfer(actualPath);
}
因此,如果调用PageMethod,将导致:

我想知道这是否是调用PageMethod的正确语法

尝试服务器传输报告时:

在服务器上执行/MySite/page.aspx/dosomething的子请求时出错

我已经尝试过HttpContext.RewritePath,但不确定如何让它执行请求


这似乎不起作用,有什么想法吗?

我认为您必须使用“重写url”方法,避免现在的方式

为什么不试试这个

从这个想法开始学习,也许把你的想法变成这样

Server.Transfer不是使url友好的方法,在我看来,您必须避免使用它,并且只在非常特殊的情况下使用它

在Server.Transfer中,实际停止某个页面的执行,并开始执行另一个页面。这是调用的代码。事实上,我认为这不是运行每个页面的好方法。我不太确定在一些困难的情况下还会发生什么,比如在ResponceWrite、MSAjax、控件更改、多线程页面等上会发生什么。。。为什么每页都要打两次电话?您使程序每次初始化并运行2个页面,而不是仅运行一个页面。第一个被调用,以取消,然后第二个被运行。同样从我这里看到的,他们不允许回调

仅在某些特殊事件中使用转接,而不是在每次通话中使用转接

public void Transfer(string path, bool preserveForm)
{
    Page handler = this._context.Handler as Page;
    if ((handler != null) && handler.IsCallback)
    {
        throw new ApplicationException(SR.GetString("Transfer_not_allowed_in_callback"));
    }
    this.Execute(path, null, preserveForm);
    this._context.Response.End();
}
例如,我使用了Transfer,这种方式:我有一个有多个名称的网站,我在url上检查webname。如果一些人没有键入正确的url,那么我不会在正常页面上发送他们,但首先我会进行服务器传输(在url/路径上保持相同的名称)以通知他该错误,然后如果他愿意,单击转到正确的url

但是包含消息的页面非常简单

所以我使用Transfer,只是为了某种错误,我喜欢保持相同的url/路径,并通知他该错误

对于所有其余的部分,我使用路径重写,这是出于这个原因

Url重写也用于post 请参阅本页

然后查看html页面的源代码,并查看我在表单中调用的内容…

你看,我又叫同一页了。首先想到的是,我已经改变了形式的网址也!,第二个是我的程序在url重写上做的帖子

我调任的例子 请看这两页

第二个是服务器传输,发生在与第一个相同的代码上。 第二个url,仅在极少数情况下使用,我不会失去那个用户,也不会显示相同的站点


希望这对您有所帮助。

最后,将PageMethod更改为ASMX ScriptService是最简单的解决方案,与我现有的自定义处理程序配合使用。

谢谢您的消息。我在自定义处理程序中使用Server.Transfer,因此我不确定服务器是否每次初始化并运行2个页面。因为它是在自定义处理程序中完成的,所以只会加载1个页面。但是,将处理两个请求,但只加载目标页。i、 e.URL被处理两次,但这是不可避免的。