ASP.NET Core 1.1 Web API无法在Web应用程序

时间:2017-06-02 15:29:16

标签: asp.net-mvc api asp.net-web-api asp.net-mvc-routing

我使用Visual Studio 2017社区创建了一个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,有人建议使用AREA for API,这很好。所以我为所有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 alone)作为默认值,所以我不明白为什么GetSitemap和GetSiteName匹配。

如果我删除GetSiteName API方法,则不会发生不明确的异常,但我会看到一个包含GetSitemap结果的页面,因为默认操作是Get而不是GetSitemap。

1 个答案:

答案 0 :(得分:0)

方法名称与api路由无关。您当前有两个位于同一路由上的呼叫,这是默认的控制器路由:

localhost:1234/api/Test/

您可以通过将HttpGet代码编辑为以下内容来定义方法路线:

[HttpGet("GetSitemap")]
public IActionResult GetSitemap()
{
    ...
}

[HttpGet("GetSiteName")]
public IActionResult GetSiteName()
{
    ...
}