Резюме:
У меня есть проект .NET Core, который использует шаблон веб-приложения React для внешнего интерфейса.Это приложение использует Entity Framework Core для подключения к базе данных SQL Azure.Я использовал команду Db-Scaffold для генерации своих моделей (на данный момент только одну таблицу) и создал контроллер для возврата этой таблицы.Локально это работает нормально, и таблица (JSON) возвращается в localhost / api / Users.Однако при развертывании веб-сайта в Azure (конвейер компакт-диска - VS 2017 -> GitHub -> DockerHub -> Azure Web App), переход к mysite.azurewebsites.net / api / Users просто отображает страницу входа (Реагировать) моего приложения.
Попытки:
Я пытался:
Добавление строки подключения в качестве общего значения в Azure (с именем DefaultConnection)
Добавление всех исходящих IP-адресов веб-приложения Azure в белый список SQL Azure
Выполнение следующего в консолях веб-приложения
fetch('api/users')
Это просто возвращает:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Я также попытался изменить значения базы данных и обновить локальную версию, чтобы убедиться, что это не просто кэшированная страница иконечно, изменения были отражены локально.
Я также установил ASPNETCORE_ENVIRONMENT в настройках веб-приложения в Azure на производство.Хотя, когда я захожу на страницу сообщения об ошибке (через консоль), я получаю это:
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<p>
<strong>Request ID:</strong> <code>0HLK3RLI8HD9Q:00000001</code>
</p>
<h3>Development Mode</h3>
<p>
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
Код
UsersController.cs
[Route("api/[controller]")]
public class UsersController : Controller
{
private readonly AccrubalanceDbContext _context;
public UsersController(AccrubalanceDbContext context)
{
_context = context;
}
// GET: api/values
[HttpGet]
public async Task<IEnumerable<Users>> Get()
{
return await _context.Users.ToListAsync();
}
appsettings.json
{
"ConnectionStrings": {
"DefaultConnection":<MyConnectionStringGoesHere>
},
index.js (на случай, если React может быть проблемой маршрутизации)
const baseUrl = document.getElementsByTagName('base')
[0].getAttribute('href');
const rootElement = document.getElementById('root');
ReactDOM.render(
<BrowserRouter basename={baseUrl}>
<App />
</BrowserRouter>,
rootElement);
registerServiceWorker();
Startup.cs (может быть проблема с маршрутизацией HTTP в Prod?)
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/build";
});
services.AddDbContext<AccrubalanceDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseReactDevelopmentServer(npmScript: "start");
}
});
}
Заключение
В заключение мне нужен этот APIзвоните для работы в размещенном веб-приложении Azure, как на моем локальном компьютере.Я знаю, что я близок, так как я заставил его работать на месте, но мне чего-то не хватает по пути в Azure.Любая помощь или указатели, которые вы можете предоставить, были бы хороши:)
Я все еще новичок в SO и не торопился, чтобы приложить все усилия, чтобы правильно отформатировать это.Я открыт для конструктивной критики форматирования и предложений, которые помогут мне улучшить.
Редактировать:
Как я упоминал ранее, я использую докер для CD / CI.Поэтому я запустил свой док-контейнер локально, и API там тоже не работает.Docker выдает это предупреждение в командном окне, когда я перехожу на домашнюю страницу приложений.
warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
Failed to determine the https port for redirect.
Редактировать 1 Определение
Я также нашел эту статью , котораяуказывает на реакцию маршрутизации, являющейся проблемой.Я посмотрел в Kudo в своем приложении Azure, и у меня нет web.config.Потенциально можно попробовать добавить, но у меня нет обычного пользовательского интерфейса Windows, так как мое приложение представляет собой сервер Linux.
Сборка контейнера работает так же, как приложение Azure, может и не быть проблемой Azure.До сих пор не уверены, почему Docker работает иначе, чем работает в VS.