代码之家  ›  专栏  ›  技术社区  ›  Ogglas

ASP。NET Core Web 3.1-IIS Express可以从localdb获取数据,但本地IIS不能

  •  0
  • Ogglas  · 技术社区  · 5 年前

    如上所述,我有一个非常奇怪的问题。

    运行的代码完全相同,唯一的区别是使用的调试配置文件。我正在使用Microsoft Visual Studio Community 2019版本16.6.3。

    使用IIS配置文件时,代码显示我的数据库中没有媒体。

    enter image description here

    enter image description here

    将配置文件切换到IIS Express,现在我的媒体使用的exakt连接字符串与在即时窗口中看到的相同。

    enter image description here

    enter image description here

    我首先怀疑ASP。NET Core Web 3.1从中获取连接字符串时出现问题 appsettings.json 而且这是我们需要的 web.config 也尝试添加它,但没有产生任何影响。检查 context.Database.GetDbConnection().ConnectionString 这两个配置文件也显示相同的内容,因此情况并非如此。

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Server=(localdb)\\mssqllocaldb;Database=<MYDB>;Trusted_Connection=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    如果我通过SSMS查看数据库,我可以像预期的那样看到我的媒体。

    enter image description here

    IIS应用程序池按以下方式运行: LocalSystem .如果我切换到一个无法访问数据库的用户,如 ApplicationPoolIdentity 我在Windows事件查看器中收到了预期的异常,应用程序无法正确启动。

    微软数据SqlClient。SqlException(0x80131904):与网络相关的 或在与建立连接时发生特定于实例的错误 SQL Server。找不到或无法访问服务器。验证 实例名称正确且SQL Server配置为 允许远程连接。(提供程序:SQL网络接口,错误:50)

    • 发生本地数据库运行时错误。无法创建自动实例。有关错误详细信息,请参阅Windows应用程序事件日志。

    enter image description here

    使用 本地系统 在事件查看器中,一切看起来都很好,但它显示我没有媒体或任何其他数据。

    enter image description here

    使用相同代码的两个相同连接字符串如何显示不同的结果?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Ogglas    5 年前

    已尝试将应用程序池标识切换到我知道可以通过SSMS访问的当前登录用户:

    运行时发生与网络相关或特定于实例的错误 正在建立与SQL Server的连接。找不到服务器,或者 无法访问。验证实例名称是否正确,以及 SQL Server已配置为允许远程连接。(提供者:SQL) LocalDB实例启动期间出错:SQL Server进程 启动失败。)

    有了这个和@nilsK的评论,我就这样修复了它:

    首先,以管理员身份使用Developer PowerShell或Visual Studio的Developer命令提示符,并确认您只有一个LocalDb实例。

    类型 sqllocaldb info 查看您的LocalDb实例。

    enter image description here

    然后我继续阅读本文,并将应用程序池标识设置为我当前登录的用户credit: https://stackoverflow.com/a/38294458/3850405

    https://docs.microsoft.com/en-us/archive/blogs/sqlexpress/using-localdb-with-full-iis-part-1-user-profile

    在那里,我发现光有这些是不够的 Load User Profile 如果将应用程序池设置为true,则还需要设置 setProfileEnvironment 忠于 applicationHost.config 通常位于 C:\Windows\System32\inetsrv\config .通过这种配置,它起到了作用:

    enter image description here

    推荐文章