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