【问题标题】:Why does URL Routing break when I use parameters?为什么我使用参数时 URL 路由会中断?
【发布时间】:2017-05-17 15:25:04
【问题描述】:

我开发了一个 ASP MVC 5 网站,路径如下:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{language}",
        defaults: new
        {
            controller = "Member",
            action = "Index",
            language = UrlParameter.Optional
        });
}

我只有一个控制器,成员,并且一切都在我的本地开发机器上的 IISExpress 上运行。但是当我尝试在我的开发服务器上部署和访问该站点时,我收到 404 错误。我传递给它的 URL 与我在开发机器上使用的 URL 相同,但路由似乎没有按预期工作。这是一个示例网址:

http://myserver:8080/Member/GetCertificate/en-US?mn=MjMzOTA3MDc4MDA=&gn=NjcwNzkz

这是在我的应用程序上注册的唯一路由,我尝试在 IIS 上注册通配符脚本,并使用以下条目编辑我的 Web 配置:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="UrlRoutingModule-4.0"/>
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition=""/>
    </modules>
  </system.webServer>

开发服务器正在运行 IIS 7.5。我试图从我的开发机器以及从 Web 服务器本地访问该页面,但没有成功。下面是 action 方法的样子供参考:

    [HttpGet]
    public FileResult GetCertificate(string language, string mn, string gn)
    {
        var member = new Member()
        {
            MemberNumber = Encoding.Default.GetString(
                Convert.FromBase64String(mn)),
            GroupNumber = Encoding.Default.GetString(
                Convert.FromBase64String(gn)),
            Language = language
        };

        var certificate = this.certificateRepository
            .GetCertificateDocument(member);

        return this.File(certificate, "application/pdf");
    }

我继续调试,发现问题似乎是它把action识别为控制器,所以如果我使用下面的URL,它可以工作:

http://myserver:8080/Member/Member/GetCertificate/en-US?mn=MjMzODU1NjE5MDE=&gn=NzkxMjgz

但我最终会重复控制器名称,这会导致 URL 不那么可读。不过,有什么办法吗?也许我错过了什么?

【问题讨论】:

  • 开发站点是否有公共 URL?您正在运行什么版本的 IIS?这只是在黑暗中拍摄stackoverflow.com/questions/8010911/…
  • 你的动作是什么样的?看起来在&符号之前的查询字符串中有一个额外的等号。
  • 我已经添加了该操作的代码,并且我相信 Web 服务器正在运行 IIS 7.5。该站点没有注册主机名,但我使用服务器名称或 IP 地址从网络内访问它。等号是参数的一部分,当我向我的开发机器发出请求时不会引起任何问题。
  • = 是根据 RFC3986 保留的字符。您应该对其进行 URL 编码。
  • 这可能与操作返回 FileResult 的事实有关吗?如果我将所有参数更改为查询字符串,它会给我一个关于无法找到索引或视图的错误。但错误似乎是作为控制器读取操作,寻找 /GetCertificate/Index,它当然找不到...

标签: c# asp.net asp.net-mvc


【解决方案1】:

问题是我在 IIS 中的应用程序与我的控制器存在名称冲突。我的 IIS 中的结构如下:

  • 会员网站
    • 会员
    • 会员服务

我的 MVC 应用程序中的控制器也称为 MemberController。这引起了混乱,因为我以为我是在引用控制器,而实​​际上我是在引用应用程序本身。所以为了可读性,我将 IIS 中的应用程序重命名为 MemberApp,最终的 URL 如下所示:

http://myserver:8080/MemberApp/Member/GetCertificate/en-US?mn=MjMzODU1NjE5MDE=&gn=NzkxMjgz

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2017-08-19
    • 2014-01-22
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多