c# - Azure 上的 AspNetIdentity 登录失败 - 初始化字符串的格式不符合从索引 0 开始的规范
问题描述
免责声明:即使以前在很多主题中都提出过这个错误,我也没有找到我的问题的答案;请在标记为重复之前随时回答它,因为它不是重复的:-)
我在 ASP.NET MVC5 数据库的第一个项目中使用Identity Framework 。
我最近对我的解决方案进行了很多更改,包括在表格中添加一列AspNetUsers
。我已经这样做了十几次,一切正常。
当我使用 localhost 中的所有新更改测试我的解决方案时,一切正常,包括 login。
然后,我在 Azure 上托管的 PreProd 环境中发布了我的代码和数据库更改(作为记录)
新的更改没问题,但是,当我尝试登录我的项目时,它失败了,并且我的日志中有以下错误:
初始化字符串的格式不符合从索引 0 开始的规范。
问题发生在Login
HttpPost 方法中,仅在调用时UserManager
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
try
{
//Just to proove I can access to my DB
var businessLayer = new businessLayer();
var dataFromDB = businessLayer.GetDataFromMyDB();
logger.Info(dataFromDB ); //dataFromDB is the expected value from my DB
logger.Info("Will call UserManager");
var user = await UserManager.FindByEmailAsync(model.Email.Trim()); // <- Fails here in PreProd only
logger.Info(I never go here (in PreProd only)");
}
catch(Exception ex)
{
//Fails here in PreProd only with above error message
logger.Error(ex, ex.Message);
}
}
在 localhost 中一切都很好,在 preprod(托管在 Azure 中)中,它在调用时失败UserManager.FindByEmailAsync
这是我在本地主机中的 ConnectionString
<add name="MyEntities" connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=MY-PC\SQLEXPRESS;initial catalog=MyDBName3;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
这是我用于 Azure Preprod 的 ConnectionString
<add name="MyEntities" connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string="Server=tcp:xxxazure.database.windows.net,1433;Initial Catalog=MyDbName;Persist Security Info=False;User ID=MyUserID;Password=MyPassword;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;App=EntityFramework"" providerName="System.Data.EntityClient" />
当我在发布模式下使用 VisualStudio 中的 PreProd 连接字符串时,完全没有问题,我可以登录(?!?!) 所以看起来问题出在 PreProd 环境本身,不是吗?
到目前为止我已经尝试过:
- 直接在我的 FTP 中复制/粘贴 web.config 中的连接字符串
- 尝试更改
"
by'
- 尝试删除连接字符串中的所有内容,除了必需的元素(用户 ID、密码..)
- 谷歌我的问题,点击第一页上的每个链接,但仍然有我的问题
- 随机更改
Integrated Security
连接字符串中的其他布尔值 - 在我的椅子上转 7 次,同时低声念咒语
谁能告诉我:
- 为什么它在 Azure 上托管时仅在 PreProd 中失败
- 我该如何纠正它?
太感谢了
解决方案
只需尝试几件事:
如果您的代码中有如下连接字符串
<add name="Entities" connectionString="metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX"" providerName="System.Data.EntityClient" />
在应用程序设置中的 azure 门户中添加此内容:
Name Column => Entities
Value Column => metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX"
"Custom" - In the drop selection box
请确保将 azure 门户中的“更改为”。
要将“普通”连接字符串转换为 EF 接受的连接字符串:
1) 应用程序设置中的连接字符串类型必须是“其他”而不是“SQL Azure”
2) 连接字符串值自动替换 web.config 中发布的任何内容
尝试这些选项,看看它是否有效。
推荐阅读
- guidewire - 如何使用 Guidewire 中的反射控制 PCF 的可见性
- android - 自定义 ConstraintLayout 属性
- swift - SwiftUI 中的 NSItemProvider loadObject 拖放
- flutter - Flutter web,图标呈现错误的图标
- excel - 使用正在复制到电子邮件的 VBA 格式化表格
- html - 为什么在 django 中尝试使用 for 循环进行迭代时 html 会消失
- python - Python Parse tree IndexError:字符串索引超出范围
- c# - C# 到 VB 转换后表单加载事件未触发
- java - 更改名称模式后未生成 Log4j2 日志文件
- java - 将 JPublisher 与 jdk8 一起使用