【问题标题】:ASP.NET Core Action works from VS, but not from browserASP.NET Core Action 适用于 VS,但不适用于浏览器
【发布时间】:2019-01-02 19:25:35
【问题描述】:

我正在家里的个人服务器上构建一个应用程序(“Airport Finder”或 URL 的“af”)。当我从 VS 运行应用程序时,它运行良好。但是,当我通过浏览器运行它时,它不会。

控制器有两个动作。第一个提供最初显示时用于构建主页的数据。这个动作效果很好。它被称为剃刀视图的一部分,当您第一次访问该站点时,该视图会返回主页。

但是,第二个操作返回 404(未找到)。在用户在网站上选择各种标准后通过 AJAX 调用它。同样,如果您在从 Visual Studio (2017) 中运行网站后进行搜索,这个也可以正常工作。如果我直接从浏览器运行该站点,它会返回 404(尽管第一个操作可以很好地返回所有初始数据)。

我已经在 IIS 中安装了应用程序(部署到一个文件夹并在指向该文件夹的默认网站下创建了一个应用程序)。

网址如下所示:

http://localhost/af

但当我收到错误时,搜索 URL 看起来像这样:

http://localhost/Home/Search

我认为它应该是这样的:

http://localhost/af/Home/Search

但是,手动将其输入浏览器只会返回另一个 404(未找到)。

这是控制器代码:

    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View(Logic.GetGeneralAirportData());
        }

        [HttpPost]
        public JsonResult Search(SearchCriteria sc)
        {
            SearchResults results = Logic.Search(sc);
            return Json(results);
        }
    }

这是 AJAX 调用:

        $.ajax({
            method: "post",
            url: "/Home/Search",
            dataType: "json",
            data: {
...

路线如下:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

【问题讨论】:

  • 如果你打电话给localhost/af/Home/Search会发生什么?
  • @Robert 404。我将在上面添加该信息。谢谢。
  • 你传递的数据是否与传入的对象匹配?
  • 你的 MVC 路由是什么样的?
  • 你说是通过浏览器运行的,你是怎么运行的?您是否在命令提示符下启动它? IIS?

标签: ajax asp.net-core


【解决方案1】:

不确定这是否能解决问题。但我个人喜欢为 AJAX 调用使用不同的控制器。如果是我,我会有一个单独的 api 控制器文件夹,这样你就有了

ApiControllers
- HomeApiController

控制器
- 家庭控制器

然后我在 home 控制器中进行的任何 ajax 调用都会调用 home api 控制器,看起来像这样。

[Route("api/Home")]
[ApiController]
public class HomeApiController : ControllerBase
{
  // PRIVATE VARIABLES

    public HomeApiController(// DEPENDENCIES)
    {
        // ASSIGN DEPENDENCIES TO PRIVATE VARIABLES
    }

    [HttpPost("Search")]
    public string Search(SearchCriteria sc)
    {
        SearchResults results = Logic.Search(sc);
        return Json(results);
    }  
  }

那么路径就是基本 url + /api/home/search

【讨论】:

  • 如果我这样做(我认为这是个好主意),我会在通过浏览器运行时收到 403(禁止访问)。但是,我将路线放在行动级别而不是班级级别。错误肯定在新路线上:localhost/api/home/search。也许这是朝着正确方向迈出的一步。通过 VS 运行时,代码确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多