none
在 ASP.NET 裡設定 dll 路徑 RRS feed

  • 問題

  • 各位老師好!小弟正在自學用ASP.NET架設網站,很多的資料都是從網路上挖的,所以缺乏很多正規的觀念,還請多多包涵。
    我現在遇到了一個問題不知道該如何解決,想請各位老師指點。

    我用 Microsoft Visual Studio Community 2019 以 ASP.NET 4.7.2 的架構建了一個 ASP.NET Web 應用程式(.NET Framework) 專案,並且用 NuGet 下載了 ZXing 元件用來生成 QrCode。

    建置專案的時候沒有問題,但是發布到網路的虛擬主機後才出現問題,後來發現好像是因為生成 QrCode 的 Zxing dll 執行路徑的問題。跟虛擬主機的服務人員溝通過後才知道我要改程式的路徑,但是我不知道要怎麼在專案裡改才可以讓程式直接用虛擬主機的 bin 目錄下的 ZXing dll 執行程式。也有查過 google,但可能是搜尋的方式不對或理解錯誤,所以覺得沒有找到我想要的答案。

    下面附上當時用try{}catch{}在網頁偵錯時擷取到的錯誤訊息 (因為無法發圖,只好用複製的):

    System.Security.SecurityException: 類型 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的使用權限要求失敗。
    於 ZXing.Rendering.BitmapRenderer.Render(BitMatrix matrix, BarcodeFormat format, String content, EncodingOptions options)
    於 ZXing.BarcodeWriter`1.Write(BitMatrix matrix) 於 C:\ZXing.Net\Source\lib\BarcodeWriterCustom.cs: 行 63
    於 Hola.SmallApps.QrCode.QrCode_Logo(String text, Int32 width, Int32 height) 於 D:\Conntex\Project\Web Development\Hola\SmallApps\QrCode.cs: 行 61
    於 Hola.Product_Detail.Page_init(Object sender, EventArgs e) 於 D:\Conntex\Project\Web Development\Hola\Product_Detail.aspx.cs: 行 29
    失敗的動作:
    LinkDemand
    第一個失敗使用權限的類型:
    System.Security.Permissions.SecurityPermission
    失敗組件的區域:
    MyComputer


    可以看到server端是以我的本機開發路徑來找程式的,而不是從虛擬主機的 bin 目錄裡找。

    如果不用try{}catch{}偵錯就會出現這個錯誤信息 (因為無法發圖,所以只好用複製的):

    安全性例外狀況

    描述: 應用程式嘗試執行安全原則不允許的作業。如果要授與這個應用程式所需的權限,請聯繫您的系統管理員,或在組態檔中變更這個應用程式的信任層級。

    例外狀況詳細資訊: System.Security.SecurityException: 類型 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的使用權限要求失敗。

    原始程式錯誤:
    [沒有相關的原始程式碼]

    原始程式檔: App_Web_uyv5cl1g.7.cs    行: 0

    堆疊追蹤:
    [SecurityException: 類型 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的使用權限要求失敗。]
       ZXing.Rendering.BitmapRenderer.Render(BitMatrix matrix, BarcodeFormat format, String content, EncodingOptions options) in BitmapRenderer.cs:280
       ZXing.BarcodeWriter`1.Write(BitMatrix matrix) in BarcodeWriterCustom.cs:63
       Hola.SmallApps.QrCode.QrCode_Logo(String text, Int32 width, Int32 height) in QrCode.cs:61
       Hola.Product_Detail.Page_init(Object sender, EventArgs e) in Product_Detail.aspx.cs:29
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +52
       System.Web.UI.Control.OnInit(EventArgs e) +97
       System.Web.UI.Page.OnInit(EventArgs e) +14
       System.Web.UI.Control.InitRecursive(Control namingContainer) +142
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6796
       System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +250
       System.Web.UI.Page.ProcessRequest() +76
       System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +24
       System.Web.UI.Page.ProcessRequest(HttpContext context) +62
       ASP.product_detail_aspx.ProcessRequest(HttpContext context) in App_Web_uyv5cl1g.7.cs:0
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +195
       System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +50
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +73

    這個是我用來偵錯的 try{}catch{} 編碼:

    protected void Page_Load(object sender, EventArgs e) 
    { 
    	string default_sf = Request.QueryString["lang"]; 
    	string category_id = Request.QueryString["series"]; 
    	string subcategory_id = Request.QueryString["sub"]; 
    	string original_url = Request.Url.AbsoluteUri.ToString(); 
    	try 
    	{ 
    		Bitmap lalala = QrCode.QrCode_Logo(original_url.Substring(0, original_url.IndexOf("?")) + "?lang=" + default_sf + "&series=" + category_id + "&sub=" + subcategory_id, 200, 200); //執行產生QrCode的程式
    		using (var ms = new System.IO.MemoryStream()) 
    		{ 
    			lalala.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
    			string base64 = Convert.ToBase64String(ms.ToArray()); 
    			imgShow.Attributes.Add("src", $"data:image/png;base64,{base64}"); //印出QrCode到client端螢幕
    		} 
    	} 
    	catch(Exception ex) 
    	{ 
    		test.Text = ex.ToString().Replace("\n", "<br />"); //偵錯
    	}
    } 

    當時裝NuGet元件的時候也沒有要設定路徑,而相同的檔案發佈到另一個免費的虛擬主機就沒有這個問題,可以印出 QrCode。虛擬主機的服務人員說應該要在我這裡改路徑,請問我該到哪裡設置?如果虛擬主機的 bin 目錄是 httpdocs/bin,我該怎麼改呢?

    請各位老師指點,現在覺得很苦惱,裝了元件等於沒裝。謝謝!

    2019年10月27日 上午 10:29

