【问题标题】:PageMethod with Custom Handler带有自定义处理程序的 PageMethod
【发布时间】:2010-03-20 15:03:50
【问题描述】:

我有一个基于页面的 web 方法,它使用 [WebMethod] 可以正常工作,即

[WebMethod]
public static void DoSomethingOnTheServer()
{
}

我还有一个自定义页面处理程序可以使 SEO 友好的 URL 成为可能,

例如

http://localhost/MySite/A_nice_url.ext => http://localhost/MySite/page.aspx?id=1

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

http://localhost/MySite/page.aspx?id=1

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

http://localhost/MySite/A_nice_url.ext

客户端报告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,它会导致:

http://localhost/MySite/page.aspx/DoSomethingOnTheServer?id=1

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

当我尝试使用 Server.Transfer 报告时:

执行 /MySite/page.aspx/DoSomethingOnTheServer 的子请求时出错

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

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    我认为你必须使用rewrite url方法,避免你现在的方式。

    为什么不试试

    http://urlrewriter.net/

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

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

    Server.Transfer,实际上是停止某个页面的执行,并开始执行另一个页面。这是调用的代码。实际上,我认为这不是运行每个页面的好方法。而且我不太确定在某些困难情况下还发生了什么,例如在 ResponceWrite、MSAjax、控制更改、多线程页面等上真正发生了什么......以及为什么要在每个页面上进行 2 次调用?您使程序每次初始化并运行 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();
    }
    

    例如 - 我使用了这种方式的转移:我有一个有多个名称的网站,我检查了 url 上的 webname。如果有些人没有输入更正的 url,那么我不会在正常页面上发送它们,但首先我进行服务器传输(在 url/路径上保持相同的名称)以通知他该错误 - 然后如果他喜欢点击转到正确的网址。

    但是带有消息的页面非常非常简单。

    所以我使用转移,仅用于某种​​错误,我喜欢保持相同的 url/路径,并通知他该错误。

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

    Url Rewrite 也用于帖子

    查看此页面 http://www.mytail.gr/en/Skilakia/Jack_Russell_Terrier.aspx

    然后查看html页面源码,查看我在form ...上调用的内容

    你看我又调用了同一个页面。首先想到这里是我也更改了表单 url!,其次是我的程序持有关于 url rewrite 的帖子。

    我的转移示例

    请参阅这 2 页。

    http://www.mytail.gr/

    http://www.koutavia.gr/

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

    希望对您有所帮助。

    【讨论】:

    • 感谢您的留言。我在自定义处理程序中使用 Server.Transfer,所以我不确定服务器是否每次都初始化并运行 2 页。因为它肯定是在自定义处理程序中完成的,所以只会加载 1 个页面。但是,将处理两个请求,但只加载目标页面。即 URL 被处理了两次,但这是不可避免的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2019-10-27
      相关资源
      最近更新 更多