使用参数时为什么URL路由会中断?

时间:2017-05-17 15:25:05

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

我已经开发了一个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服务器本地访问该页面,没有运气。以下是动作方法的参考内容:

    [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");
    }

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

  

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

但我最终重复了控制器名称,这使得URL不那么易读。不管怎么说呢?也许我错过了什么?

1 个答案:

答案 0 :(得分:0)

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

  • MemberSite
    • 会员
    • MemberService

我的MVC应用程序中的控制器也称为MemberController。这引起了混乱,因为当我实际引用应用程序本身时,我以为我正在引用控制器。因此,为了便于阅读,我将IIS中的应用程序重命名为MemberApp,最终的URL如下所示:

  

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