SharePoint错误:"无法导入Web Part"

11

我开发了一个网页部件,如果我手动安装这个网页部件,一切都很好。

然而,当我按照这个网站上的指南打包网页部件为解决方案包(WSP)时:

http://www.theartofsharepoint.com/2007/05/how-to-build-solution-pack-wsp.html

日志文件中出现了以下错误:

09/23/2008 14:13:03.67  w3wp.exe (0x1B5C)                           0x1534  Windows SharePoint Services     Web Parts                       8l4d    Monitorable Error importing WebPart. Cannot import Project Filter.   
09/23/2008 14:13:03.67  w3wp.exe (0x1B5C)                           0x1534  Windows SharePoint Services     Web Parts                       89ku    High        Failed to add webpart http%253A%252F%252Fuk64p12%252FPWA%252F%255Fcatalogs%252Fwp%252FProjectFilter%252Ewebpart;Project%2520Filter.  Exception Microsoft.SharePoint.WebPartPages.WebPartPageUserException: Cannot import Project Filter.     at Microsoft.SharePoint.WebPartPages.WebPartImporter.CreateWebPart(Boolean clearConnections)     at Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, Uri webPartPageUri, SPWeb spWeb)     at Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, SPWeb spWeb)     at Microsoft.SharePoint.WebPartPages.WebPartQuickAdd.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(...  
09/23/2008 14:13:03.67* w3wp.exe (0x1B5C)                           0x1534  Windows SharePoint Services     Web Parts                       89ku    High        ...String eventArgument)     

关键点是:

http%253A%252F%252Fuk64p12%252FPWA%252F%255Fcatalogs%252Fwp%252FProjectFilter%252Ewebpart;Project%2520Filter.
Exception Microsoft.SharePoint.WebPartPages.WebPartPageUserException: Cannot import Project Filter.
at Microsoft.SharePoint.WebPartPages.WebPartImporter.CreateWebPart(Boolean clearConnections)
at Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, Uri webPartPageUri, SPWeb spWeb)
at Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, SPWeb spWeb)
at Microsoft.SharePoint.WebPartPages.WebPartQuickAdd.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)

伴随着一个相当简洁的错误信息:"无法导入Web部件"。

我已经检查过,我的.dll文件已经被注册为安全文件,在GAC中,功能也已激活,并且Web部件显示在Web部件库中,所有正确的属性都表明Web部件文件已经成功读取。

一切似乎都准备就绪,但我仍然收到了这个错误,并且没有来自SharePoint的解决方法的详尽说明。

希望能得到任何有关解决方案的帮助。

11个回答

8

我已经理解了。

错误信息来自于 .webpart 文件:

<?xml version="1.0" encoding="utf-8"?>
<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <metaData>
      <!--
      The following Guid is used as a reference to the web part class, 
      and it will be automatically replaced with actual type name at deployment time.
      -->
      <type name="7F8C4D34-6311-4f22-87B4-A221FA8735BA" />
      <importErrorMessage>Cannot import Project Filter.</importErrorMessage>
    </metaData>
    <data>
      <properties>
        <property name="Title" type="string">Project Filter</property>
        <property name="Description" type="string">Provides a list of Projects that can be used to Filter other Web Parts.</property>
      </properties>
    </data>
  </webPart>
</webParts>

问题在于原始的 .webpart 文件是在安装了 WSS 的 Visual Studio 扩展程序的 32 位系统上创建的。
然而,由于我现在使用的是 64 位机器,因此 VSEWSS 不可用,我认为这导致上述 GUID 没有被替换,因为我没有使用那些部署工具。
将 GUID 替换为完整类型名称即可解决问题。
因此,如果您遇到来自 importErrorMessage 节点的错误消息,请检查 .webpart 文件中的 type 节点是否更像这个(不相关的示例)。
<type name="TitleWP.TitleWP, TitleWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" />

这是一个格式化的字符串: 类、命名空间、版本、区域设置、公钥

您可以轻松地从与您的SharePoint实例相关联的web.config文件中获取它,因为它将在安全控件列表中。


6
我们也遇到了同样的问题,发现我们Web Part的构造函数是由WebPartImporter调用的,在构造函数中我们使用了SPSecurity.RunWithElevatedPrivileges。
由于某种原因,WebPartImporter无法处理这个问题。所以,我们将代码从构造函数中移出到OnInit方法中(这才是它真正应该在的地方),现在一切都很好。

1
这个答案真是救命啊!我遇到了同样的问题,我给一个 Web 部件添加了 System.Net.WebPermission。我把 [System.Net.WebPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted = true)] 属性添加到整个类而不是需要权限的特定方法上。 - ngm

2

