NETCore 2.1 - Невозможно получить доступ к серверу mssql / SqlExeption: Невозможно открыть базу данных «DbName», запрошенную при входе в систему.Ошибка входа - PullRequest
0 голосов
/ 12 декабря 2018

Я и моя команда работаем над проектом, который представляет собой веб-приложение NETCore 2.1 MVC, в Visual Studio 2017, и у этого проекта есть база данных MSSQL.У меня нет проблем с доступом к этой базе данных, однако мои коллеги получают следующее исключение:

SqlException: Невозможно открыть базу данных "MSSQL_DB", запрошенную при входе в систему.Ошибка входа.Не удалось войти в систему для пользователя 'DESKTOP-machinename \ windowsLogin'.

После изучения проблемы в Интернете я вижу, что в большинстве случаев проблема заключается в том, что ASP.NET не настроен для использования проверки подлинности Windows.Кроме того, я внес следующие изменения, но проблема остается прежней.

Добавлен файл web.config в проект:

 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
    <system.web>
       <authentication mode="Windows"/>
    </system.web>
 </configuration>

Изменил appsettings.json, добавив Integrated Security = False:

 "ConnectionStrings": {    
"DbConnection": "Server=(localdb)\\mssqllocaldb;Database=MSSQL_DB;Integrated Security=False;Trusted_Connection=True;MultipleActiveResultSets=true"

launchsetings.json:

{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
  "applicationUrl": "http://localhost:43064",
  "sslPort": 44395
}
},
"profiles": {
"IIS Express": {
  "commandName": "IISExpress",
  "launchBrowser": true,
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
  },
  "NETCore2IdentityWebApp_v3": {
  "commandName": "Project",
  "launchBrowser": true,
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  },
  "applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

Также стоит упомянуть, что в конце метода Configure есть метод, который проверяет, есть ли какие-либо роли пользователей, добавленные в таблицу ролей, и, если нет, добавляет их.Всякий раз, когда происходит исключение, это происходит в строке, где мы выполняем этот метод.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider servpro)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseDefaultFiles();
    app.UseCookiePolicy();
    app.UseSession();
    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "searchresults",
            template: "searchresults",
            defaults: new { controller = "SearchResults", action = "SearchResults" });

        routes.MapRoute(
            name: "hotel",
            template: "hotel",
            defaults: new { controller = "Hotel", action = "Hotel" });

        routes.MapRoute(
            name: "hotels",
            template: "hotels",
            defaults: new { controller = "Hotels", action = "Hotels" });

        routes.MapRoute(
            name: "contact",
            template: "contact",
            defaults: new { controller = "Contact", action = "Contact" });

        routes.MapRoute(
            name: "booking",
            template: "booking",
            defaults: new { controller = "Booking", action = "Booking" });

        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

    InitRoles.CreateRoles(servpro).Wait(); //Exception happens here
}

И класс InitRoles:

public class InitRoles
{
    public static async Task CreateRoles(IServiceProvider serviceProvider)
    {
        var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
        string[] roleNames = { "Admin", "Standard" };
        IdentityResult roleResult;

        foreach (var roleName in roleNames)
        {
            var roleExist = await RoleManager.RoleExistsAsync(roleName);
            if (!roleExist)
            {
                //create the roles and seed them to the database: Question 1
                roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
            }
        }
    }
}

Дайте мне знать, требуется ли какая-либо другая информация,

1 Ответ

0 голосов
/ 12 декабря 2018

.Wait(); может вызывать взаимоблокировку, которая приводит к тайм-ауту.

Ссылка Асинхронное / ожидание - Рекомендации по асинхронному программированию

Если ничего не зависит непосредственнопосле завершения асинхронного вызова перед его выполнением оставьте его без ожидания.

//...

InitRoles.CreateRoles(servpro);

В качестве альтернативы вы можете сделать асинхронный обработчик событий, где вы можете ожидать вызова и затем вызывать то, что зависит от того, что код завершается первым.

private event EventHandler creatingRoles = delegate { };

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider servpro) {

    //...omitted for brevity

    EventHandler handler = null;

    handler = async (sender, args) => {
        creatingRoles -= handler; //unsubscribe from event

        await InitRoles.CreateRoles(servpro);

        //...code dependent on the above completing

        //...
    };
    creatingRoles += handler; //subscribe to event
    creatingRoles(this, EventArgs.Empty); //raise event
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...