Вызов API .NET Core Controller для базы данных SQL Azure работает на локальном хосте, но не в развернутом веб-приложении Azure. - PullRequest
0 голосов
/ 27 января 2019

Резюме:

У меня есть проект .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.

1 Ответ

0 голосов
/ 28 января 2019

Решение:

Очевидно, что есть какая-то проблема с Docker. Поскольку это становилось скорее головной болью, чем помощью, я удалил его из конвейера развертывания и просто следовал инструкциям здесь . Как только я сделал этот метод развертывания, все API работали. Единственным недостатком является необходимость создания нового приложения в Azure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...