寫過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: - 錯誤2:Can not find compilation library location for package "Microsoft.AspNet.WebApi.Client"
-
這個錯誤有很多不同的形式,也有可能會是
Can't load metadata reference from the entry assembly
解決方式
針對上面的兩個問題,可以透過修改 *.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的需求不妨試試看,這篇則可以表面掉部署上去的問題。