解答

  • 當您在本機上開發的時候
    IIS Express運行是以當下系統使用者為執行權限
    通常當下的系統使用者帳號權限都很大

    但,系統上線到IIS中時
    運行的權限變成IUser,會被限制在有限的權限中(安全考量)
    很可能就遇到類似您目前所遇到的問題

    此時必須先弄懂

    1.我目前使用的元件做了什麼,這些有沒有牽涉到其他的權限必須開啟
    (例如:資料夾存取的權限、檔案讀取、寫入、刪除、新增、...)
    2.IIS中使用的使用者是什麼使用者,他的權限是?

    ---

    回到您的問題
    您目前是為了要開發產生QRCode而使用了第三方的元件
    第三方的元件是否有需要使用什麼樣的權限,您可能要去該元件的網站,找詳細的說明,知道後,再決定下一步要怎麼處理

    但,QRCode的產生,還有其他方式

    如果您目前使用的權限問題處理起來比較麻煩的話
    小喵倒是建議您:其實前端的方式就可以在畫面中產生QRCode了

    小喵自己是使用jQuery QRCode來處理的

    山不轉路轉,也許是個解決的方式

    您可以參考以下的連結,或者搜尋關鍵字『jQuery QRCode』

    https://github.com/jeromeetienne/jquery-qrcode

    另外提醒一下,jQuery必須執行在可支援HTML5的瀏覽器中
    以現在這個時間點來看,大部分的瀏覽器可支援
    少部分比較老舊的瀏覽器,建議『勸導改用支援的瀏覽器』


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...



    2019年10月28日 上午 04:06
    版主

