被一個茶包困擾了好幾天,總算豁然開朗,也才搞清楚長久以來被我忽略的一項Web Site Project細節。

參與的專案在Web Site Project中呼叫了另一個WCF Project,由於WCF Method傳回的結果型別為另一個Class Library專案中的類別(假設為BooData),而Web Site Project並沒有參照該Class Library。依ASP.NET引用WCF服務的原理,在參照WCF服務時,應會在Web Site Project另行定義BooData類別,用以承接WCF Method的傳回結果。在同事的VS2010運作正常,我的VS2010在參照WCF服務後,卻沒有自動產生BooData類別定義。

反覆刪光本機的檔案重新由版控重新取回最新版本,也重新參照WCF服務,還是無法搞定。最後忽然福至心靈,想到一點: 若Web Site Project原本已參照Boo Library,在引用WCF服務時,即不再另外定義BooData,會直接引用Boo Library的BooData! 查看bin目錄,果然發現BooLibaray.dll的踪跡,Bingo!! 而刪除BooLibrary.dll後,重Build又會再冒出來,經同事提醒我才想到VS2010可以在Web Site Project上按右鍵檢視內容(Property Page)查到參考項目:

原來,Web Site Project先前曾參照過BooLibrary,後來專案架構改變,應該移除參照我卻沒移除,才導致沒有產生BooData定義的問題。但查了web.config,並沒有任何設定用來標示WebSite1參照Solution中的另一個專案。最後才搞懂,參照GAC的元件,才會被記載在web.config:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0">
      <assemblies>
      <add 
assembly="System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
  </system.web>
</configuration>

而參照Solution其他專案,是Build階段的工作,由Visual Studio或MSBuild執行,負責將專案Build成DLL,複製到Web Site Project的BIN目錄下,而這部分設定被儲存在Solution的.sln檔案中:

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebSite1", "D:\WebLab\WebSite1", "{F1877043-8DDB-413B-B84D-E2B6B21014C6}"
	ProjectSection(WebsiteProperties) = preProject
		TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
		ProjectReferences = "{BEA9C7F7-FC76-4638-AD90-FE546C3C88AC}|BooLibrary.dll;"
		Debug.AspNetCompiler.VirtualPath = "/WebSite1"
		Debug.AspNetCompiler.PhysicalPath = "D:\WebLab\WebSite1\"
		Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\WebSite1\"
		Debug.AspNetCompiler.Updateable = "true"
		Debug.AspNetCompiler.ForceOverwrite = "true"
		Debug.AspNetCompiler.FixedNames = "false"
		Debug.AspNetCompiler.Debug = "True"
		Release.AspNetCompiler.VirtualPath = "/WebSite1"
		Release.AspNetCompiler.PhysicalPath = "D:\WebLab\WebSite1\"
		Release.AspNetCompiler.TargetPath = "PrecompiledWeb\WebSite1\"
		Release.AspNetCompiler.Updateable = "true"
		Release.AspNetCompiler.ForceOverwrite = "true"
		Release.AspNetCompiler.FixedNames = "false"
		Release.AspNetCompiler.Debug = "False"
		VWDPort = "27116"
		DefaultWebSiteLanguage = "Visual C#"
	EndProjectSection
EndProject

我因為有些額外調整,沒有用SourceControl上移除參照的sln檔案,在Solution中遺留了WebSite1對BooLibrary的參照而不自知,這也解釋了為何同事的VS2010運作正常,只有我的出錯,所有的疑惑都找到了答案!

玩Web Site Project這麼久,今天又學到新東西,以後"見鬼"的狀況又可以再少一椿,真好!


Comments

Be the first to post a comment

Post a comment