PageMethod与自定义处理程序

时间:2010-03-20 15:03:51

标签: asp.net

我有一个基于页面的网络方法,使用[WebMethod]工作正常,即

[WebMethod]
public static void DoSomethingOnTheServer()
{
}

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

e.g

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(/strong>

的子请求时出错

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

这似乎没有用,有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为你必须使用重写url方法并避免你现在的方式。

为什么不试试

http://urlrewriter.net/

并开始学习这个想法,也许可以将你改成类似的东西。

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

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

使用转移,仅用于某些特殊事件,而不是用于每次通话。

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 /路径,并告知他该错误。

对于所有其余的,我使用路径重写,因为这个原因。

Url Rewrite也用于帖子

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

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

您看到我再次呼叫同一页面。首先想到的是我也改变了表单url!,其次是我的程序保存了在url上重写的帖子。

我转移的例子

见这2页。

http://www.mytail.gr/

http://www.koutavia.gr/

第二个是服务器传输,并且与第一个代码发生在相同的代码上。 第二个网址,仅在极少数情况下使用,我没有赢得该用户,nether显示相同的网站。

希望这对你有所帮助。

答案 1 :(得分:1)

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