Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[faq]ASP .NET Core Web Api使用RazorLight套件部署上Azure Web App執行不起來的故障排除

2019-08-07 Wednesday
[faq]ASP .NET Core Web Api使用RazorLight套件部署上Azure Web App執行不起來的故障排除.jpg
圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/

寫過ASP .NET MVC的對於Razor語法想必不陌生,畢竟相較於以前aspx那種語法,使用Razor這個template語法寫起來簡潔並且易懂很多。

現在漸漸流行的是前端和後端分離,因此更多情況會撰寫Web Api,而畫面留給前端的框架來寫。

但是這並不代表Razor沒有作用,畢竟有很多時候在後端需要用到template的概念產生一些内容。

例如説假設今天系統需要寄送mail,那麽mail内容就很適合用Razor template來撰寫。

RazorLight就是一個方便再.NET專案裡面使用Razor template的一個套件。

不過使用了之後,在local測試的時候可能沒有問題,但是部署上去整個網站run不起來怎麽辦?

這篇來看看使用RazorLight的ASP .NET Core Web Api在部署到Azure Web App之後怎麽避免出現錯誤。

github sample project

這篇描述的sample程式碼可以在github看到:https://github.com/alantsai-samples/dotnet-core-razorlight-publish

問題描述

首先,先來看看如果直接部署上Azure Web App可能會遇到什麽錯誤。

錯誤1:cshtml template沒有跟著上去·的問題
這個錯誤訊息應該還滿明顯,一般是 DirectoryNotFound 或者 是 InvalidOperationException: Project can not find template with key xxx Exception:
chrome_2019-08-10_21-26-32.png
DirectoryNotFound錯誤
錯誤2:Can not find compilation library location for package "Microsoft.AspNet.WebApi.Client"
這個錯誤有很多不同的形式,也有可能會是 Can't load metadata reference from the entry assembly

Can not find compilation library location for package "Microsoft.AspNet.WebApi.Client" 錯誤截圖

解決方式

針對上面的兩個問題,可以透過修改 *.csproj增加設定的方式解決。

錯誤1:cshtml template沒有跟著上去·的問題

這個問題貌似簡單,感覺好像和一般asset類型的處理方式就好(右鍵,選擇 property然後調整爲copy always),但是實際上和一般asset處理方式還是有點不同,就算改了變成copy always也沒有作用。

正確的處理方式是,在csproj加上:

<PropertyGroup>
	<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>

透過這個方式,cshtml的檔案就會上去了。

錯誤2:Can not find compilation library location for package "Microsoft.AspNet.WebApi.Client"

這個問題在比較複雜的專案才會出現,解決方式也是透過修改csproj裡面加上:

<PropertyGroup>
	<PreserveCompilationContext>true</PreserveCompilationContext>
	<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
</PropertyGroup>

這兩個問題合在一起的話,csproj的設定就會是:

<PropertyGroup>
	<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
	<PreserveCompilationContext>true</PreserveCompilationContext>
	<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
</PropertyGroup>


設定的截圖

結語

Razor是一個很方便的template語言,尤其是如果有用過ASP .NET MVC的話。

RazorLight則是其中一個讓任何.NET專案能夠用Razor Template的套件。

如果有template的需求不妨試試看,這篇則可以表面掉部署上去的問題。

參考資料


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2019-08-07 Wednesday
comments powered by Disqus