2010-09-22 147 views
1

我在VS2008中開發了一個Web應用程序。它在我的開發PC上完美工作。當我發佈並上傳到共享Windows託管服務(它支持ASP.NET 3.5)時,它失敗(即使從我的開發PC訪問它)。該錯誤消息是:ASP.NET部署失敗 - 無法加載文件或程序集'Microsoft.mshtml'

無法加載文件或程序集「Microsoft.mshtml,版本= 7.0.3300.0文化=中性公鑰= b03f5f7f11d50a3a」或它的一個依賴。該系統找不到指定的文件。

我看了很多關於這個主題的論壇帖子,並嘗試推薦的解決方法:

  1. 設置複製本地參考 - VS2008不允許複製本地的ASP.NET參考,只是WinForms引用。
  2. 將mshtml.dll複製到安裝目錄中 - 我試過了根目錄和/ bin /下名稱爲「mshtml.dll」和「Microsoft.mshtml.dll」的3個不同版本的文件。沒有工作。
  3. 通過運行「vs_piaredist.exe」將Visual Studio中的互操作性組件安裝到服務器上 - 我沒有管理員訪問服務器的權限,託管公司也不會這樣做。

我知道這個問題已經被覆蓋過,但是建議的解決方案不起作用。有沒有人有任何見解?

TIA

+0

你在做什麼,需要MSHTML? AFAIK是客戶端組件,不是服務器應該需要的東西。 – Jason 2010-09-22 20:52:02

+0

我的應用程序做了很多HTML文檔解析 - getElementById,getElementsByTagName,這樣的事情。這些都是由mshtml啓用的。是否有另一個包含這些函數的庫? – Tom 2010-09-22 21:21:51

+0

http://stackoverflow.com/questions/56107/what-is-the-best-way-to-parse-html-in-c – Jason 2010-09-22 21:48:56

回答

0

再次提到了其他的建議之一,由於傑森。 HTMLAgilityPack取得了訣竅。爲了幫助他人,我將發佈一些我覺得有用的代碼片段(因爲產品上的文檔很稀疏)。

1)在您的ASP.NET應用程序中,將HtmlAgilityPack.dll和HtmlAgilityPack.XML複製到您的BIN文件夾中。
通過右鍵單擊解決方案資源管理器中的頂部行並查看「屬性頁」來檢查以確認它已註冊。如果HtmlAgilityPack不在您的參考文獻中,請單擊[AddDownArrow],添加引用,Bin,HtmlAgilityPack,確定。

2)捕獲的Web頁並將其轉換成一個HTML DOC:從EggheadCafe's excellent Asynchronous Task example改編

Public Function OnBegin(...) 
    vRequest = WebRequest.Create("http://www.stackoverflow.com") 
    Return vRequest.BeginGetResponse(cb, extraData) 
End Function 

Public Sub OnEnd(...) 
    Private vPage_Text As String = "" 
    Private vPage_Doc As New HtmlAgilityPack.HtmlDocument 
    Using response As WebResponse = vRequest.EndGetResponse(ar) 
     Using reader As StreamReader = New StreamReader(response.GetResponseStream()) 
      vPage_Text = reader.ReadToEnd() 
      vPage_Doc.LoadHtml(vPage_Text) 
     End Using 
    End Using 
End Sub 

3)提取物中的整個HTML文件:

vText = vPage_Doc.DocumentNode.OuterHtml 

4)檢查每個鏈接在DOC中並收集網址:

For Each vLinkNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//a") 
    vLinkList = vLinkList & vLinkNode.GetAttributeValue("href", "") & vbCrLf 
Next 

5)檢查每個WITH CSS類= 「item_class」 並收集TEXT:

For Each vDivNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//div[@class='item_class']") 
    vPageText = vPageText & vDivNode.InnerText & vbCrLf 
Next 

6)提取物中的DOC標題和說明:

Dim vTitleNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//title") 
vTitleText = vTitleNode.InnerText 
Dim vDescriptionNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//meta[@name='description']") 
vDescriptionText = vDescriptionNode.InnerText 

或者在doc體內的名稱:

vBodyTitle = vPage_Doc.DocumentNode.SelectSingleNode(".//h1") 

7)中提取元通過其ID:

Dim vBigImageNode As HtmlAgilityPack.HtmlNode = vPage_Doc.GetElementbyId("BigImage") 
vImage_URL = vBigImageNode.GetAttributeValue("src", "") 
vImage_Height = vBigImageNode.GetAttributeValue("height", "") 
vImage_Width = vBigImageNode.GetAttributeValue("width", "") 

8)刪除節點:

vMovieNode.SelectSingleNode(".//div[@class='viewer-reviews']").Remove() 

最後,我有必要提取網頁的時款沒有明顯的節點或其他「連接點」。訣竅在於識別任何可以「找到」的東西(例如標籤或評論),這些東西可以用作文檔的已選節點中的分隔點。然後插入插入結束標籤和開始標籤,從而創建2個獨立的子節與節點。最後,從編輯的節點創建一個新的HTML文檔並選擇新定義的節點。 (如果你不明白這一切,只需按照代碼。)
因此,這裏是絕密,發佈以前從未,

9)提取文檔的任何部分:

Dim vNewDoc As New HtmlAgilityPack.HtmlDocument 
vNewDoc.LoadHtml(vOldDivNode.OuterHtml.Substring(0, vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1) & _ 
    "</div><div class=""my_new_node"">" & _ 
    vOldDivNode.OuterHtml.Substring(vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1)) 
Dim vNewDivNode = vNewDoc.SelectSingleNode(".//div[@class='my_new_node']") 
Dim vHaHaICapturedYou As String = vNewDivNode.InnerText 

當然,現在我已經告訴過你了,我必須要殺了你。

感謝Stack Overflow的所有貢獻者爲您提供的所有幫助!

相關問題