自定义 Web 部件部署产生“无法导入此 Web 部件”错误

Posted

技术标签:

【中文标题】自定义 Web 部件部署产生“无法导入此 Web 部件”错误【英文标题】:Custom web part deployment produces 'Cannot import this webpart' error 【发布时间】:2011-08-22 12:14:28 【问题描述】:

我在 Visual Studio 2010 中构建了一个空的 SharePoint 项目,其中包含一些自定义 Web 部件。当我在我的本地开发机器上测试它们时,它们可以毫无问题地添加到页面中。

当我通过 PowerShell 将 wsp 部署到远程 SharePoint 服务器时,Web 部件会显示在 Web 部件库中,但向页面添加一个会导致错误“无法导入此 Web 部件”。日志中没有进一步的信息。根据我通过谷歌找到的一些答案,我检查了 Init 中没有代码。所有初始处理都是在 CreateChildControls 中完成的(虽然我想如果这是原因,我会在本地机器上得到同样的错误)。

我最初在https://sharepoint.stackexchange.com/questions/11820/custom-web-part-deployment-produces-cannot-import-this-webpart-error 提出了这个问题。根据我收到的建议,我决定创建一个新项目,其中我只完成了最少的编码。

新项目只有一个简单的标签 Web 部件。 Web 部件的代码是

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace TestWebParts.TestHelloWorld

    [ToolboxItemAttribute(false)]
    public class TestHelloWorld : WebPart
    
        protected override void CreateChildControls()
        
            Label lblThis = new Label();
            lblThis.Text = "Testing web part";
            Controls.Add(lblThis);
        
    

项目中的.webpart文件是

<?xml version="1.0" encoding="utf-8"?>
<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <metaData>
      <type name="TestWebParts.TestHelloWorld.TestHelloWorld, $SharePoint.Project.AssemblyFullName$" />
      <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>
    </metaData>
    <data>
      <properties>
        <property name="Title" type="string">TestHelloWorld</property>
        <property name="Description" type="string">My WebPart</property>
      </properties>
    </data>
  </webPart>
</webParts>

我已检查是否已添加安全控制条目。我已将 CAS 策略添加到项目中(因为这些策略将部署到 bin 而不是 GAC)。包清单如下所示

<?xml version="1.0" encoding="utf-8"?>
<Solution xmlns="http://schemas.microsoft.com/sharepoint/">
  <CodeAccessSecurity>
    <PolicyItem>
      <PermissionSet class="NamedPermissionSet" version="1" Description="Permission set for ECB">
        <IPermission class="AspNetHostingPermission" version="1" Level="Minimal" />
        <IPermission class="SecurityPermission" version="1" Flags="Execution,ControlPrincipal,ControlAppDomain,ControlDomainPolicy,ControlEvidence,ControlThread" />
        <IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
    version="1" ObjectModel="True" />
        <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Read="UserName" />
        <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" PathDiscovery="*AllFiles*" />
        <IPermission class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" PathDiscovery="*AllFiles*" />
      </PermissionSet>
      <Assemblies>
        <Assembly Name="$SharePoint.Project.AssemblyName$" Vers7ion="$SharePoint.Project.AssemblyVersion$" PublicKeyBlob="$SharePoint.Project.AssemblyPublicKeyBlob$"/>
      </Assemblies>
    </PolicyItem>
  </CodeAccessSecurity>
</Solution>

.wsp 在我试图让它运行的开发机器上安装得很好。当我尝试在 Web 部件库中查看 Web 部件时,我收到消息“无法导入此 Web 部件”,如上所示。我已经确认 .dll 在 bin 目录中。 web.config 文件包含此条目

          <SafeControl Assembly="TestWebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8d63a878e7c304c2" Namespace="TestWebParts.TestHelloWorld" TypeName="*" Safe="True" SafeAgainstScript="True" />

当我从 Web 部件库中查看 webpart xml 时,我看到了

<?xml version="1.0" encoding="utf-8"?>
<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <metaData>
      <type name="TestWebParts.TestHelloWorld.TestHelloWorld, TestWebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8d63a878e7c304c2" />
      <importErrorMessage>Cannot import this Web Part.</importErrorMessage>
    </metaData>
    <data>
      <properties>
        <property name="Title" type="string">TestHelloWorld</property>
        <property name="Description" type="string">My WebPart</property>
      </properties>
    </data>
  </webPart>
</webParts>

当我部署到开发机器时,是否有人对可能导致问题的原因有任何想法?我唯一能想到的另一件事是我的本地机器是 Windows 7,而开发机器是 Windows Server 2008。两者都在运行 SharePoint Foundation

【问题讨论】:

【参考方案1】:

它找不到 Web 部件中引用的程序集。您看到的错误实际上是这行代码的等价物。

无法导入此 Web 部件。

您需要做的是验证 .webpart 定义文件中的完整类和程序集引用名称并进行相应更新。

不幸的是,我不能告诉你它应该是什么,因为你的项目定义可能会输出与你的类定​​义不同的信息的程序集。

【讨论】:

如果这是问题所在 - 我在部署到本地计算机时不会看到同样的错误吗?我已经使用相同的 Powershell 脚本在本地部署没有任何问题... 呸,它打断了我。有几件事需要检查。 1. 检查程序集是否已加载到 GAC 或关联的 web bin 文件夹中。如果没有,请检查您生成的解决方案 .wsp 是否实际包含程序集。 2. 如果您在 gac 中看到程序集并且仍然看到此问题,请尝试将 web.config 信任级别更新为完全 如果选项 2 有效,那么您的程序集缺少信任条目和/或您的程序集中的引用。还要确保在部署后始终重新启动 IIS 1.是的,它肯定在 bin 目录 2 中。仍然收到无法导入 web 部件错误并设置了完全信任。 您是否进行了 IIS 重置?另一种选择是使用 .net 反射器来验证类命名空间和程序集名称 我有并且我也检查过Reflector。程序集名称、命名空间、版本等都匹配。

以上是关于自定义 Web 部件部署产生“无法导入此 Web 部件”错误的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 Web 部件部署到 SharePoint 2013

如何将自定义 WebPartPage 部署到特定目标站点 (Web)

摘要链接 Web 部件与 SharePoint 2007/2010 中的自定义 Web 部件冲突

使用 Web 服务保存共享点自定义 Web 部件时格式正确的 XML 错误

Sharepoint 自定义文本 Web 部件属性

Sharepoint 自定义筛选器 Web 部件