ASP.NET部署失败 - 无法加载文件或程序集“Microsoft.mshtml”

时间:2010-09-22 19:35:42

标签: asp.net web-applications deployment hosting

我在VS2008中开发了一个Web应用程序。它在我的开发PC上完美运行。当我发布并上传到共享Windows主机服务(支持ASP.NET 3.5)时,它会失败(即使从我的开发PC访问它)。错误消息是:

  

无法加载文件或程序集“Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。

我已经阅读了很多关于这个主题的论坛帖子,并尝试了推荐的解决方案:

  1. 将引用设置为Copy Local - VS2008不允许复制本地ASP.NET引用,仅适用于WinForms引用。
  2. 将mshtml.dll复制到安装目录中 - 我在根目录和/ bin /中尝试了3个不同版本的文件,名称分别为“mshtml.dll”和“Microsoft.mshtml.dll”。没有工作。
  3. 通过运行“vs_piaredist.exe”将Visual Studio中的互操作性程序集安装到服务器上 - 我没有对服务器的管理员访问权限,托管公司也不会这样做。
  4. 我知道此问题已经涵盖过,但建议的解决方案不起作用。有没有人有任何见解?

    TIA

2 个答案:

答案 0 :(得分:1)

如果您尝试解析HTML而不是MSHTML,请尝试HTMLAgilityPack或此问题中提到的其他建议

What is the best way to parse html in C#?

答案 1 :(得分:0)

再次感谢杰森。 HTMLAgilityPack就是这个伎俩。

为了帮助他人,我会发布一些我觉得有用的代码片段(因为该产品的文档很少)。

1)在您的ASP.NET应用程序中,将HtmlAgilityPack.dll和HtmlAgilityPack.XML复制到您的BIN文件夹中。
通过右键单击解决方案资源管理器中的顶行并查看“属性页”来检查是否已注册。如果HtmlAgilityPack不在您的引用中,请单击[AddDownArrow],Add Reference,Bin,HtmlAgilityPack,OK。

2)捕获网页并将其转换为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中的每个链接并收集URL:

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

5)每次检查CSS class =“item_class”并收集文字:

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

或者文档正文中的标题:

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的所有贡献者为您提供的所有帮助!