簡體   English   中英

GetWebResourceUrl的。 無法獲取嵌入式資源網址

[英]GetWebResourceUrl. Cant get embedded resource url

我正在嘗試通過GetWebResourceUrl獲取嵌入式圖像資源的URL。

情況:

編寫Visual Studio包(擴展名)。 在單擊我的菜單按鈕時,我要復制位於AssemblyName1所有嵌入式資源。 在資源類型text/css我有這樣的網址:

background-image: url('<%=WebResource("PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png")%>');

當復制這樣的資源時,我想通過WebResource對其進行預編譯,將其轉換為:

background-image: url('/WebResource.axd?d=PhPk80h_UWEcbheb-NHNP5WshV_47UOpWqAOl1_li
UFfN4cNofL74cFlQ1fvpFSf0&t=632573240669964903')

我將程序集( AssemblyName1 )掛接到VSPackage程序集。 AssemblyName1

[assembly: WebResource("PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", "image/png")]

PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png添加到嵌入式資源。

在VSPackage程序集中,我寫道:

System.Reflection.MemberInfo[] methodCandidates = typeof(System.Web.Handlers.AssemblyResourceLoader).GetMember("GetWebResourceUrlInternal", 
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);

foreach (var methodCandidate in methodCandidates)
{
    var method = methodCandidate as System.Reflection.MethodInfo;

    if (method == null || method.GetParameters().Length != 5) continue;

    object result = method.Invoke(null,
                                  new object[] 
                                  {
                                      System.Reflection.Assembly.GetAssembly(typeof(PSK.Web.UI.Controls.PSKSoftApp.PSKSoftApp)),
                                      "PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", 
                                      false, 
                                      false,
                                      null
                                  });
}

調用

method.Invoke(null, new object[] {System.Reflection.Assembly.GetAssembly(typeof(PSK.Web.UI.Controls.PSKSoftApp.PSKSoftApp)),
                                      "PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", false, false, null});

返回異常: {"Value cannot be null.\\r\\nParameter name: basepath"}

這是什么BasePath ,我應該在哪里設置?

由於這是google上的最高評論,而我找不到相關的答案,因此這是我發現的原因和解決方案(對我而言):

情況:嘗試對我構建的服務器控件上的一些公共方法進行單元測試,其中包括對WebResource的請求。

錯誤:“基本路徑”為null

原因:控件向頁面詢問WebResource。 該頁面要求ScriptManager請求上述資源。 ScriptManager做一些內部工作,並嘗試請求WebResource,但是遇到“ basepath”問題。

由於這是單元測試,因此沒有Web服務器。 沒有Web服務器意味着腳本管理器不知道要為其發出請求的“基本路徑”。 沒有“ basepath”意味着沒有辦法為該資源構造HTTP請求。

解決方案:兩個選項:

A)在單元測試中模擬/注入Web服務器,以允許Page / ScriptManager生成BasePath並發出適當的請求。 有許多有關此聯機的資源,但我發現(但未使用)的最佳資源引用了[AspNetDevelopmentServer]屬性的使用。 我沒有使用此解決方案,因為我們有一個持續集成的構建服務器,並且我不想讓測試在所有開發人員機器和構建服務器上都起作用。 這可能很容易,但是我沒有嘗試過。

B)重新設計控件,以在服務器控件的不可測試(不費力)部分中發出Webresource請求。 我使用的是CreateChildControls(自動調用),而是將webresource請求移至OnInit。 可能不是最佳做法,但對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM