【发布时间】: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