【问题标题】:.NET Core 2.0 MVC odd 404 on controller methods only when deployed to IIS.NET Core 2.0 MVC 仅在部署到 IIS 时控制器方法上的奇数 404
【发布时间】:2018-10-20 01:12:10
【问题描述】:

我的家庭控制器成功从

返回index.html

http://localhost/

http://localhost/controller/

但如果我尝试击中

http://localhost/controller/method/

我得到一个404,即使该方法在 IIS express 中运行良好。

在网上找不到任何有类似问题的人的任何东西,只有控制器上的方法在一个特定的部署中不起作用,但控制器本身很好。

在 .Net Core 2.0 的许多 IIS 部署问题中,我尝试过的常见问题:

  • 确保在项目设置和 IIS 中启用了 Windows 身份验证(我已将其打开和关闭都无济于事我的 Web 应用程序上没有用户身份验证,所以我不这么认为对我来说很重要)。

  • 已将我的应用程序池切换为使用 No managed code 以获取 CLR 版本

  • 将应用程序池 ID 更改为 LocalSystem

  • 更改我的发布输出文件夹的权限以包含 %hostname%\IIS_IUSRS

可以肯定,我还尝试了许多其他基本故障排除方法,有时可以解决问题。 IE。删除和阅读应用程序。再次打开和关闭东西无济于事。

非常欢迎任何有关如何解决此问题的建议。

我还想指出它昨天还在工作,除了发布输出之外不记得更改任何内容以使用 Debug 而不是 Release,当然现在我已经改回 Release 但仍然不走运。

这是一些代码

public class MyController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public void Store([FromBody]MyObject obj)
    {
        Console.WriteLine(Request.Body);
        //Some code
    }

    [HttpGet]
    public void Check(string objectUID, string idfv)
    {
        Console.WriteLine($"ObjectUID: {objectUID}");
        Console.WriteLine($"IDFV: {idfv}");
        //some other code
    }

    [HttpGet]
    public MyObject Retrieve(string objectUID)
    {
        Console.Writeline($"ObjectUID: {objectUID}");
        //Some Code
    }
}

这是我的路线。

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

【问题讨论】:

  • 你能显示一些代码吗?控制器方法和路由属性?
  • @Nikolaus 我添加了一些代码,您可以看到它非常基本的控制器类。我是 .net 和 MVC 和 Web 开发的新手,我的理解是我不需要 Route-Attributes,因为 MVC 将创建端点作为方法的名称。无论如何,它都以这种方式在 IIS Express 中工作。您是否建议我执行 Route-Attribution 以查看是否可以解决问题?不知道为什么会在 IIS express 中工作
  • 在 Program.cs WebHost.CreateDefaultBuilder(args) 添加 IISIntegration 支持。此外,在 Startup.cs 文件中,app.UseMvc();自动设置默认路由 {controller}/{action} 所以不需要基于自定义属性的路由
  • @MohsinMehmood:不,app.UseMvc() 不会为你设置默认路由。 app.UseMvcWithDefaultRoute() 确实如此。
  • 您是否解决了您的问题,如果没有,您能否添加您的请求?

标签: c# iis asp.net-core asp.net-core-2.0 iis-express


【解决方案1】:

如果您不确定它为什么不起作用,请尝试属性路由,在 Docs 中进行了解释 那你可以这样试试:

[Route("[controller]/[action]")]
public class MyController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public void Store([FromBody]MyObject obj)
    {
        Console.WriteLine(Request.Body);
        //Some code
    }
    // If you have a parameter from the uri or query-string, you can add it to the Template this way
    [HttpGet("{objectUID} ")]
    public void Check(string objectUID, string idfv)
    {
        Console.WriteLine($"ObjectUID: {objectUID}");
        Console.WriteLine($"IDFV: {idfv}");
        //some other code
    }
    // Or optional parameter like this 
    [HttpGet ("{objectUID?} ")]
    public MyObject Retrieve(string objectUID)
    {
        Console.Writeline($"ObjectUID: {objectUID}");
        //Some Code
    }
}

【讨论】:

  • 我可能会在今晚的某个时候尝试一下,明天再回复您
【解决方案2】:

由于您收到 404 错误,我怀疑您的网站缺少 aspnet 核心处理程序。假设您安装了 .NET Core Hosting Bundle, 确保您在 web.config 文件中添加了以下处理程序。如果缺少 web.config 文件,请添加新的 web.config。此外,在网站根文件夹中添加一个日志文件夹以进行日志记录。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <!-- To customize the asp.net core module uncomment and edit the following section. 
  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->

  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>


</configuration>

我按照以下步骤在我的机器上运行了 ASP.NET Core 2 应用程序:

  1. 在 AppPoolIdentity 下运行的应用程序池设置没有托管运行时配置

  2. 将 ASP.NET Core 2 网站发布到文件夹。默认发布到 bin\Release\PublishOutput

  3. 将您的 IIS 网站指向已发布的文件夹

【讨论】:

  • 为了快速响应,我已经做到了。在此之前我什至无法使用我的家庭控制器,在此更改之前我会收到 500.19。
  • 我更新了我的答案,并按照答案中提到的步骤让 ASP.NET Core 应用程序在我的开发中运行
【解决方案3】:

我在尝试访问我网站的帐户控制器时遇到了类似的问题,即 404。正常工作的所有其他 Razor 页面。如果我在 web.config 中将 inheritInChildApplications="false" 更改为 true,则控制器开始工作。

<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="true"> ... </configuration>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多