Неправильный запрос Azure ASP.NET Core POST 400 Blazor Webassembly

Я пытался развернуть приложение веб-сборки Blazor, размещенное на ядре asp.net, в Службе приложений Azure, однако у меня возникают проблемы с работой API. Когда я пытаюсь сохранить данные пользователя в базе данных, я получаю ошибку 400 неверного запроса. Он отлично работает на локальном хосте. Я осмотрелся и нашел совет, в котором предлагалось использовать поток журнала в Azure, чтобы получить более подробное сообщение об ошибке, и вот оно, хотя я не уверен, что подробности действительно помогают.

2020-06-22 22:24:54 MYPROJECT POST /api/Register/Post X-ARR-LOG-ID=ef27263e-dead-417a-b136-89a217a6f931 443 - MYIP Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/83.0.4103.97+Safari/537.36 ARRAffinity=7f74b113b9ae575a087ae1fa07a63858e6e34f27224b7aa1a957b06074e65ffd https://myproject.azurewebsites.net/Register

Вот соответствующий код приложения:

//Register.razor in client project
@code {
    private RegisterModel Model = new RegisterModel();
    private bool ShowErrors;

    private List<string> Errors = new List<string>();
    private async Task HandleValidSubmit()
    {
        ShowErrors = false;
        Errors.Clear();
        if (Model.Password.Length >= 6 && Model.Password == Model.ConfirmPassword)
        {
            await HttpClient.PostAsJsonAsync<RegisterModel>("api/Register/Post", Model);
            NavigationManager.NavigateTo("/");
        }
        else 
        {
            if (Model.Password.Length > 100 || Model.Password.Length < 6)
            {
                Errors.Add("Password must be between 6 and 100 characters in length.");
            }
            if (Model.Password != Model.ConfirmPassword)
            {
                Errors.Add("Passwords do not match.");
            }
            ShowErrors = true;
        }
    }
}

//RegisterController.cs in server project
[Route("api/Register")]
    public class RegisterController : Controller
    {
        private UserContext UserContext { get; set; }
        private IHasher Hasher = new Pbkdf2Hasher();
        public RegisterController (UserContext userContext)
        {
            UserContext = userContext;
        }

        [RequireHttps]
        [HttpPost]
        [Route("Post")]
        public async Task Post([FromBody]RegisterModel model)
        {
            var user = new UserModel
            {
                Email = model.Email,
                Password = Hasher.Hash(model.Password)
            };
            await UserContext.AddAsync(user);
            await UserContext.SaveChangesAsync();
        }
    }

//Startup.cs in Server project
            public void ConfigureServices(IServiceCollection services)
                services.AddDbContext<UserContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("UsersConnection"),
                    sqlServerOptionsAction: sqlOptions =>
                    {
                        sqlOptions.EnableRetryOnFailure();
                    }));

При публикации проекта я настроил базу данных SQL Azure для «пользователей», установил флажки для использования строки UsersConnection во время выполнения и применил миграцию UserContext Entity Framework при публикации.

Я использую Visual Studio 2019, целевая платформа - netcoreapp3.1. Буду признателен за любое руководство. Спасибо!

Изменить

Посмотрев подробные журналы, очевидно, что база данных даже не создается?

INSERT INTO [Users] ([Email], [Password])
VALUES (@p0, @p1);
2020-06-22 22:19:47.208 +00:00 [Error] Microsoft.EntityFrameworkCore.Update: An exception occurred in the database while saving changes for context type 'BlazorTodos.Server.Data.UserContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
 ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Users'.

person amdorsey12    schedule 22.06.2020    source источник
comment
Согласно вашему описанию, поскольку вы обычно работаете локально, в настоящее время существует проблема с развертыванием в веб-приложении Azure. Мои предложения:   -  person Jason Pan    schedule 23.06.2020
comment
1. Убедитесь, что соединение с базой данных нормальное, есть много способов проверить, например, после открытия домашней страницы вставить фрагмент данных во временно созданную таблицу в базе данных.   -  person Jason Pan    schedule 23.06.2020
comment
2. Убедитесь, что каждое поле и атрибут таблицы User в базе данных согласованы с локальной базой данных. Запустите его снова локально и попробуйте зарегистрировать информацию о зарегистрированном пользователе как локально, так и на развернутом веб-сайте. Обратите внимание на согласованность информации о зарегистрированном пользователе.   -  person Jason Pan    schedule 23.06.2020
comment
3. После двух вышеупомянутых предложений проблема все еще не решена. Рекомендуется отладить точку останова и установить для опубликованного файла Debug mode вместо Publish. За подробностями обращайтесь к официальной документации.   -  person Jason Pan    schedule 23.06.2020
comment
Я не совсем понимаю ваш пункт №1. Однако я хочу кое-что прояснить, и, возможно, это будет актуально. Во-первых, когда я разрабатывал приложение локально, я использовал Sqlite, а не SQL-сервер. Так что мой RegisterController с этим точным кодом отлично справился с этим.   -  person amdorsey12    schedule 24.06.2020
comment
В общем, я пытался следовать этот учебник, и когда я дошел до шага, на котором я должен был удалить свои старые миграции, установить строку подключения для производственной базы данных и запустить миграции (под меткой create production База данных SQL) - не удалось выполнить шаг миграции. Другими словами, мне никогда не удавалось запустить приложение локально при подключении к производственной базе данных.   -  person amdorsey12    schedule 24.06.2020
comment
У меня создалось впечатление, что, поскольку в настройках моей базы данных в настройках публикации были отмечены соединения, отмечены миграции инфраструктуры сущностей и успешно созданы сценарии миграции, производственное приложение будет работать.   -  person amdorsey12    schedule 24.06.2020
comment
Вы можете запросить журнал на портале о X-ARR-LOG-ID. stackoverflow.com/questions/34858334/azure-http-log-explained < / а>   -  person Jason Pan    schedule 24.06.2020
comment
Все мои предложения просто хотят, чтобы вы убедились, что нет проблем с базой данных и подключением. Если можете, отлаживайте удаленно и выберите Debug не Release при публикации приложения.   -  person Jason Pan    schedule 24.06.2020
comment
Спасибо, я нашел подробные журналы ошибок, и очевидно, что база данных фактически не создается во время выполнения. См. Мою правку в вопросе.   -  person amdorsey12    schedule 24.06.2020
comment
Если возможно, отладьте его с помощью новой тестовой базы данных в лазурном цвете. При запуске , вы можете найти более подробную информацию , ошибка должна быть в пользовательском контексте.   -  person Jason Pan    schedule 24.06.2020


Ответы (1)


Спасибо за все предложения, Джейсон. Помог мне направиться в правильное русло.

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

Data Source=tcp:myserver.database.windows.net,1433;Initial Catalog=todos;User Id=<myid>@myserver;Password=<my-password>

Но я не заметил, что это была та же струна. Мне просто пришлось изменить Initial Catalog на users и повторно проверить использование этой строки подключения во время выполнения и снова применить эту миграцию к полям публикации с отредактированной строкой. Это решило проблему.

person amdorsey12    schedule 25.06.2020