【问题标题】:Why does this work when I debug from Visual Studio but doesn't after I deploy to IIS?为什么这在我从 Visual Studio 调试时有效,但在部署到 IIS 后无效?
【发布时间】:2013-11-29 06:09:13
【问题描述】:

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

这是令人沮丧的部分,当我在 Visual Studio 中进行调试时,这一切都很好,但是一旦我发布到我的 IIS 服务器,我的消息中心中的实体框架代码就会停止工作并抛出这个错误: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" />

【问题讨论】:

  • 你的数据库有适当的权限吗?如果我记得的话,IIS 将 IUSR_MachineName 用于 ASP.NET 应用程序
  • 尝试在您正在使用的 IIS 应用程序池中启用 32 位应用程序。右键单击池 -> 高级设置 -> 启用 32 位应用程序。
  • @musical_coder - 我已经在应用程序池中设置了允许 32 位。
  • @SystemDown - 我的应用程序池和应用程序分配给一个特定用户,该用户可以完全控制应在其中创建 mdf 的文件夹。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的回答,我马上去测试一下。
  • 这是正确答案!以前不是这种情况。 LocalDb 也在服务器上工作,但现在我们正面临这个荒谬的问题!
【解决方案2】:

根据 Jimmy 的建议,我将 Release web.config 中的连接字符串更改为:

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

再次感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2020-08-09
    • 2015-04-13
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多