在 ASP.NET MVC 加掛 Web Site Project 子網站
1 |
同事回報網站部署到測試主機 IIS 遇到詭異錯誤:
Server Error in '/MyApp' Application.
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: The CodeDom provider type "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" could not be located.
Source Error:
Line 93: <system.codedom>
Line 94: <compilers>
Line 95: <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
Line 96: <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
Line 97: </compilers>
進行了解,發現狀況有點複雜:本次部署的網站應用程式為 Web Site Project,在 IIS 掛成子網站,而根站台是 ASP.NET MVC。登楞,MVC 下的子網站是 Web Site Project?這種罕見組合應不在微軟研發團隊原本設想的情境裡,爬文也找不到什麼相似案例,卻是古蹟維護工作人員的日常。
由訊息研判,是 MVC web.config 裡的部分設定繼承到 Web Site Project 子網站,而古老 WSP 的編譯機制認不得來屬於未來的 ASP.NET MVC 設定,無法相容造成錯誤,切斷繼承關係應可解決問題。
使用古老的 inheritInChildApplication 技巧將 <system.codedom> 包起來並指定 inheritInChildApplications="false":
<location path="." inheritInChildApplications="false">
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
</location>
原本錯誤消失,再冒出新錯誤,這回則是抱怨找不到 System.Web.Helpers:
Server Error in '/MyApp' Application.
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS0234: The type or namespace name 'Helpers' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)
Source Error:
Line 32: <pages>
Line 33: <namespaces>
Line 34: <add namespace="System.Web.Helpers" />
Line 35: <add namespace="System.Web.Mvc" />
Line 36: <add namespace="System.Web.Mvc.Ajax" />
再使出 inheritInChildApplications 大法將整個 <system.codedom> 也包起來:
<location path="." inheritInChildApplications="false" >
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1" />
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
</system.web>
</location>
幸運地,做完以上修正,問題排除。以上經驗與古蹟維護同業們分享。
Experience of making web site project running as sub web application under a ASP.NET MVC root web application in IIS.
Comments
# by kb
厉害