Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我从VisualStudio调试时,为什么这可以工作,但是';在我部署到IIS之后,是否会发生错误?_C#_Asp.net Mvc_Signalr_Signalr Hub_Signalr.client - Fatal编程技术网

C# 当我从VisualStudio调试时,为什么这可以工作,但是';在我部署到IIS之后,是否会发生错误?

C# 当我从VisualStudio调试时,为什么这可以工作,但是';在我部署到IIS之后,是否会发生错误?,c#,asp.net-mvc,signalr,signalr-hub,signalr.client,C#,Asp.net Mvc,Signalr,Signalr Hub,Signalr.client,好吧,这真的很令人沮丧,我希望有人能帮我解决这个问题。我刚刚开始学习一些信号器教程,所有这些都很好。然后,我决定添加一个MVC实体框架模型,用于对我的SignalR项目进行一些数据访问,这样我就可以存储已发送到测试聊天消息中心的名称和消息 这里是令人沮丧的部分,当我从Visual Studio在调试中运行时,这一切都很好,但一旦我发布到IIS服务器,消息中心中的实体框架代码就会停止工作并抛出以下错误:ProviderIncompatibleException 内部异常: “{”从数据库获取提供程

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

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

内部异常: “{”从数据库获取提供程序信息时出错。这可能是由于实体框架使用了不正确的连接字符串造成的。有关详细信息,请检查内部异常,并确保连接字符串正确。“}”

下一个内部异常: {“提供程序未返回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; }
}
<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" />
公共类BPACustomerServiceMessageHub:Hub
{
公共无效发送(字符串名称、字符串消息)
{
SetInitializer(新的CreateDatabaseIfNotExists());
使用(MessagesContext db=newmessagescontext())
{
db.Database.Initialize(false);
消息omsg=新消息();
omsg.name=名称;
omsg.message=消息;
db.Messages.Add(omsg);
db.SaveChanges();
db.Dispose();
}
//调用broadcastMessage方法来更新客户端。
Clients.All.broadcastMessage(名称、消息);
sendparamps mparams=新的SendParams();
mparams.Name=名称;
mparams.Message=消息;
Clients.All.broadcastMessage2(mparams);
}
}
公共类SendParams
{
公共字符串名称{get;set;}
公共字符串消息{get;set;}
}
以下是我的模型和上下文的代码:

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; }
}
<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" />
公共类消息
{
[关键]
公共int id{get;set;}
公共字符串名称{get;set;}
公共字符串消息{get;set;}
}
公共类消息上下文:DbContext
{
公共数据库集消息{get;set;}
}
这是我的web.config中的连接字符串:

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; }
}
<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不支持LocalDB。您可以使用一些变通方法(请参见和(第二部分)),但它仍然不能涵盖所有情况


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

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

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


再次感谢。

您的DB是否具有适当的权限?如果我重新调用您正在使用的IIS应用程序池中的32位应用程序,则IIS会将IUSR\u MachineName用于ASP.NET应用程序。右键单击池->高级设置->启用32位应用程序。@music\u coder-我已经在应用程序池中设置了允许32位。@SystemDown-我的应用程序pool和应用程序被分配给一个特定的用户,该用户对创建mdf的文件夹拥有完全控制权。感谢您的回答,我将很快对此进行测试。这是正确的答案!以前不是这样。LocalDb也在服务器上工作,但现在我们面临着这个荒谬的问题!