Почему это работает при отладке из 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" />

2 ответа

Решение

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

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

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

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

Еще раз спасибо.

Другие вопросы по тегам