.NET Core 2.0 MVC нечетное 404 для методов контроллера только при развертывании в IIS - PullRequest
0 голосов
/ 09 мая 2018

Мой домашний контроллер успешно вернул index.html из

http://localhost/ и

http://localhost/controller/

но если я попытаюсь нажать

http://localhost/controller/method/

Я получаю 404, хотя этот метод отлично работает в IIS Express.

Не удалось найти что-либо в Интернете, если у кого-то возникла похожая проблема, когда только методы на контроллере не работали в одном конкретном развертывании, но сам контроллер в порядке.

Вещи, которые я пробовал, которые были распространены среди многих проблем .Net Core 2.0 с IIS Deployments:

  • Убедитесь, что проверка подлинности Windows включена в настройках проекта и в IIS (я включал и выключал ее безрезультатно, так как у меня нет аутентификации пользователя в моем веб-приложении, поэтому я не думаю, что это имеет значение для меня).

  • Переключен мой пул приложений для использования No managed code для CLR версии

  • Измените идентификатор пула приложений на LocalSystem

  • Измените разрешения для моей выходной папки публикации, чтобы включить %hostname%\IIS_IUSRS

Уверен, я также пробовал много других базовых проблем, которые иногда решают проблемы. И.Е. удаление и чтение приложения. Включение и выключение снова безрезультатно.

Любые предложения по устранению неполадок приветствуются.

Я также хочу заметить, что он работал вчера и не могу вспомнить, чтобы что-то изменилось, кроме выходных данных публикации, чтобы использовать 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?}");
});

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Поскольку вы получаете ошибку 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 на опубликованную папку

0 голосов
/ 04 апреля 2019

У меня была похожая проблема с получением 404 при попытке получить доступ к контроллеру учетной записи моего сайта. Все остальные страницы Razor работают правильно. Если я изменю значение атрибута attributeitInChildApplications = "false" на true в файле web.config, контроллер начнет работать.

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

0 голосов
/ 10 мая 2018

Если вы не уверены, почему это не работает, попробуйте маршрутизацию атрибутов, объясненную в Документах . Тогда вы можете попробовать это следующим образом:

[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
    }
}
...