【问题标题】:ASP.NET Core MVC Web API deployment issuesASP.NET Core MVC Web API 部署问题
【发布时间】:2020-11-13 01:13:37
【问题描述】:

我正在尝试使用 Web API 部署我的 ASP.NET Core MVC Web 应用程序,即我在同一个文件夹中同时拥有 MVC 和 API 控制器。

它在 localhost 上运行良好,但在 IIS 上,当我创建虚拟目录时,路径被添加到域中。

我可以使用window.location.pathname找到它

我可以附加“api/Get”,它的工作方式类似于(questions 是我的虚拟目录)

http://example.com/questions/api/Question/GetAll

但是当我导航到其他页面时,控制器名称也会被附加,然后它会导致问题。

例如如果我导航到“问题”页面 (QuestionController),则 URL 变为

http://example.com/questions/newquestion/api/Question/Create 

而不是

http://example.com/questions/api/Question/Create

我该如何解决?

这是我的 Asp.Net 核心 api。

    [ApiController]
    public class ScheduleController : ControllerBase
    {    
        [HttpGet]
        public List<PathologistSchedule> GetPathologistScheduleByDate(DateTime taskDate)
        {
            return pathologistRepository.GetPathologistScheduleByDate(taskDate).ToList();
        }
    }

我使用 jquery 从 PathologistScheduleController 的视图中调用此 api。

这是我得到的错误:

GET http://localhost:51434/PathologistSchedule/api/Schedule/?sort=&group=&filter=&taskDate=2020-11-13T21%3A16%3A47.507Z 404(未找到)

TIA。

一个

【问题讨论】:

  • 您的问题出在window.location.pathname。显示您的客户端代码。

标签: c# asp.net-mvc asp.net-core asp.net-web-api


【解决方案1】:

如果您在一个解决方案中有 API 和 MVC 项目,则必须配置您的解决方案以运行多个项目。

您可以为每个 API 使用这样的路由属性

[Route("~/api/Question/GetAll")]

会给你网址http://example.com/api/Question/GetAll

或者

[Route("~/api/Question/Create")] 

会给Urlhttp://example.com/api/Question/Create

而且它不会依赖于控制器名称或文件夹。

由于问题更新而更新: 请使用此代码:


    public class ScheduleController : ControllerBase
    {    
        [Route("~/api/Schedule/GetPathologistScheduleByDate/{taskDate?}")]
        public List<PathologistSchedule> GetPathologistScheduleByDate(DateTime taskDate)
        {
            return pathologistRepository.GetPathologistScheduleByDate(taskDate).ToList();
        }
    }

为了测试,请在浏览器中尝试这条路线:

http://localhost:51434/api/Schedule/GetPathologistScheduleByDate/2020-11-13T21%3A16%3A47.507Z

但基本上对于 API,您不需要使用任何控制器或操作名称。您可以使用任何您喜欢的名称,例如:

 [Route("~/api/Pathologist/GetSchedule/{taskDate?}")]
or 
 [Route("~/api/GetPathologistSchedule/{taskDate?}")]
or even 
 [Route("~/api/{taskDate?}")]

路线应该是唯一的。

【讨论】:

  • 它不起作用,我添加了这样的路由:[Route("~/api/[controller]")]。我修改了我的问题以添加一些代码示例。请检查。
  • 我不确定使用:[Route("~/api/[controller]")] 是否是个好主意。只是为了测试,请尝试隐式使用 [Route("~/api/Question/GetAll")] 进行 GetALL 操作等。并且不要在控制器顶部放置任何默认路由
  • 我刚刚看到你的新代码,它与我的建议完全不同。如果您不听取建议,它将更新工作。
  • 它的代码代码。我会尝试你的建议并让你知道。谢谢。
  • 我尝试了你的方法,但我在本地仍然得到 404。
【解决方案2】:

我在“appsettings.json”和“appsettings.Development.json”中添加了一个名为 baseURL 的变量,并将“appsettings.json”设置为“/VirtualDirectoryName/”并将其保留在“appsettings.Development.json”中作为 '/'。 调用 API 时附加此变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2019-11-05
    • 2012-03-23
    相关资源
    最近更新 更多