使用 Visual Studio 或 Visual Web 開發人員部署具有SQL Server Compact的 ASP.NET Web 應用程式:疑難排解 (12/12)

By Tom Dykstra

下載入門專案

本系列教學課程說明如何使用 Visual Studio 2012 RC 或 Visual Studio Express 2012 RC for Web,部署 (發佈) ASP.NET 包含 SQL Server Compact 資料庫的 web 應用程式專案。 如果您安裝 Web 發佈更新,您也可以使用 Visual Studio 2010。 如需系列簡介,請參閱 系列的第一個教學課程。

如需示範 Visual Studio 2012 RC 版本之後所引進部署功能的教學課程,示範如何部署 SQL Server SQL Server Compact 以外的版本,並示範如何部署至 Windows Azure 網站,請參閱使用 Visual Studio ASP.NET Web 部署

此頁面描述使用 Visual Studio 部署 ASP.NET Web 應用程式時可能發生的一些常見問題。 針對每個原因,會提供一或多個可能的原因和對應的解決方案。

'/' 應用程式中的伺服器錯誤 - 目前的自訂錯誤設定可防止從遠端檢視錯誤的詳細資料

案例

將月臺部署至遠端主機之後,您會收到錯誤訊息,其中提及 Web.config 檔案中的 customErrors 設定,但不會指出錯誤的實際原因:

Server Error in '/' Application.
Runtime Error 

Description: An application error occurred on the server. The current custom error settings 
for this application prevent the details of the application error from being viewed remotely 
(for security reasons). It could, however, be viewed by browsers running on the local server 
machine. 

Details: To enable the details of this specific error message to be viewable on remote machines,
please create a <customErrors> tag within a "web.config" configuration file located in the
root directory of the current web application. This <customErrors> tag should then have its
"mode" attribute set to "Off".

可能的原因和解決方案

根據預設,只有當 Web 應用程式在本機電腦上執行時,ASP.NET 才會顯示詳細的錯誤資訊。 一般而言,當您的 Web 應用程式可透過網際網路公開使用時,您不想要顯示詳細的錯誤資訊,因為駭客可能會使用這項資訊來尋找應用程式中的弱點。 不過,當您將網站或更新部署至月臺時,有時候會發生錯誤,而您需要取得實際的錯誤訊息。

若要讓應用程式在遠端主機上執行時顯示詳細的錯誤訊息,請編輯Web.config檔案以關閉 customErrors 模式、重新部署應用程式,然後再次執行應用程式:

  1. 如果應用程式Web.config檔案 customErrors 中有 system.web 元素,請將 mode 屬性變更為 「off」。 否則,將 屬性設定為 「off」 的 system.web 元素加入 customErrors 專案中 mode ,如下列範例所示:

    <configuration>
      <system.web>
        <customErrors mode="off"/>
      </system.web>
    </configuration>
    
  2. 部署應用程式。

  3. 執行應用程式,並重複您稍早執行的任何動作,導致發生錯誤。 現在您可以看到實際的錯誤訊息。

  4. 當您解決錯誤時,請還原原始 customErrors 設定並重新部署應用程式。

使用 SQL Server Compact 的網頁拒絕存取

案例

當您部署使用SQL Server Compact的網站,並在存取資料庫的已部署網站中執行頁面時,您會看到下列錯誤訊息:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

可能的原因和解決方案

伺服器上的 NETWORK SERVICE 帳戶必須能夠讀取 bin\amd64bin\x86 資料夾中的 SQL Service Compact 原生二進位檔,但沒有這些資料夾的讀取權限。 在 bin 資料夾上設定 NETWORK SERVICE 的讀取權限,請務必將許可權延伸至子資料夾。

因為許可權不足而無法讀取組態檔

案例

當您按一下 [Visual Studio 發佈] 按鈕將應用程式部署至本機電腦上的 IIS 時,發佈會失敗,而 [ 輸出 ] 視窗會顯示類似下列的錯誤訊息:

An error occurred when reading the IIS Configuration File 'MACHINE/REDIRECTION'. 
The identity performing this operation was ... Error: Cannot read configuration file due to insufficient permissions.

可能的原因和解決方案

若要在本機電腦上使用單鍵發佈至 IIS,您必須以系統管理員許可權執行 Visual Studio。 關閉 Visual Studio,並使用系統管理員許可權重新開機它。

