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

相关问题