首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RedirectToAction()中断

RedirectToAction()中断
EN

Stack Overflow用户
提问于 2015-12-02 22:01:51
回答 1查看 129关注 0票数 2

注意:不是RedirectToAction()造成问题的原因,而是用web.config重写规则

原始问题:在使用RedirectToAction()时有一种奇怪的行为,我无法在本地进行复制(调试)。在某个时候,我的路由值从äa更改为äa,但只在服务器上(Azure)。我添加了日志以精确定位,最后在这里结束了:

代码语言:javascript
复制
RedirectToAction("square", new { id = criteria.Trim().ToLower() });

在本地,这将正确地重定向到/find/square/äa,但是在服务器上,它会在/find/square/äa结束。我记录了每一步,当我的字符串被传递给RedirectToAction时,它仍然完好无损(即使是在Trim()ToLower()之后),但是在重定向之后就中断了。我使用的是默认路径

代码语言:javascript
复制
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }

使用控制器find、action square和id äa (在本例中)

这对我来说是相当令人惊讶的,因为当涉及到umlauts和UTF-8时,.NET通常是非常小心和健壮的。我特别迷失在这里,因为我无法在本地复制这个问题。我认为这是一个服务器设置,但是Azure在这一点上是相当稀疏的。以前有没有人有过类似的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 21:14:17

这是我的代码的一部分,我没有发布,重写规则。我是在仔细看看Fiddler的重定向之后才发现的。事实上,在我有意触发的重定向之后,我发现了另一个重定向,它是由我的重写规则之一引起的:

代码语言:javascript
复制
    <rule name="Lowercase Path" stopProcessing="true" >
      <match url="[A-Z]" ignoreCase="false" />
      <conditions>
        <add input="{REQUEST_METHOD}" matchType="Pattern" pattern="POST" ignoreCase="true" negate="true" />
        <add input="{URL}" pattern="^.*\.(axd|css|js|jpg|jpeg|png|gif|txt|xml|svg|pdf)$" negate="true" ignoreCase="true" />
      </conditions>
      <action type="Redirect" url="{tolower:{URL}}" redirectType="Permanent" />
    </rule>

实际上,它是如下一行:

代码语言:javascript
复制
<action type="Redirect" url="{tolower:{URL}}" redirectType="Permanent" />

一旦我禁用了这条规则,一切就都正常了。我的其他不使用{ToLower:}的规则不会产生任何问题。我不知道,为什么这不会破坏当地的东西。在进行我的研究时,我发现了一篇文章,描述了微软是如何修补一个坏掉的重写模块的,这导致了类似的问题。这是猜测,但也许我的天蓝色实例上的重写版本是未修补的,或者是完全不同的。

不幸的是,在{tolower:{URL}}中使用重写规则的替代方法很少,所以我不得不做一个相当糟糕的解决办法,并在Global.asax.cs中检查我的URL,如下所示:

代码语言:javascript
复制
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var pathAndQuery = System.Web.HttpUtility.UrlDecode(Request.Url.PathAndQuery);

        if (pathAndQuery == null || Regex.IsMatch(pathAndQuery, @"^.*\.(axd|css|js|jpg|jpeg|png|gif|txt|xml|svg|pdf)$"))
        {
            return;
        }

        if (Regex.IsMatch(pathAndQuery, ".*[A-Z].*"))
        {
            Response.Redirect(pathAndQuery.ToLower(), false);
            Response.StatusCode = 301;
        }
    }

我对这种方法并不完全满意,它让我感觉很难闻,但在我找到更好的解决方案之前,这已经足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34053931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档