Почему это работает, когда я отлаживаю из Visual Studio, но не работает после развертывания в IIS?

Хорошо, это действительно расстраивает, и я надеюсь, что кто-то может мне с этим помочь. Я только что начал изучать несколько руководств по SignalR, и все они отлично работали. Затем я решил добавить модель MVC Entity Framework для доступа к некоторым данным в мой проект SignalR, чтобы я мог хранить имя и сообщения, которые были отправлены в мой тестовый центр сообщений чата.

Вот неприятная часть, все это отлично работает, когда я запускаю отладку из Visual Studio, но как только я публикую на своем сервере IIS, код Entity Framework в моем концентраторе сообщений перестает работать и выдает эту ошибку: ProviderIncompatibleException

Внутреннее исключение: "{" Произошла ошибка при получении информации о провайдере из базы данных. Это может быть вызвано тем, что Entity Framework использует неверную строку подключения. Для получения подробной информации проверьте внутренние исключения и убедитесь, что строка подключения верна. "}"

Следующее внутреннее исключение: {"Поставщик не вернул строку ProviderManifestToken."}

Последнее внутреннее исключение: {"при установке соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или недоступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (Поставщик: Сетевые интерфейсы SQL, ошибка: 50 - Произошла ошибка времени выполнения локальной базы данных. Ошибка произошла во время запуска экземпляра LocalDB: не удалось запустить процесс SQL Server. \ R \ n) "}

Эта ошибка возникает в "db.Database.Initialize (false);" в моем коде концентратора сообщений.

Это меня так расстроило, что я изучал эти сообщения об ошибках вчера вечером до 1:00. Я был бы очень признателен за ЛЮБУЮ помощь в этом. И больше всего расстраивает то, что этот код настолько прост, что должен просто работать ...

Спасибо.

Вот код для моего концентратора сообщений:

public class BPACustomerServiceMessageHub : Hub
{

    public void Send(string name, string message)
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<MessagesContext>());
        using (MessagesContext db = new MessagesContext())
        {
            db.Database.Initialize(false);
            Messages omsg = new Messages();
            omsg.name = name;
            omsg.message = message;
            db.Messages.Add(omsg);
            db.SaveChanges();
            db.Dispose();
        }


        // Call the broadcastMessage method to update clients.
        Clients.All.broadcastMessage(name, message);
        SendParams mparams = new SendParams();
        mparams.Name = name;
        mparams.Message = message;
        Clients.All.broadcastMessage2(mparams);
    }
}

public class SendParams
{
    public string Name { get; set; }
    public string Message { get; set; }

}

Вот код моей модели и контекста:

public class Messages
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string message { get; set; }
}
public class MessagesContext : DbContext
{
    public DbSet<Messages> Messages { get; set; }
}

Вот моя строка подключения из моего файла web.config:

<connectionStrings>
<add name="MessagesContext" 
     connectionString="Data Source=(LocalDB)\v11.0;
                       database=Messages;
                       AttachDbFilename=|DataDirectory|\Messages.mdf;
                       Initial Catalog=Messages;
                       Integrated Security=True" 
     providerName="System.Data.SqlClient" />


person JosephN    schedule 27.11.2013    source источник
comment
Есть ли у вас в БД соответствующие разрешения? IIS использует IUSR_MachineName для приложений ASP.NET, если я помню   -  person System Down    schedule 27.11.2013
comment
Попробуйте включить 32-разрядные приложения в пуле приложений IIS, который вы используете. Щелкните пул правой кнопкой мыши - ›Дополнительные настройки -› Включить 32-разрядные приложения.   -  person musical_coder    schedule 27.11.2013
comment
@musical_coder - Я уже установил Разрешить 32 бита в пуле приложений.   -  person JosephN    schedule 27.11.2013
comment
@SystemDown - Мой пул приложений и приложение назначаются конкретному пользователю, который имеет полный контроль над папкой, в которой должен быть создан mdf.   -  person JosephN    schedule 27.11.2013


Ответы (2)


По умолчанию LocalDB не поддерживается IIS. Есть несколько обходных путей, которые вы можете использовать, чтобы заставить его работать (см. здесь и здесь (часть II)), но он по-прежнему не охватывает все случаи.

Ожидается, что вы используете LocalDB для локальной разработки (он оптимизирован для рабочего процесса разработчика, а не для производства) и у вас будет полный экземпляр SQL Server (или SQL Server Express) при развертывании в IIS. При публикации проекта вы можете использовать преобразование web.config для изменения строки подключения в соответствии с местом назначения публикации.

person Jimmy    schedule 27.11.2013
comment
Спасибо за ответ, скоро попробую. - person JosephN; 27.11.2013
comment
Это правильный ответ! Раньше этого не было. LocalDb также работал над серверами, но теперь мы столкнулись с этой нелепой проблемой! - person sapatelbaps; 27.02.2019

По рекомендации Джимми я изменил строку подключения в файле Release web.config следующим образом:

<connectionStrings>
<add name="MessagesContext" 
     connectionString="Data Source=.\SQLEXPRESS;
                       database=Messages;
                       Initial Catalog=Messages;
                       Integrated Security=True" 
     providerName="System.Data.SqlClient" />

Thanks again.

person JosephN    schedule 28.11.2013