2018-02-04

如何設定 IIS 存取 LocalDB (.MDF) 及並解決 Error 50

繼之前筆記 IIS 存取 LocalDB (.MDF) 時出現 Error 52 解決在 IIS 中直接存取 LocalDB (.MDF) 時出現 Error 52 後接著馬上又遇到 Error 50 的狀況,還好這個錯誤之前就遇到,大概知道原因跟處理方式,就來看看該如何解決吧


錯誤訊息

  1. 訊息內容
    • 英文
      Server Error in '/' Application.
      A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. Cannot create an automatic instance. See the Windows Application event log for error details.
      )
      Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
      
      Exception Details: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. Cannot create an automatic instance. See the Windows Application event log for error details.
      )
      
      Source Error: 
      
      An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
      
      Stack Trace: 
      
      
      [SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. Cannot create an automatic instance. See the Windows Application event log for error details.
      )]
      
    • 中文
      '/' 應用程式中發生伺服器錯誤。
      建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime 發生錯誤。 無法建立自動執行個體。如需錯誤詳細資料,請參閱 Windows 應用程式事件記錄檔。
      )
      描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。 
      
      例外狀況詳細資訊: System.Data.SqlClient.SqlException: 建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime 發生錯誤。 無法建立自動執行個體。如需錯誤詳細資料,請參閱 Windows 應用程式事件記錄檔。
      )
      
      原始程式錯誤: 
      
      在執行目前 Web 要求期間,產生未處理的例外狀況。如需有關例外狀況來源與位置的資訊,可以使用下列的例外狀況堆疊追蹤取得。
      
      堆疊追蹤: 
      
      
      [SqlException (0x80131904): 建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime 發生錯誤。 無法建立自動執行個體。如需錯誤詳細資料,請參閱 Windows 應用程式事件記錄檔。
      )]
      
  2. 錯誤截圖
    • 英文

      1error50en

    • 中文

      2error50zh

解決方式:調整 applicationHost.config 設定

這是從 IIS 7 開始加入的 config 設定,包含所有 site、應用程序、虛擬目錄、application pool 的定義跟 web server global 設定

  • IIS

    system32\inetsrv\config 資料夾下,紀錄 iis site 相關設定

  • IIS express
    • VS 2013 含以前

      位於 %userprofile%\documents\iisexpress\config\ 或是 %userprofile%\my documents\iisexpress\config\ 資料夾下

    • VS 2013 開始

      位於專案 .vs\config 資料夾下

  1. 開啟 applicationHost.config

    C:\Windows\System32\inetsrv\config\

    • 找到 configuration --> system.applicationHost --> applicationPools --> 使用的 AppPool 名稱
  2. processModel tag 中設定 loadUserProfile="true"setProfileEnvironment="true"

    <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
    
  3. 完整範例

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.applicationHost>
            <applicationPools>
                <add name="DefaultAppPool" />
                <add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
                <add name=".NET v4.5" managedRuntimeVersion="v4.0" />
                <add name="TestTimeZone">
           <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
       </add>
                <applicationPoolDefaults managedRuntimeVersion="v4.0">
                    <processModel identityType="ApplicationPoolIdentity" />
                </applicationPoolDefaults>
            </applicationPools>
        </system.applicationHost>
    </configuration>
    

心得

我自己在 Windows Server 2016 與 IIS 10.0 上的使用經驗只需要調整 applicationHost.config 即可,不需要為 LocalDB (.MDF 及 .LDF) 設定執行權限,也不需重啟 IIS 就立即生效

但有看到前輩在 Q & A : LocalDB IIS 權限問題 提到需要為 LocalDB 加上 AppPool 的執行權限並重啟 IIS 才會套用設定,或許在設定 applicationHost.config 後仍無法使用時,可以嘗試看看

參考資訊

  1. IIS 存取 LocalDB (.MDF) 時出現 Error 52
  2. Using LocalDB with Full IIS, Part 1: User Profile
  3. Q & A : LocalDB IIS 權限問題

沒有留言:

張貼留言