所有回覆

  • SecurityException錯誤表示權限不足, 如果是部署到虛擬主機, 可以向虛擬主機的管理員詢問
    2019年10月27日 下午 12:07
  • tihs老師您好!

    虛擬主機的服務人員跟我說他們的技術人員把主機的安全性權限全開後仍然會出現一樣的錯誤,所以他們認為不是安全性的問題。然後他們根據我擷取到的偵錯信息研判應該是程式的路徑有問題,要我修改,可是我不知道要到哪裡修改,在哪個環節修改,哪裡有範例可以參考,因為元件都是自動安裝的。

    我只是安裝了 NuGet 元件,編輯好 aspx 頁面和 cs 程式碼就發布網站到本機資料夾後上傳到虛擬主機,後來乾脆直接用 FTP 發布的方式上傳,而發行的檔案發行選項只選了先行編譯的默認設置,就這樣子而已。

    2019年10月27日 下午 12:51
  • SecurityException錯誤應該是權限沒錯, 虛擬主機的權限全開, 他們有開權限給您的程式嗎? 例如開資料夾的寫入權限給您的程式嗎?
    2019年10月28日 上午 12:52
  • 當您在本機上開發的時候
    IIS Express運行是以當下系統使用者為執行權限
    通常當下的系統使用者帳號權限都很大

    但,系統上線到IIS中時
    運行的權限變成IUser,會被限制在有限的權限中(安全考量)
    很可能就遇到類似您目前所遇到的問題

    此時必須先弄懂

    1.我目前使用的元件做了什麼,這些有沒有牽涉到其他的權限必須開啟
    (例如:資料夾存取的權限、檔案讀取、寫入、刪除、新增、...)
    2.IIS中使用的使用者是什麼使用者,他的權限是?

    ---

    回到您的問題
    您目前是為了要開發產生QRCode而使用了第三方的元件
    第三方的元件是否有需要使用什麼樣的權限,您可能要去該元件的網站,找詳細的說明,知道後,再決定下一步要怎麼處理

    但,QRCode的產生,還有其他方式

    如果您目前使用的權限問題處理起來比較麻煩的話
    小喵倒是建議您:其實前端的方式就可以在畫面中產生QRCode了

    小喵自己是使用jQuery QRCode來處理的

    山不轉路轉,也許是個解決的方式

    您可以參考以下的連結,或者搜尋關鍵字『jQuery QRCode』

    https://github.com/jeromeetienne/jquery-qrcode

    另外提醒一下,jQuery必須執行在可支援HTML5的瀏覽器中
    以現在這個時間點來看,大部分的瀏覽器可支援
    少部分比較老舊的瀏覽器,建議『勸導改用支援的瀏覽器』


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...



    2019年10月28日 上午 04:06
    版主
  • tihs老師您好!
    虛擬主機的服務人員說資料夾的寫入權限要在虛擬目錄裡調,我不太確定程式的寫入權限是不是可以這樣開,感覺上這個應該是針對使用者對虛擬目錄的讀取和存取權限才對??還是我理解錯誤了呢?

    2019年10月28日 下午 01:36
  • 小喵老師您好!
    我聽了您的建議嘗試用前端的方式產生QrCode,一般網頁瀏覽器可以產生,但是我發現好像沒有辦法在手機的瀏覽器(iphone xr, chrome)裡產生(是不是因為因為不支援HTML5的關係??)
    請問小喵老師,如果說我的元件需要開啟某些權限,我是不是只能請虛擬主機的提供者開啟權限?

    我在虛擬主機端用 try{}catch{} 擷取的錯誤信息可以忽略嗎??為什麼程式已經上傳到虛擬主機了,但是執行的路徑卻還是依據我在本機開發專案時的路徑呢?還是說這個是虛擬主機的問題??
    • 已編輯 lalulula 2019年10月28日 下午 02:14
    2019年10月28日 下午 01:38
  • 小喵我使用jQuery QRCode,主要就是應用在手機的瀏覽器
    無論是safari, chrome都支援html5

    所以,手機的對應沒問題的

    您的頁面,在瀏覽器檢視原始檔,然後把前面的兩三行貼出來看看

    我擔心的是您宣告他要用html4的方式去執行

    ^.^a

    請參考這個

    https://www.runoob.com/tags/tag-doctype.html

    裡面的『常見的DOCTYPE聲明』


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...



    2019年10月29日 上午 01:24
    版主
  • 小喵老師您好!

    我頁面頭三行的原始碼是:

    <!DOCTYPE html>
    
    <html lang="zh">
    <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="keywords" content="conntex,

    我應該是用html5宣告的,程式碼和顯示 QrCode 的都寫在 <asp:Content> 的區域裡,這個會影響在手機瀏覽器裡的顯示嗎? 因為圖片和文字都可以正常顯示。

    2019年10月29日 上午 07:39
  • 小喵老師您好!

    我找到問題在哪裡了,當初在設計手機頁面時寫了一些java script,後來在那些編碼裡原本用到的 id 和 class 被我刪掉了,而我也忘了修改那些 script,又剛好我把產生 QrCode 的程式寫在那段 script 後面,所以程式執行到那段沒用的 script 後就不執行了,因此才沒有產生 QrCode。

    2019年10月30日 上午 02:54
  • 恭喜找到原因

    給您建議:
    要跟瀏覽器的『F12開發者模式』做好朋友

    通常如果JS有問題,可以在開發者模式中的Console裡面,清楚的看到問題的發生與位置(原始檔中的行號)

    這對於問題的初步判斷很有幫助

    ^_^


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2019年10月30日 上午 04:04
    版主