所有的建议都很好。我的问题是独特且愚蠢的:我已经将解决方案部署到了第一个Web应用程序,但没有部署到第二个Web应用程序。然而,SharePoint仍然允许我在第二个Web应用程序的网站集上激活功能(不确定为什么)。这意味着第二个Web应用程序在这个Web.config文件中没有安全控件条目(而我愚蠢地检查了第一个Web.config)。

因此,请仔细确认您正在查看正确的Web应用程序/Web.config文件。


1

我曾多次遇到这种异常,但没有找到好的解决方法。

请检查您的程序集、命名空间和类名称是否正确。这个问题曾经让我卡住过。

确保您有一个有效的SafeControls条目。

确保您的.webpart文件是有效的(如果可以,请让SharePoint为您创建它)。

如果您绝对确定一切都正确,那么您就陷入了我曾经遇到过的困境。唯一能想到的解决方法是VS编译程序集时出了问题。我找到的唯一解决方法是创建一个新的VS项目,并按照需要设置它,然后将旧的CS文件中的文本复制到新的CS文件中...不要复制文件本身...目标是让所有内容都是新鲜的。

这对我有用过。祝你好运。


1

现在我找到了一个类似的问题的答案:

当我尝试向页面添加新的 Web 部件时,SharePoint 显示错误消息,告诉我——无法导入我的 Web 部件,这个错误消息定义在 .webpart 文件中。

所以我尝试在页面上添加一些其他的 Web 部件,出现了一个奇怪的问题,其中一些可以添加,而另一些则不能添加。

经过我对我的 Web 部件代码进行跟踪和分析后,我找到了原因:

Web 部件 ProjectInfo(我的 Web 部件名称)的旧代码如下:

namespace ProjectInfo
....
 public class ProjectInfo:System.Web.UI.WebControls.WebParts.Web.part
 {
        .....
        private SPWeb _spWeb;
        private SPList _spList;
        private string _listName = "ProjectDocs";
        ......
 }
public ProjectInfo()
 {
        .....
            _spWeb = SPContext.Current.Web;
            //It show me a error here when i trace the code
            _spList = _spWeb.Lists[_listName]; 
        .....
 }

停止,我认为这可能是网页初始化顺序的问题。当网页加载网页部件控件时,构造函数ProjectInfo()将首先运行。实际上,在此时网页尚未完成初始化。

所以我进行了测试。首先,我在页面中放置了一个良好的网页,它可以正常工作。然后,我尝试将无法添加的网页部件放入页面中。好的!它正在工作……因为页面已经完成了初始化。

好的!我纠正了我的代码:

   namespace ProjectInfo
    ....
     public class ProjectInfo:System.Web.UI.WebControls.WebParts.Web.part
     {
            .....
            private SPWeb _spWeb;
            private SPList _spList;
            private string _listName = "ProjectDocs";
            ......
     }
    public ProjectInfo()
     {
            .....
                //Remove code in constructure function.
                //_spWeb = SPContext.Current.Web;
                //It show me a error here when i trace the code
                //_spList = _spWeb.Lists[_listName]; 
            .....
     }

   protected override void CreateChildControls()
        {
         ....
           base.CreateChildControls();

            _spWeb = SPContext.Current.Web;
            _spList = _spWeb.Lists[_listName];
          ....
         }

经过我的测试,错误信息再次没有出现了...哈哈~~

希望这个解释能够帮到你。


0
我发现我的项目第一次没有导入成功,但是如果我点击“新建”并添加它,它就会工作。
然后,我拿到了 XML 的副本并将其保存到我的项目中。之后,Web 部件工作得非常好。
我花了几天时间才达到这个地步,浪费了很多时间。

0

你是否已经回收了工作进程或重置了IIS?


我会尝试的。我之前没有做过。 - anonymous

0

在我的 Web 部件引用的 GAC 中的程序集签名与我预期的不同的强名称密钥文件时,我也遇到了这个错误。

当决定更新这些 DLL 时,我发现了这一点。将其插入 GAC 时,我注意到相同的 DLL 有两个条目,但它们具有不同的公钥令牌。


0

我遇到了一个非常类似的问题,但 Guid 并不是问题所在:我的 Web 部件没有将 CLSCompliannt 属性设置为 false。像这样:

namespace MyNamespace
{

    [CLSCompliant(false)]
    [Guid("...")]
    public class MyWidget : MyWebPartBaseClass
    {

    }
}

0

当我创建一个基类 Web 部件并从中继承一个派生类时,我遇到了这个错误。基类没问题,但是当我尝试将派生类添加到一个带有与原始帖子相同错误的 Web 页面时,派生类失败了。在我的情况下,我必须向该类添加一个public修饰符:

public class DerivedWebPart : BaseWebPart

此外,我在派生类中添加了一个构造函数来调用基类的构造函数 - 尽管我认为你实际上不需要这个:

    public DerivedWebPart() : base()
    {
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接