您的位置:首頁 > 軟件教程 > 教程 > 解決Razor頁面部署問題的思考與實踐

解決Razor頁面部署問題的思考與實踐

來源:好特整理 | 時間:2024-10-01 10:05:20 | 閱讀:154 |  標(biāo)簽: a 問 S   | 分享到:

解決方案寫在前面:更新Visual Studio及相關(guān)組件,本人版本自17.8.0更新至17.11.4 緣起于公司的一個業(yè)務(wù)接口,在有一些信息需要在應(yīng)用內(nèi)嵌的webview中展示,信息不少,涉及的前端技術(shù)不復(fù)雜,但是拼字符串太羅嗦,所以想到了添加一個Razor頁面,所以,常規(guī)邏輯,在服務(wù)上注冊

解決方案寫在前面:更新Visual Studio及相關(guān)組件,本人版本自17.8.0更新至17.11.4

緣起于公司的一個業(yè)務(wù)接口,在有一些信息需要在應(yīng)用內(nèi)嵌的webview中展示,信息不少,涉及的前端技術(shù)不復(fù)雜,但是拼字符串太羅嗦,所以想到了添加一個Razor頁面,所以,常規(guī)邏輯,在服務(wù)上注冊'''AddRazorPages''',構(gòu)建后使用映射方法'''MapRazorPages''',然后調(diào)試。這次調(diào)試沒有問題,頁面也能正常顯示。因為是微信的小程序,并且是在手機上演示,網(wǎng)站地址要在配置的業(yè)務(wù)域名上,所以基本寫完了頁面,第一時間就把應(yīng)用部署到了iis的測試端口上。然后問題就發(fā)生了————配置的首頁返回404,訪問業(yè)務(wù)所在的url也返回404。

因為幾乎是第一次正式用Razor,所以嘗試了檢查url,補全index甚至補全.cshtml,都是一樣的404。再后來檢查了應(yīng)用的日志,發(fā)現(xiàn)除了頁面訪問的w3cLog記錄,沒有任何其他的記錄,但頁面使用了Ef core 對SQl Server 的查詢,而查詢的日志項并沒有在日志過濾規(guī)則之外,所以基本確定了頁面并沒有被執(zhí)行。

本地調(diào)試可以執(zhí)行,部署后不能執(zhí)行,第一時間就是想到的環(huán)境不一致,Development和Production,對應(yīng)開發(fā)環(huán)境和生產(chǎn)環(huán)境。在Visual Studio使用調(diào)試時ASPNETCORE_ENVIRONMENT這個變量要被設(shè)置成"Development"的,但直接執(zhí)行,該環(huán)境變量沒有定義,應(yīng)用默認(rèn)的狀態(tài)是Production。
解決Razor頁面部署問題的思考與實踐

在Debug文件夾運行可執(zhí)行文件,結(jié)果發(fā)現(xiàn)依然404。注意到Pages 文件夾沒有,第一時間考慮有兩種可能:一、項目設(shè)置錯誤,沒有在生成時把文件復(fù)制到文件夾;二、考慮cshtml文件被編譯到dll中了(實際上就是這樣的,但當(dāng)時的我并不能確認(rèn))。

先考慮第一種可能,這個實操不難,只需要在項目配置中添加

    
      Always
    