無法連線到目的地電腦...使用指定的進程

案例

當您按一下 [Visual Studio 發佈] 按鈕來部署應用程式時,發佈會失敗,而 [ 輸出] 視窗會顯示類似以下的錯誤訊息:

Web deployment task failed.(Could not connect to the destination computer ("<server URL>") using the specified process
("The Web Management Service"). This can happen if a proxy server is interrupting communication with the destination server. 
Disable the proxy server and try again.) ... The remote server returned an error: (502) Bad Gateway.

可能的原因和解決方案

Proxy 伺服器正在中斷與目的地伺服器的通訊。 從 Windows 控制台或在 Internet Explorer 中,選取 [網際網路選項 ],然後選取 [ 連線 ] 索引標籤。在 [ 網際網路內容] 對話方塊中,按一下 [ LAN 設定]。 在 [ 區域網路 (LAN) 設定 ] 對話方塊中,清除 [ 自動偵測設定 ] 核取方塊。 然後按一下 [發佈] 按鈕。

如果問題持續發生,請連絡您的系統管理員,以判斷 Proxy 或防火牆設定可以做什麼。 發生此問題的原因是 Web Deploy 使用非標準埠進行 Web Management Service 部署, (8172) ;針對其他連線,Web Deploy 會使用埠 80。 當您部署至協力廠商裝載提供者時,通常會使用 Web 管理服務。

預設 .NET 4.0 應用程式集區不存在

案例

當您部署需要 .NET Framework 4 的應用程式時,您會看到下列錯誤訊息:

The default .NET 4.0 application pool does not exist or the application could not be added. 
Please verify that ASP.NET 4.0 is installed on this machine.

可能的原因和解決方案

ASP.NET 4 未安裝在 IIS 中。 如果您要部署的伺服器是開發電腦,且已安裝 Visual Studio 2010,ASP.NET 4 會安裝在電腦上,但可能不會安裝在 IIS 中。 在您要部署的伺服器上,執行下列命令,開啟提升許可權的命令提示字元,並在 IIS 中安裝 ASP.NET 4:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

您可能也需要手動設定預設應用程式集區的.NET Framework版本。 如需詳細資訊,請參閱 部署至 IIS 作為測試環境 教學課程。

初始化字串的格式不符合從索引 0 開始的規格。

案例

使用單鍵發佈部署應用程式之後,當您執行存取資料庫的頁面時,會收到下列錯誤訊息:

Format of the initialization string does not conform to specification starting at index 0.

可能的原因和解決方案

