我正在使用C#.net编程的网站上工作。它使用一个名为ADX Studio的CMS(一个早于那里的决定),它提供了一种形式的URL重写(据我所知,它可以通过将一个aspx页面指定为IIS中的默认404处理程序来实现)。
我有一个网页表单,它存在于重写的URL中。我对其进行了编辑,以便html表单的操作指向重写的URL:
var u = new Uri(Request.RawUrl.Split(new char[1] { ';' }).Last());
userAdminForm.Action = u.PathAndQuery;
(有些丑陋,但根据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
突出显示]
答案 0 :(得分:0)
问题是页面的<form>
标记引用了“丑陋”的网址作为操作。您可以通过从表单中完全删除操作标记来解决此问题。默认情况下,浏览器将回发到同一页面,即。 “漂亮”的网址。
本文解释了如何完成“无动作”形式(约三分之二)http://msdn.microsoft.com/en-us/library/ms972974.aspx
答案 1 :(得分:0)
似乎问题与IIS 5上的问题相同。我可以通过在IIS管理器中执行以下操作来使其工作:
aspnet_isapi.dll
的位置(在我的情况下:C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll)这与我在IIS5的问题中链接的方法基本相同。但是,它并不是最佳的,因为IIS通过asp(甚至是静态文件)运行每个请求。这似乎只会让事情变慢。我希望能够指定asp只需要至少调用HTTP POST请求。
奇怪的是,IIS5在没有注册ISAPI扩展的情况下发布到扩展名时发出HTTP 405错误,但IIS6只是静默失败。页面正在通过IIS运行(我可以使用Page_Load函数中的断点进行调试),但IsPostBack
(和IsCrossPagePostBack
)未正确设置。它可能与视图状态有关吗?我的解决方案有其他替代方案吗?
答案 2 :(得分:0)
我认为我认为这是解决这个问题的最佳方案。事实证明,ADXStudio CMS确实使用默认的404规则来进行某种形式的URL重写。这与http POST:
有问题当IIS最初执行自定义时 在404错误的URL上,它将POST更改为 GET,即使客户端进行POST 请求。
(感谢精英大脑关于setting up IIS6 and ASP.NET MVC的博文)。
我决定使用Ionics Isapi Rewrite Filter来重写我的网址,而不是创建自己的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。
的开销