#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»