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 时。getTechgetOptions 没有工作它产生 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 错误。

无论如何,问题现在已经解决了。

快乐编码:)