【发布时间】:2017-06-02 15:29:15
【问题描述】:
我使用 Visual Studio 2017 Community 创建了一个 ASP.NET CORE Web 应用程序。在它上面我有常用的控制器(管理、主页、帐户)以及我自己的一些。
我的 API TestController 到目前为止只有两个方法:
[HttpGet]
public IActionResult GetSitemap()
{
Request.Headers.Clear();
Request.Headers.Add("Accept", "text/xml");
System.Xml.Linq.XDocument gsmXML = GoogleSitemap.AutoSeek(Domain);
return new ContentResult()
{
StatusCode = 200,
ContentType = "application/xml",
Content = gsmXML.ToString()
};
}
[HttpGet]
public IActionResult GetSiteName()
{
return new OkObjectResult( "Test API");
}
现在,我还想在我的 Web 应用程序中添加一个 Web API,有人建议对 API 使用 AREA,这很好。所以我为所有 API 控制器创建了一个名为 API 的区域。
~/Areas/
API/
Controllers/
TestController.cs
_ViewImports.cshtml
_ViewStart.cshtml
我在 Startup.cs 中的路由定义如下所示:
app.UseMvc(routes =>
routes.MapRoute(
name: "areaRoute",
template: "{area:exists}/{controller=Dashboard}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
问题是当我向我的 API 方法发出请求时,我得到一个空页面:
localhost:1234/api/Test/GetSitemap
我看到断点不会在 GetSitemap API 方法上触发。 但是当我将请求更改为:
localhost:1234/api/Test/
然后我得到一个异常,说一些关于歧义的事情,因为两个方法匹配。它们都以 Get 开头,但路由指定 Get (和 Get 单独)作为默认值,所以我不明白为什么 GetSitemap 和 GetSiteName 匹配。
如果我删除 GetSiteName API 方法,则不会发生模棱两可的异常,但会显示一个带有 GetSitemap 结果的页面,这是错误的,因为默认操作是 Get 而不是 GetSitemap。
【问题讨论】:
标签: asp.net-mvc api asp.net-web-api asp.net-mvc-routing