在已部署的月臺中開啟 Web.config 檔案,並檢查連接字串值是否以 $(ReplaceableToken_ 開頭,如下列範例所示:

<connectionStrings>
  <add name="DefaultConnection" connectionString="$(ReplaceableToken_DefaultConnection-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
  <add name="SchoolContext" connectionString="$(ReplaceableToken_SchoolContext-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>

如果連接字串看起來像這個範例,請編輯專案檔,並將下列屬性新增至 PropertyGroup 所有組建組態的專案:

<AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings>

然後重新部署應用程式。

HTTP 500 內部伺服器錯誤

案例

當您執行已部署的月臺時,您會看到下列錯誤訊息,沒有指出錯誤原因的特定資訊:

HTTP Error 500 - Internal Server Error.

可能的原因和解決方案

有許多原因造成 500 個錯誤,但如果您遵循這些教學課程,可能是您在其中一個 XML 轉換檔中將 XML 元素放在錯誤的位置。 例如,如果您將插入元素的轉換放在 底下,而不是直接在 底下 <system.web><configuration><location> 就會發生這個錯誤。 在此情況下,解決方案是更正 XML 轉換檔案並重新部署。

HTTP 500.21 內部伺服器錯誤

案例

當您執行已部署的網站時,您會看到下列錯誤訊息:

HTTP Error 500.21 - Internal Server Error. 
Handler "PageHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list.

可能的原因和解決方案

您已部署的目標 ASP.NET 4,但伺服器上未在 IIS 中註冊 ASP.NET 4。 在伺服器上開啟提升許可權的命令提示字元,並執行下列命令來註冊 ASP.NET 4:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

您可能也需要手動設定預設應用程式集區的.NET Framework版本。 如需詳細資訊,請參閱 部署至 IIS 作為測試環境 教學課程。

登入無法在 App_Data 中開啟 SQL Server Express 資料庫

案例

您已更新Web.config檔案連接字串,以指向 SQL Server Express 資料庫作為App_Data資料夾中的.mdf檔案,第一次執行應用程式時,您會看到下列錯誤訊息:

System.Data.SqlClient.SqlException: Cannot open database "DatabaseName" requested by the login. The login failed.

可能的原因和解決方案

.mdf檔案的名稱無法比對電腦上已存在的任何SQL Server Express資料庫名稱,即使您刪除了先前現有資料庫的.mdf檔案也一樣。 將 .mdf 檔案名變更為從未做為資料庫名稱的名稱,並將 Web.config 檔案變更為使用新名稱。 或者,您可以使用SQL Server Management Studio Express來刪除先前現有的SQL Server Express資料庫。

無法檢查模型相容性

案例

您已更新Web.config檔案連接字串,以指向新的SQL Server Express資料庫,第一次執行應用程式時,您會看到下列錯誤訊息:

Model compatibility cannot be checked because the database does not contain model metadata. 
Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

可能的原因和解決方案

如果您在電腦上之前曾使用您放在Web.config檔案中的資料庫名稱,資料庫可能已經有一些資料表存在。 選取之前尚未在電腦上使用的新名稱,並將 Web.config 檔案變更為指向使用此新的資料庫名稱。 或者,您可以使用SQL Server Management Studio Express來刪除現有的資料庫。

當腳本嘗試建立使用者或角色時發生 SQL 錯誤

案例

您使用在 [ 封裝/發佈 SQL ] 索引標籤上設定的資料庫部署、在部署期間執行的 SQL 腳本包括建立使用者或建立角色命令,並在執行這些命令時腳本執行失敗。 您可能會看到更詳細的訊息,例如:

The approximate location of the error was between lines '1' and '3' of the script. 
The verbose log may have more information about the error. The command started with:
CREATE USER [user2] FOR LOGIN [user2] WITH DEFAULT
Error: User does not have permission to perform this action.

如果您在 [發佈 Web 精靈] 中設定資料庫部署,而不是 [ 封裝/發佈 SQL ] 索引標籤時發生此錯誤,請在組 態和部署 論壇中建立執行緒,並將解決方案新增至此疑難排解頁面。

可能的原因和解決方案

您用來執行部署的使用者帳戶沒有建立使用者或角色的許可權。 例如,主控公司可能會將 、 db_datawriterdb_ddladmin 角色指派 db_datareader 給您為其設定的使用者帳戶。 這些足以建立大部分的資料庫物件,但不適用於建立使用者或角色。 避免錯誤的其中一種方式是排除資料庫部署中的使用者和角色。 您可以編輯 PreSource 資料庫自動產生腳本的 元素,使其包含下列屬性,以執行此動作:

CopyAllUsers=false, CopyAllRoles=false

如需如何編輯 PreSource 專案檔中專案的資訊,請參閱 How to: Edit Deployment Settings in the Project File。 如果您的開發資料庫中的使用者或角色必須位於目的地資料庫中,請連絡您的主控提供者以取得協助。

部署期間執行自訂腳本時發生SQL Server逾時錯誤

案例

您已指定要在部署期間執行的自訂 SQL 腳本,並在 Web Deploy 執行時逾時。

可能的原因和解決方案

執行多個具有不同交易模式的腳本可能會導致逾時錯誤。 根據預設,自動產生的腳本會在交易中執行,但自訂腳本不會執行。 如果您在 [封裝/發佈 SQL] 索引標籤上,從現有的資料庫選項中選取 [提取資料和/或架構],而且如果您新增自訂 SQL 腳本,則必須變更某些腳本上的交易設定,讓所有腳本都使用相同的交易設定。 如需詳細資訊,請參閱 如何:使用 Web 應用程式專案部署資料庫

如果您已設定交易設定,讓所有專案都相同,但仍收到此錯誤,則可能的因應措施是個別執行腳本。 在 [封裝/發行SQL] 索引標籤的 [資料庫腳本] 方格中,清除造成逾時錯誤的腳本的 [包含] 核取方塊,然後發佈專案。 然後回到 [ 資料庫腳本 ] 方格,選取該腳本的 [ 包含 ] 核取方塊,然後清除其他腳本的 [包含 ] 核取方塊。 然後再次發佈專案。 這次當您發佈時,只會執行選取的自訂腳本。

月臺資訊清單的資料流程資料尚無法使用

案例

當您使用 deploy.cmd 檔案搭配 t (測試) 選項來安裝套件時,您會看到下列錯誤訊息:

Error: The stream data of 'sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript' is not yet available.

可能的原因和解決方案

錯誤訊息表示命令無法產生測試報告。 不過,如果您使用 y (實際安裝) 選項,命令可能會執行。 此訊息只會指出在測試模式中執行命令時發生問題。

此應用程式需要 ManagedRuntimeVersion v4.0

案例

當您嘗試部署時,您會看到下列錯誤訊息:

錯誤:尚未提供 'sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript' 的資料流程資料。 您嘗試使用的應用程式集區已將 'managedRuntimeVersion' 屬性設定為 'v2.0'。 此應用程式需要 'v4.0'。

可能的原因和解決方案

ASP.NET 4 未安裝在 IIS 中。 如果您要部署的伺服器是開發電腦,且已安裝 Visual Studio 2010,ASP.NET 4 會安裝在電腦上,但可能不會安裝在 IIS 中。 在您要部署的伺服器上,執行下列命令,開啟提升許可權的命令提示字元,並在 IIS 中安裝 ASP.NET 4:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –i

無法轉換 Microsoft.Web.Deployment.DeploymentProviderOptions

案例

當您部署套件時,您會看到下列錯誤訊息:

Unable to cast object of type 'Microsoft.Web.Deployment.DeploymentProviderOptions' to 'Microsoft.Web.Deployment.DeploymentProviderOptions'.

可能的原因和解決方案

您嘗試使用 Web Deploy 1.1 UI 從 IIS 管理員部署至已安裝 Web Deploy 2.0 的伺服器。 如果您使用 IIS 遠端系統管理工具來部署套件,請在建立連線時勾選 [ 新功能可用 ] 對話方塊。 (此對話方塊可能只會在第一次建立連線時顯示一次。若要清除連線並重新開始,請關閉 IIS 管理員,然後在命令提示字元中輸入 inetmgr /reset 來啟動它。) 如果列出的其中一個功能是 Web Deploy UI,而且其版本號碼低於 8,您部署的伺服器可能同時安裝 1.1 和 2.0 版的 Web Deploy。 若要從已安裝 2.0 的用戶端進行部署,伺服器必須只安裝 Web Deploy 2.0。 您必須連絡您的主機提供者以解決此問題。

無法載入 SQL Server Compact 的原生元件

案例

當您執行已部署的網站時,您會看到下列錯誤訊息:

Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8482. 
Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.

可能的原因和解決方案

已部署的網站沒有 amd64x86 子資料夾,其原生元件位於應用程式的 bin 資料夾下。 在已安裝SQL Server Compact的電腦上,原生元件位於C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private中。 將正確的檔案放入 Visual Studio 專案中正確資料夾的最佳方式是安裝 NuGet SqlServerCompact 套件。 套件安裝會新增建置後腳本,以將原生元件複製到 amd64x86。 不過,若要部署這些專案,您必須手動將它們包含在專案中。 如需詳細資訊,請參閱部署SQL Server Compact教學課程。

部署 Entity Framework Code First 應用程式之後的「路徑無效」錯誤

案例

您可以部署使用 Entity Framework Code First 移轉 和 DBMS 的應用程式,例如SQL Server Compact,它會將其資料庫儲存在 App_Data 資料夾中的檔案中。 您已Code First 移轉設定為在第一次部署之後建立資料庫。 當您執行應用程式時,會收到類似下列範例的錯誤訊息:

The path is not valid. Check the directory for the database. [Path = c:\inetpub\wwwroot\App_Data\DatabaseName.sdf ]

可能的原因和解決方案

Code First 嘗試建立資料庫,但App_Data資料夾不存在。 部署時,您在[App_Data]資料夾中沒有任何檔案,或在 [專案屬性] 視窗的 [封裝/發佈 Web] 索引標籤上選取 [排除App_Data]。 如果資料夾中沒有要複製到伺服器的檔案,部署程式將不會在伺服器上建立資料夾。 如果您已在月臺中設定資料庫,如果您選取 [在發佈設定檔的目的地移除其他檔案],部署程式將會刪除檔案和App_Data資料夾本身。 若要解決此問題,請將預留位置檔案,例如.txt檔案放在 App_Data 資料夾中,請確定您未選取 [ 排除App_Data ],然後重新部署。

「無法使用已與其基礎 RCW 分開的 COM 物件。」

案例

您已成功使用單鍵發佈來部署應用程式,然後開始收到此錯誤:

Web deployment task failed. (Could not complete the request to remote agent URL 'https://serverurl.com/msdeploy.axd?site=sitename'.)
Could not complete the request to remote agent URL 'https://url/msdeploy.axd?site=sitename'.
The request was aborted: The request was canceled.
COM object that has been separated from its underlying RCW cannot be used.

可能的原因和解決方案

關閉和重新開機 Visual Studio 通常是解決此錯誤所需的所有專案。

部署失敗,因為用於發佈的使用者認證沒有 setACL 授權單位

案例

發行失敗,並出現錯誤,指出您沒有許可權設定資料夾許可權, (您使用的使用者帳戶沒有 setACL 授權單位) 。

可能的原因和解決方案

根據預設,Visual Studio 會設定月臺根資料夾的讀取權限,以及App_Data資料夾的寫入權限。 如果您知道網站資料夾的預設許可權正確且不需要設定,您可以將IncludeSetACLProviderOn Destination > False < /IncludeSetACLProviderOnDestination > 新增 <至發行設定檔檔, (以影響單一設定檔) 或 wpp.targets 檔案 (,以影響所有設定檔) 。 如需如何編輯這些檔案的資訊,請參閱 How to: Edit Deployment Settings in Profile (.pubxml) Files

當應用程式嘗試寫入應用程式資料夾時,拒絕存取錯誤

案例

當應用程式嘗試在其中一個應用程式資料夾中建立或編輯檔案時發生錯誤,因為它沒有該資料夾的寫入授權。

可能的原因和解決方案

根據預設,Visual Studio 會設定月臺根資料夾的讀取權限,以及App_Data資料夾的寫入權限。 如果您的應用程式需要子資料夾的寫入權限,您可以設定該資料夾的許可權,如設定 資料夾許可權部署至生產環境 教學課程所示。 如果您的應用程式需要網站根資料夾的寫入權限,您必須將IncludeSetACLProviderOn Destination > False < /IncludeSetACLProviderOnDestination > 新增 <至發行設定檔檔, (以影響單一設定檔) 或 wpp.targets 檔案 (影響所有設定檔) 。 如需如何編輯這些檔案的資訊,請參閱 How to: Edit Deployment Settings in Profile (.pubxml) Files

組態錯誤 - targetFramework 屬性會參考比所安裝版本更新的版本.NET Framework

案例

您已成功發佈以 ASP.NET 4.5 為目標的 Web 專案,但當您執行應用程式 customErrors (時,Web.config檔案中的模式設定為 [關閉],) 您會收到下列錯誤:

The 'targetFramework' attribute in the <compilation> element of the Web.config 
file is used only to target version 4.0 and later of the .NET Framework (for 
example, '<compilation targetFramework="4.0">'). The 'targetFramework' attribute 
currently references a version that is later than the installed version of the 
.NET Framework. Specify a valid target version of the .NET Framework, or install 
the required version of the .NET Framework.

錯誤頁面的 [來源錯誤] 方塊會反白顯示下列Web.config行,因為發生錯誤的原因:

<compilation targetFramework="4.5" />

可能的原因和解決方案

伺服器不支援 ASP.NET 4.5。 請連絡主機提供者,以判斷是否可以新增對 ASP.NET 4.5 的支援。 如果升級伺服器不是選項,您必須改為部署以 ASP.NET 4 或更早版本為目標的 Web 專案。如果您將 ASP.NET 4 或更早的 Web 專案部署到相同的目的地,請選取 [發佈 Web精靈] 的 [設定] 索引標籤上的 [移除目的地的其他檔案] 核取方塊。 如果您未選取 [ 在目的地移除其他檔案],您將會繼續取得 [設定錯誤] 頁面。

專案[屬性] 視窗包含 [目標架構] 下拉式清單,但您無法藉由將它從.NET Framework 4.5變更為.NET Framework 4來解決此問題。 如果您將目標架構變更為舊版架構,專案仍會參考較新版本的元件,且不會執行。 您必須手動變更這些參考,或建立以 .NET Framework 4 或更早版本為目標的新專案。 如需詳細資訊,請參閱.NET Framework網站的目標