为什么我在从Visual Studio调试时工作但在部署到IIS后却没有?

时间:2013-11-27 17:58:01

标签: c# asp.net-mvc signalr signalr-hub signalr.client

好的,这真的令人沮丧,我希望有人可以帮助我。我刚刚开始学习一些SignalR教程,所有这些都很有效。然后我决定添加一个MVC实体框架模型,以便对我的SignalR项目进行一些数据访问,这样我就可以存储已经发送到我的测试聊天消息中心的名称和消息。

这是令人沮丧的部分,当我从Visual Studio运行调试时,这一切都很有效但是当我发布到我的IIS服务器时,我的消息中心中的实体框架代码停止工作并抛出此错误:ProviderIncompatibleException

内部例外: “{”从数据库获取提供程序信息时发生错误。这可能是由实体框架使用不正确的连接字符串引起的。检查内部异常以获取详细信息,并确保连接字符串正确。“}”

下一个内部例外: {“提供程序未返回ProviderManifestToken字符串。”}

最后一次内部异常: {“与SQL Server建立连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。验证实例名称是否正确以及SQL Server是否配置为允许远程连接。 :SQL网络接口,错误:50 - 发生本地数据库运行时错误。在LocalDB实例启动期间发生错误:SQL Server进程无法启动。\ r \ n)“}

“db.Database.Initialize(false);”上抛出此错误我的消息中心代码中的行。

这让我非常沮丧,以至于我昨晚一直在研究这些错误消息,直到凌晨1点。我真的很感激任何帮助。而最令人沮丧的是这段代码非常简单,应该只是工作......

感谢。

以下是我的消息中心的代码:

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 个答案:

答案 0 :(得分:7)

默认情况下,IIS不支持LocalDB。您可以使用一些变通方法来使其工作(请参阅herehere(第二部分)),但它仍未涵盖所有情况。

期望您使用LocalDB进行本地开发(它针对开发人员工作流而非生产进行了优化),并在部署到IIS时拥有完整的SQL Server(或SQL Server Express)实例。发布项目时,您可以使用web.config转换修改适合您的发布目标的连接字符串。

答案 1 :(得分:0)

根据Jimmy的推荐,我在我的Release web.config中更改了连接字符串:

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

再次感谢。