【问题标题】:ASP.NET Deployment Fails - Could not load file or assembly 'Microsoft.mshtml'ASP.NET 部署失败 - 无法加载文件或程序集“Microsoft.mshtml”
【发布时间】:2011-04-15 22:27:12
【问题描述】:

我在 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 引用的 Copy Local,仅适用于 WinForms 引用。
  2. 将 mshtml.dll 复制到安装目录中 - 我尝试了 3 个不同版本的文件,分别位于根目录和 /bin/ 中,名称分别为“mshtml.dll”和“Microsoft.mshtml.dll”。无济于事。
  3. 通过运行“vs_piaredist.exe”将 Visual Studio 中的互操作性程序集安装到服务器上 - 我没有对服务器的管理员访问权限,托管公司也不会这样做。

我知道这个问题之前已经讨论过,但建议的解决方案不起作用。有人有什么见解吗?

TIA

【问题讨论】:

  • 你在做什么需要MSHTML? AFAIK 是客户端组件,而不是服务器应该需要的东西。
  • 我的应用程序做了很多 HTML 文档解析——getElementById、getElementsByTagName 之类的。这些都是由 mshtml 启用的。是否有其他库包含这些函数?
  • @Jason - 看起来很棒!直到下周我才能尝试。我会回来报告结果。谢谢一百万!

标签: asp.net web-applications deployment hosting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    再次感谢杰森。 HTMLAgilityPack 做到了。

    为了帮助他人,我将发布一些我认为有用的代码 sn-ps(因为有关产品的文档很少)。

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

    2) 捕获网页并将其转换为 HTML 文档:
    改编自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) 检查文档中的每个链接并收集 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) 提取文档的标题和描述:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多