【问题标题】:POSTing to a re-written URL on IIS 6 doesn't work在 IIS 6 上发布到重写的 URL 不起作用
【发布时间】:2009-12-28 02:15:38
【问题描述】:

我正在开发一个用 C# .net 编程的网站。它使用一个名为 ADX Studio 的 CMS(早于我在那里的决定),它提供了一种糟糕的 URL 重写形式(据我所知,它通过将 aspx 页面分配为 IIS 中的默认 404 处理程序来工作)。

我有一个 Web 表单,它位于一个重写的 URL 上。我对其进行了编辑,以便 html 表单的操作指向重写后的 URL:

var u = new Uri(Request.RawUrl.Split(new char[1] { ';' }).Last());
userAdminForm.Action = u.PathAndQuery;

(有点丑陋,但基于这些重写 URL 上的 Request.RawUrl 的内容)。

“漂亮”的 URL 是这样的:

http://www.site.com/admin/user/edit/

在我的开发盒 (Windows XP/IIS 5) 上,当我最初尝试像这样 POST 回 URL 时,我收到了 HTTP 405 错误。我通过adding a script mapping so Aspnet_isapi.dll handles all (*) requests 解决了这个问题。在我的开发机器上一切正常。

我只是将我的更改推送到实时服务器(Windows Server 2003 R2 和 IIS 6),然后帖子静默失败。页面刷新,但我的所有逻辑(来自代码中的 IsPostBack 路径)都没有受到影响。没有显示错误,只是不起作用。

如果我删除设置表单的 .Action 的代码,则回发可以工作,但它会发布到与 aspx 文件的物理位置相对应的丑陋 URL,而不是我的页面。

我是否缺少一种简单的方法来完成这项工作?我不想切换 URL 重写方法或任何东西,因为这是一个大型遗留网站,不幸的是非常依赖 ADX Studio,所以我不想做任何会破坏它的事情。

[编辑因为不知何故上面的代码失去了它的code突出显示]

【问题讨论】:

    标签: c# .net iis url-rewriting


    【解决方案1】:

    问题在于页面的<form> 标记将“丑陋”的网址作为操作引用。您可以通过从表单中完全删除操作标签来解决此问题。默认情况下,浏览器将回发到同一页面,即。 “漂亮”的网址。

    这篇文章解释了如何完成一个“无动作”的表单(~ 向下的三分之二)http://msdn.microsoft.com/en-us/library/ms972974.aspx

    【讨论】:

    • 感谢您的回答,但不幸的是,这不是问题所在。使用上面包含的代码,我将表单标签操作属性设置为指向漂亮的 URL。哪个工作正常(如果我在生成的页面上查看源代码 - 并且当我提交表单并最终在同一页面上时我可以知道)。但不知何故,该页面在回发时似乎并没有充当回发。奇怪(而且很烦人!)它在我的开发机器上运行良好......
    • 如何在 prod 服务器上进行重写?我们使用 IIRF,它会在所有请求到达 asp.net isapi 模块之前捕获它们。
    • 由ADX Studio内置系统完成。据我所知,这是基于设置自定义 404(找不到页面)错误处理程序...
    • 我相信我们找到了可行的解决方案。只需将表单的操作设置为 # 这与使用空白操作相同。
    • 感谢您提供帮助,但问题不在于表单的发布位置。正如我所解释的,客户端运行良好,用户浏览器正在返回正确的 URL。问题是 ASP 没有认识到回发确实是回发。我现在将添加一个可能的解决方案的答案...
    【解决方案2】:

    似乎问题与 IIS 5 上的问题相同。我可以通过在 IIS 管理器中执行以下操作来使其工作:

    • 右键点击相关网站,选择“属性”
    • 选择“主目录”标签
    • 在“应用程序设置”中点击“配置”
    • 点击“通配符应用地图”旁边的“插入”
    • 浏览到aspnet_isapi.dll的位置(在我的例子中:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll)
    • 取消勾选“检查文件是否存在”
    • 在俄罗斯娃娃对话框中单击“确定”返回。

    这与我在 IIS5 问题中链接到的方法基本相同。但是,它并不是最佳的,因为 IIS 是通过 asp 运行每个请求(甚至是静态文件)。这似乎只能减慢速度。我希望能够指定 asp 至少只需要为 HTTP POST 请求调用。

    奇怪的是,当 POST 到没有注册 ISAPI 扩展的扩展时,IIS5 给出了 HTTP 405 错误,但 IIS6 只是静默失败。该页面正在通过 IIS 运行(我可以在 Page_Load 函数中使用断点进行调试),但 IsPostBack(和 IsCrossPagePostBack)没有正确设置。它可能与视图状态有关吗?我上面描述的解决方案有什么替代方案吗?

    【讨论】:

      【解决方案3】:

      我已经得出了我认为是解决此问题的最佳解决方案。事实证明,ADXStudio CMS 确实使用默认的 404 规则来进行某种形式的 URL 重写。这是http POST的问题:

      当 IIS 最初执行自定义 出现 404 错误的 URL,它将 POST 更改为 GET,即使客户端执行 POST 请求。

      (感谢精英大脑关于setting up IIS6 and ASP.NET MVC 的博文)。

      我决定改用Ionics Isapi Rewrite Filter 来重写我的 URL,而不是创建自己的 HttpModule。然后我将 IIS 中的 404 错误处理程序设置为默认值。我创建了这个 IIRF.ini 文件以将所有请求重定向到与生成的 404 处理程序相同的格式:

      RewriteCond %{REQUEST_FILENAME}  !-d
      RewriteCond %{REQUEST_FILENAME}  !-f
      RewriteRule ^(.*)$               /Default.aspx?404;http://%{HTTP_HOST}$1  [U,L]
      

      一切似乎都很好。与my previous answer 相比的优势在于,重写代码级别较低且运行速度快,并且 -f 和 -d 开关意味着如果文件实际存在,则不会重写,因此静态文件不会产生通过 .net 运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2011-04-08
        • 2023-03-08
        • 2013-07-26
        • 1970-01-01
        相关资源
        最近更新 更多