C# 当我从VisualStudio调试时,为什么这可以工作,但是';在我部署到IIS之后,是否会发生错误?
好吧,这真的很令人沮丧,我希望有人能帮我解决这个问题。我刚刚开始学习一些信号器教程,所有这些都很好。然后,我决定添加一个MVC实体框架模型,用于对我的SignalR项目进行一些数据访问,这样我就可以存储已发送到测试聊天消息中心的名称和消息 这里是令人沮丧的部分,当我从Visual Studio在调试中运行时,这一切都很好,但一旦我发布到IIS服务器,消息中心中的实体框架代码就会停止工作并抛出以下错误:ProviderIncompatibleException 内部异常: “{”从数据库获取提供程序信息时出错。这可能是由于实体框架使用了不正确的连接字符串造成的。有关详细信息,请检查内部异常,并确保连接字符串正确。“}” 下一个内部异常: {“提供程序未返回ProviderManifestToken字符串。”} 最后一个内部异常: {“建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到或无法访问该服务器。请验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:SQL网络接口,错误:50-发生本地数据库运行时错误。在LocalDB实例启动期间发生错误:SQL Server进程无法启动。\r\n)“} 此错误在我的消息中心代码中的“db.Database.Initialize(false);”行中抛出 这让我非常沮丧,我昨晚一直在研究这些错误消息,直到凌晨1:00。我真的非常感谢任何帮助。最令人沮丧的是,这段代码非常简单,应该可以正常工作 谢谢 这是我的消息中心的代码: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 内部异常: “{”从数据库获取提供程
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也在服务器上工作,但现在我们面临着这个荒谬的问题!