ASP.NET Core Routing适用于VS IIS Express,但不适用于IIS 10

我正在开发ASP.NET Core Web API。 在这里我有一种情况,我必须使用多个get函数从SQL Server DB获取数据。 所以,为此,我正在做自定义属性路由。 以下是我的代码

 [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 Get() { return _tech.getAll(); } [Route("getOptions")] public IEnumerable 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}")]在两者中都有效。

任何人都可以帮忙…

最后我解决了这个问题。

问题出在SQL服务器的登录中。 我在我自己的名为aspNetCore的应用程序池中的IIS 10中配置了我的应用程序。 它的配置是

.Net CLR版本: 没有托管代码
托管流水线模式: Integerated
身份: ApplicationPoolIdentity

身份导致问题。

当我调用此URL http:// localhost:51889 / api / me / gettech时 ,IIS尝试使用IIS Apppool / aspNetCore的登录ID登录SQL Server。 然后最终出现以下错误

用户’IIS APPPOOL \ AspNetCore’登录失败。 原因:找不到与提供的名称匹配的登录信息。 [客户:]

我在事件日志中捕获了上述问题,事件ID为:18456

为此,我必须为此身份创建本地用户和组。 不幸的是我无法做到这一点,因为我使用的是Windows 10家庭版。 这不允许我这样做。

我所做的是为我的应用程序池(aspNetCore)创建自定义标识。

在此处输入图像描述

在此处输入图像描述

在那里,我提供了用户名,已在我的用户组以及SQL Server中找到的帐户的密码。 我给了我的数据库这个帐户的dbowner权限。

在此处输入图像描述

但我仍然不知道为什么它返回404错误。

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

快乐编码:)

对于web api,使用带有路由模板的Http{Verb}属性,用于控制器操作,如文档中所述

小费:
在构建REST API时,很少需要在action方法上使用[Route(...)] 。 最好使用更具体的[Http Verb属性]来准确了解您的API支持的内容。 REST API的客户端需要知道哪些路径和HTTP谓词映射到特定的逻辑操作。

例如…

 [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 Get() { return _tech.getAll(); } //GET api/me/options [HttpGet("options")] public IEnumerable getOptions() { return _page.getOptions(); } //GET api/me/5 [HttpGet("{id:int}")] public int Get(int id) { return id; } }