ASP.NET 核心路由在 VS IIS Express 中有效,但在 IIS 10 中无效
ASP.NET Core Routing works in VS IIS Express but not in IIS 10
我正在开发 ASP.NET 核心网络 API。在这里,我遇到的情况是我必须使用多个 get
函数从 SQL 服务器数据库获取数据。因此,为此,我正在做自定义属性路由。以下是我的代码
[Route("api/[controller]")]
public class MeController : Controller
{
private readonly ITechRepository _tech;
private readonly IPageOptions _page;
public MeController(ITechRepository tech,IPageOptions page)
{
_tech = tech;
_page = page;
}
[Route("getTech")]
public IEnumerable<TechStack> Get()
{
return _tech.getAll();
}
[Route("getOptions")]
public IEnumerable<PageControl> getOptions()
{
return _page.getOptions();
}
//GET api/values/5
[HttpGet("{id}")]
public int Get(int id)
{
return id;
}
}
以上路由在 VS IIS Express 中运行良好,这是 URL
http://localhost:51889/api/me/gettech
但是当我在 IIS 10 中发布这个 API 时。getTech
和 getOptions
没有工作它产生 404
错误并且 [HttpGet("{id}")]
是在两者中工作。
任何人都可以帮忙...
对于 web api 使用 Http{Verb}
属性和控制器操作的路由模板,如 documentation
中所述
Tip:
When building a REST API, it's rare that you will want to use
[Route(...)]
on an action method. It's better to use the more specific
[HttpVerbAttributes] to be precise about what your API supports.
Clients of REST APIs are expected to know what paths and HTTP verbs
map to specific logical operations.
例如...
[Route("api/[controller]")]
public class MeController : Controller {
private readonly ITechRepository _tech;
private readonly IPageOptions _page;
public MeController(ITechRepository tech,IPageOptions page) {
_tech = tech;
_page = page;
}
//GET api/me/tech
[HttpGet("tech")]
public IEnumerable<TechStack> Get() {
return _tech.getAll();
}
//GET api/me/options
[HttpGet("options")]
public IEnumerable<PageControl> getOptions() {
return _page.getOptions();
}
//GET api/me/5
[HttpGet("{id:int}")]
public int Get(int id) {
return id;
}
}
我终于解决了这个问题。
问题出在 SQL 服务器的登录上。我在我自己的名为 aspNetCore 的应用程序池中的 IIS 10 中配置了我的应用程序。它的配置是
.Net CLR version : No managed code
Managed pipelined mode : Integerated
Identity : ApplicationPoolIdentity
身份问题。
当我调用此 URL http://localhost:51889/api/me/gettech 时,IIS 尝试使用 IIS Apppool / aspNetCore[=47= 的登录 ID 登录到 SQL 服务器].然后以以下错误结束
Login failed for user 'IIS APPPOOL\AspNetCore'. Reason: Could not find
a login matching the name provided. [CLIENT: ]
我在事件日志中捕获了上述问题,事件 ID 为:18456
为此,我必须为此身份创建本地用户和组。不幸的是,我不能这样做,因为我使用的是 Windows 10 家庭版。这不允许我这样做。
我所做的是为我的应用程序池 (aspNetCore) 创建自定义标识。
在那里我给了用户名,已经在我的用户组中找到的帐户密码以及 SQL 服务器。我为我的数据库授予了此帐户的 dbowner
权限。
但我仍然不知道为什么返回 404 错误。
无论如何,问题现在已经解决了。
快乐编码:)
我正在开发 ASP.NET 核心网络 API。在这里,我遇到的情况是我必须使用多个 get
函数从 SQL 服务器数据库获取数据。因此,为此,我正在做自定义属性路由。以下是我的代码
[Route("api/[controller]")]
public class MeController : Controller
{
private readonly ITechRepository _tech;
private readonly IPageOptions _page;
public MeController(ITechRepository tech,IPageOptions page)
{
_tech = tech;
_page = page;
}
[Route("getTech")]
public IEnumerable<TechStack> Get()
{
return _tech.getAll();
}
[Route("getOptions")]
public IEnumerable<PageControl> getOptions()
{
return _page.getOptions();
}
//GET api/values/5
[HttpGet("{id}")]
public int Get(int id)
{
return id;
}
}
以上路由在 VS IIS Express 中运行良好,这是 URL
http://localhost:51889/api/me/gettech
但是当我在 IIS 10 中发布这个 API 时。getTech
和 getOptions
没有工作它产生 404
错误并且 [HttpGet("{id}")]
是在两者中工作。
任何人都可以帮忙...
对于 web api 使用 Http{Verb}
属性和控制器操作的路由模板,如 documentation
Tip:
When building a REST API, it's rare that you will want to use[Route(...)]
on an action method. It's better to use the more specific [HttpVerbAttributes] to be precise about what your API supports. Clients of REST APIs are expected to know what paths and HTTP verbs map to specific logical operations.
例如...
[Route("api/[controller]")]
public class MeController : Controller {
private readonly ITechRepository _tech;
private readonly IPageOptions _page;
public MeController(ITechRepository tech,IPageOptions page) {
_tech = tech;
_page = page;
}
//GET api/me/tech
[HttpGet("tech")]
public IEnumerable<TechStack> Get() {
return _tech.getAll();
}
//GET api/me/options
[HttpGet("options")]
public IEnumerable<PageControl> getOptions() {
return _page.getOptions();
}
//GET api/me/5
[HttpGet("{id:int}")]
public int Get(int id) {
return id;
}
}
我终于解决了这个问题。
问题出在 SQL 服务器的登录上。我在我自己的名为 aspNetCore 的应用程序池中的 IIS 10 中配置了我的应用程序。它的配置是
.Net CLR version : No managed code
Managed pipelined mode : Integerated
Identity : ApplicationPoolIdentity
身份问题。
当我调用此 URL http://localhost:51889/api/me/gettech 时,IIS 尝试使用 IIS Apppool / aspNetCore[=47= 的登录 ID 登录到 SQL 服务器].然后以以下错误结束
Login failed for user 'IIS APPPOOL\AspNetCore'. Reason: Could not find a login matching the name provided. [CLIENT: ]
我在事件日志中捕获了上述问题,事件 ID 为:18456
为此,我必须为此身份创建本地用户和组。不幸的是,我不能这样做,因为我使用的是 Windows 10 家庭版。这不允许我这样做。
我所做的是为我的应用程序池 (aspNetCore) 创建自定义标识。
在那里我给了用户名,已经在我的用户组中找到的帐户密码以及 SQL 服务器。我为我的数据库授予了此帐户的 dbowner
权限。
但我仍然不知道为什么返回 404 错误。
无论如何,问题现在已经解决了。
快乐编码:)