2016-02-04 115 views
2

自從我們在項目中停止使用常規IIS以來,過去幾年來,我一直遇到IIS Express的問題。我們通常擁有具有Web服務和某種客戶端(Web,桌面或兩者)的解決方案。當我每10次運行一次客戶端時,我會收到關於找不到localhost:blahblah或無法加載程序集的錯誤。完全重建總是可以解決這個問題。但是,這是我和我的同事們在VS2013和VS2015中處理過的東西。我想出了一個解決方法,我添加了一個Pre-build事件來刪除Web服務的bin文件夾,並在其上執行和msbuild。這在我的機器上效果很好。但是,我不知道如何將它寫在我們的構建服務器或其他人機器上。預生成事件作爲cs.proj文件的一部分被檢入到源代碼控制中,所以如果我去那個路由,我需要一個通用的解決方案。這是我的預編譯腳本:Visual Studio/IIS Express間歇性錯誤

DEL /Q "C:\TFS\Enterprise Data Management\Vendor\Dev-Phase2US\WcfService\bin\*.*" 
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" "C:\TFS\Enterprise Data Management\Vendor\Dev-Phase2US\WcfService\WcfService.csproj" 

是否有其他人有過類似的問題?任何良好的解決方案或解決方法?

+1

在每個開發人員的機器上設置一個環境變量,並在簽入的文件中使用該變量。然後,每臺機器都可以根據開發人員的喜好將其設置爲不同的值。 –

+0

@LexLi這是一個很好的建議。我想過這個。其中一個缺點是我們試圖在源代碼控制中擁有一切。所以任何開發人員都可以在不進行任何環境設置的情況下下載代碼並運行代碼此外,我不認爲這將與我們的生成服務器管理員飛行。然而,沒有我的組織限制,這是一個好主意。 –

+0

所以爲了確保我能正確理解修正:您想要在每臺開發人員的機器上運行此PreBuild命令,但需要知道C:\ TFS \ .. \ Dev-Phase2US \ WcfService的路徑嗎? – makhdumi

回答

4

在回答所提出的問題,用「通用」的路徑,使用Visual Studio中提供的「宏」(在技術上, MSBuild屬性)。假設WcfService文件夾是在同一個解決方案,

DEL /Q "$(SolutionDir)\WcfService\bin\*.*" 

或者,如果它是在一些與項目的路徑,

DEL /Q "$(ProjectDir)..\..\..\WcfService\bin\*.*" 

注意,使用前建立該事件是非常不好的做法雖然。最好在項目中使用Clean任務,例如加入這個您的.csproj(根元素,例如</Project>前下):

<Target Name="CleanWcfProject" BeforeTargets="PrepareForBuild"> 
    <MSBuild Projects="$(SolutionDir)\WcfService\WcfService.csproj" Targets="Clean" Properties="Configuration=$(Configuration);Platform=$(Platform)" /> 
    </Target> 

我不知道爲什麼你在WcfService.csproj項目運行MSBuild的決定,因爲你可以簡單地將其添加作爲項目參考(右鍵單擊>添加參考>解決方案),這將導致MSBuild在查看其輸出被清除後自動生成項目。

如果因項目是另一種解決方案

如果是這種情況,那麼清潔應使用相對路徑工作,但加入了ProjectReference可能不是理想的/可能(你仍然可以添加依賴於您的解決方案,即使它在另一個解決方案中,但由於其他許多依賴關係,這通常是不可行/可行的)。

如果是這樣,那麼只需添加構建目標爲好,

<Target Name="CleanWcfProject" BeforeTargets="PrepareForBuild"> 
    <MSBuild Projects="$(ProjectDir)..\..\..\WcfService\WcfService.csproj" Targets="Clean;Build" Properties="Configuration=$(Configuration);Platform=$(Platform)" /> 

    </Target> 
+0

我同意預構建事件並不理想。代碼解決方案設置爲構建WcfService項目,但運行客戶端時發生的「智能」構建並不總是適用。這就是爲什麼我手動編寫預構建事件來執行「清理」和構建。您的帖子中的通用路徑和清理任務是非常有用的。我根本沒有意識到這一點。我找到了一篇MSDN文章來幫助我瞭解細節。 https://msdn.microsoft.com/en-us/library/ms366724.aspx這感覺就像是正確的解決方案。非常感謝! –

1

你可以嘗試這個替代設置爲您的項目。右鍵單擊您的Web項目。選擇屬性,然後選擇Web選項卡。如下配置您的Visual Studio。

enter image description here

而且右鍵單擊該項目並選擇設爲啓動後續項目如下 enter image description here

然後最後右鍵單擊主頁上,例如或者您希望首先啓動的頁面index.html的,並設置爲起始頁如下

enter image description here

+0

感謝您的輸入。我們的大多數Web客戶端應用程序都是這樣設置的。他們總是很好。客戶端在解決方案中引用的是後端Web服務,這是問題所在。客戶端可以是從WPF應用程序到控制檯應用程序到Web客戶端的任何內容。 –

1

如果在同一個解決方案都控制檯應用程序和Web應用程序,請試試這個吧上的解決方案。選擇屬性,並設置啓動項目多啓動項目如下

enter image description here

+0

感謝您的截圖。我會嘗試。 –

+0

這似乎只是在同一時間啓動多個客戶端。問題是後端服務沒有引發IIS Express中的屬性。 –

+0

如果IIS Express沒有啓動並且您嘗試了其他所有操作,我會建議您取消安裝並重新安裝Visual Studio。 IIS Express內置於Visual Studio中。通過這種方式,您可以獲得默認配置,理論上應該沒問題 –

3

非常感謝鋁Muhandis爲我安排在正確的軌道此上。總之,重建WCF服務項目可以100%地解決我的問題。在我的第一個問題中的預建事件是這樣做的一個非常hacky的方式。一個簡單的清潔是不夠的,因爲我得到這個錯誤只是一個清潔:

無法激活請求的服務'http://localhost:53934/EdmVendService/EdmVendor.svc'。請參閱服務器的診斷跟蹤日誌以獲取更多信息。

我最終的解決方案是將這個XML塊添加到csproj文件。我只是用記事本來編輯它。

<Target Name="RebuildWcfProject" BeforeTargets="PrepareForBuild"> 
    <MSBuild Projects="$(SolutionDir)\WcfService\WcfService.csproj" Targets="Rebuild" Properties="Configuration=$(Configuration);Platform=$(Platform)" /> 
</Target> 

這是我改變後的csproj文件的底部。

enter image description here

希望這可能是幫助別人。