再生成一次,第一遍不配置ASPNETCORE_ENVIRONMENT變量,結(jié)果是相關(guān)頁面依舊404,第二遍,配置ASPNETCORE_ENVIRONMENT為Development,終于,頁面正常展示了。但奇怪的是,進一步發(fā)布->運行時,依然需要將ASPNETCORE_ENVIRONMENT變量設(shè)置為Development??這不應(yīng)該。ù藭r的我依然沒覺得復(fù)制Pages/*.cshtml有什么問題,就是覺得配置被搞出問題了)設(shè)置為開發(fā)環(huán)境顯然不合理,很多配置都是針對開發(fā)環(huán)境的,SwaggerUI也會展示,總不能在發(fā)布到服務(wù)器前再改一次代碼吧?

不過,由于第二天要演示,而且由于微信小程序的各種**門檻,不得不部署,這時候IIS又鬧情緒,照網(wǎng)上的辦法,又是配置 ,又是配置 的,運行起來的服務(wù)始終是生產(chǎn)環(huán)境,總不能改系統(tǒng)的環(huán)境變量,畢竟上面的陳年老項目認(rèn)到這個變量指不定激動的抽過去了也不一定。不過,辦法總比困難多,Environment.SetEnvironmentVariable方法解決這個問題,其實也是一開始就想到它了,但為了不動現(xiàn)有的代碼,一直沒舍得用,遵循下老祖宗的開閉原則嘛。但第二天的演示更要緊,不得不做一個違背老祖宗的決定~

演示結(jié)束,立馬回到這個問題,首先想到的就是新建一個項目。這下可不得了了,不論改環(huán)境變量還是復(fù)制文件,都成了404了。明明就是默認(rèn)的Razor Pages模板,去MSDN上給的代碼也都一樣,但就是跑不起來。無頭蒼蠅一樣搜了各種辦法,但都沒有針對我的問題,尋找文心一言和chatGPT的解答,也都是不合我意。

不過,最終在各種關(guān)鍵詞搜索中,找到了楊中科老師在百家號上的一篇回答《如何讓asp.net core mvc發(fā)布時候不編譯cshtml視圖》,雖然和我的想法相反,但這總算是相關(guān)的了。文章中介紹了讓cshtml文件在運行時編譯的方法,感覺能找到點苗頭,于是按他說的一試,頁面不再是404了。

或許到這,也就該結(jié)束了,畢竟用這方法不在考慮修改環(huán)境變量,也不用修改其他代碼,問題算是圓滿的解決了。。。嗎?當(dāng)然可以不再進一步探索,但是這篇反方向的解決方案讓我有了一個新的靈感————:

文章滿篇都在提要在運行時編譯要做的額外配置,那要是不做呢?默認(rèn)情況下它到底以何種方式運行。楊中科老師的文章中提到的兩個屬性標(biāo)簽已經(jīng)讓答案呼之欲出了:MvcRazorCompileOnPublish被置為了false,RazorCompileOnBuild同樣被置為了false,也就是說,默認(rèn)情況下,生成時和發(fā)布時Razor文件可能是被編譯的。至于編譯的形式,有可能就是jsp那樣。ㄖ劣跒槭裁聪戎赖膉sp,學(xué)校給教的,大概在2020~2021年,哈哈:),現(xiàn)在估計依然在教。也是完成作業(yè)的過程中偶爾接觸到的jsp文件編譯后的反編譯代碼)

要探究編譯后的文件,自然是少不了ILSpy,以往用它來分析過線上代碼的問題,所以想到反編譯就想到了它。對發(fā)布后的dll(沒有使用運行時編譯配置)進行分析,發(fā)現(xiàn)相關(guān)的命名空間下只有Model文件的編譯,頁面內(nèi)容相關(guān)的代碼一點沒有。
解決Razor頁面部署問題的思考與實踐

但現(xiàn)在,在當(dāng)前的環(huán)境下,我也是窮途末路了,新項目都這樣,就算又有配置問題,找出來也不異于大海撈針,況且如此的絕望,在第一天下班后的嘗試中就已經(jīng)發(fā)生在了自己的電腦上。只有用本辦法了————虛擬機。在一臺Windows10環(huán)境的虛擬機上,我又重新搭建了一套Visual Studio,創(chuàng)建了新的Razor模板,運行。但這次,成功了,用了各種姿勢都是。我不知道該說是意料之中還是意料之外。但總算是有成功的樣本給我研究了。

拿到虛擬機上發(fā)布后的dll,丟到ILSpy中,這次能清楚的看到被編譯到dll當(dāng)中的頁面內(nèi)容,也不出意外,整體形式和jsp差不多。
解決Razor頁面部署問題的思考與實踐

但為什么?這一遭讓我知道了cshtml在不特殊設(shè)置的情況下確實要被編譯到dll中去的,相應(yīng)的,把cshtml復(fù)制到構(gòu)建文件夾并無必要。我一開始考慮的配置問題似乎就不存在……
剩下的就是對項目無盡的蹂躪了。當(dāng)我在一次次的生成、調(diào)試或是發(fā)布時,我注意到一條警告:

CS9057 分析器程序集“C:\Program Files\dotnet\sdk\8.0.201\Sdks\Microsoft.NET.Sdk.Razor\source-generators\Microsoft.CodeAnalysis.Razor.Compiler.SourceGenerators.dll”引用了編譯器的版本“4.9.0.0”,該版本高于當(dāng)前正在運行的版本“4.8.0.0”

要放在平時,我根本不會在意,畢竟?jié)M屏的“屬性未在構(gòu)造器中賦值”中,它并不起眼,況且,就算偶然注意到它,也已經(jīng)在多次偶然中與它相熟了。往常也沒有奇怪的異常與它相關(guān)。但這次顯眼Compiler和SourceGenerators讓我無法再忽視它的存在。cshtml不就是在編譯時沒有生成成相應(yīng)的代碼嘛。

在前面蹂躪的過程中,也試了使用dotnet publish,結(jié)果是成功的,換了不同的sdk版本,都是成功。但自從注意到這條警告,我就試圖在dotnet 的生成和發(fā)布中找到它,始終無果。
VS編譯器版本不兼容了?怎么更新一下?vs編譯用的不是我安裝的sdk?

此時,自然就想到了更新Visual Studio,找到 vs installer 發(fā)現(xiàn)確實有新版本,發(fā)現(xiàn)版本號差的并不是很大,所以一開始并沒有報太大希望,但更新后再編譯,一切問題都消失了……

困擾我這么久的問題,竟然一次更新就解決了,完全就沒有幻想中力挽狂瀾的澎湃啊啊啊啊啊~~~

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點或證實其描述。

a 1.0
a 1.0
類型:休閑益智  運營狀態(tài):正式運營  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對日常生活中的各種雜亂物

相關(guān)視頻攻略

更多

掃二維碼進入好特網(wǎng)手機版本!

掃二維碼進入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2024 haote.com 好特網(wǎng)