Развернуть ASP.NET Основной проект Docker — выдает ошибку 405 (локально в моем IIS, веб-запросы работают). Как это исправить?

#c# #docker #asp.net-core #heroku

#c# #.net #docker #asp.net-core #heroku

Вопрос:

Я использую .net core 3.1. С помощью docker я загрузил свой код в heroku. но когда я делаю веб-запрос, я получаю ошибку 405 со всеми моими конечными точками. (Я не могу увидеть более подробную информацию об ошибке)

используя Get :

 http://xxxx.herokuapp.com/api/pqrs/test/1315315
  

из Visual Studio code, а также локально из моего IIS все работает нормально. но проблема возникает при развертывании на моем сервере.

Что я делаю не так? это код моего контроллера:

     using System;
    using System.Collections.Generic;
    using System.IdentityModel.Tokens.Jwt;
    using System.Linq;
    using System.Security.Claims;
    using System.Text;
    using System.Threading.Tasks;
    using apiPQR.Contexts;
    using apiPQR.Entities;
    using apiPQR.Models;
    using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using Microsoft.IdentityModel.Tokens;
    namespace apiPQR.Controllers
    {
        [ApiController]
        [Route("api/[controller]")]
        public class Pqrs : Controller

        {
            private readonly AppDbContext context;
            private readonly IConfiguration configuration;
            public Pqrs(AppDbContext context, IConfiguration configuration)
            {
                this.context = context;
                this.configuration = configuration;
            }
            [HttpGet, Route("test/{id}")]
            public PQRS Get(int id)
            {
                var num_pqrs = context.PQRS.FirstOrDefault(p => p.num_solicitud==id);
                return num_pqrs;
            }
        }

    }
  

Обновить:

это мой Dockerfile

 #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

WORKDIR /app

EXPOSE 80

EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build

WORKDIR /src

COPY ["apiPQR.csproj", ""]

RUN dotnet restore "./apiPQR.csproj"

COPY . .

WORKDIR "/src/."

RUN dotnet build "apiPQR.csproj" -c Release -o /app/build

FROM build AS publish

RUN dotnet publish "apiPQR.csproj" -c Release -o /app/publish

FROM base AS final

WORKDIR /app

COPY --from=publish /app/publish .

ENTRYPOINT ["dotnet", "apiPQR.dll"]
  

Я никогда не видел проблем с CORS или чего-то подобного. просто 405 ошибка.

Комментарии:

1. Каковы ваши данные конфигурации docker?

2. @Matt в heroku, где я могу это увидеть?

3. @yavg — Я могу дать вам только общие советы по C # и ASP.NET-Core, я никогда не работал с heroku. Но поскольку вы являетесь клиентом, почему бы вам не обратиться в их службу поддержки? Они должны вам помочь.

4. Обновил мой ответ, пожалуйста, проверьте, помогает ли это.

Ответ №1:

Код ошибки 405 означает «Метод не разрешен». Запрос блокируется сервером.

Прежде всего, я бы проанализировал, действительно ли проблема на стороне хостинга (heroku) или в вашей конфигурации docker.

Тот факт, что ваше приложение запускается в IIS на вашем локальном компьютере, является важным предварительным условием, но не означает, что оно также будет запускаться в docker. Итак, я бы продолжил работу с вашим файлом docker: прежде чем вы развернете его на своем хостере (heroku), запустите образ docker локально.

Один из способов — включить его в Visual Studio для вашего проекта, другой способ — использовать командную строку:

 docker container run --name [container_name] [docker_image]
  

Как только он будет запущен, проверьте сопоставление портов через

 docker ps
  

Затем попробуйте получить к нему доступ через
http://localhost:<add your port>/<add your path here>

или, если вы используете SSL / TLS
https://localhost:<add your port>/<add your path here>

Если вы обнаружите, что получаете 405, вы можете продолжить:

Проверьте конфигурацию вашего веб-сервера внутри контейнера docker, допускает ли он требуемые HTTP-глаголы (GET, PUT, POST, DELETE)? Они требуются в RESTful API. В вашем примере вы просто используете GET — поэтому проверьте это.

Также проверьте, отсутствуют ли какие-либо CORS настройки. Это также может блокировать запросы.

Также стоит прочитать документы Microsoft о контейнерных приложениях, чтобы понять, как Visual Studio создает контейнер для вашего приложения. Убедитесь, что вы прочитали раздел о включенном SSL ASP.NET Основные приложения, описывающие настройки для Kestrel (веб-сервер, который вы используете в ASP.NET Основной мир).

Если вы обнаружили, что ваш docker работает нормально локально, продолжайте на стороне хостинга:

Существуют ли какие-либо настройки брандмауэра, блокирующие ваши запросы? Проверьте правила брандмауэра вашего хостера «heroku» тоже. Если вы используете SSL / TLS, то вам необходимо предоставить сертификат — как описано в ссылке выше.

Цитируется по ссылке выше:

«ASP.NET Core ищет сертификат, соответствующий имени сборки в папке Https, поэтому он сопоставлен с контейнером по этому пути.
Путь к сертификату и пароль могут быть альтернативно определены с помощью переменных среды (то есть ASPNETCORE_Kestrel__Certificates__Default__Path и ASPNETCORE_Kestrel__Certificates__Default__Password)
или в файле user secrets json»