SharePoint Web部件:无法找到/注册为安全的类型

11

我有一个SharePoint网页部件(基本上只是一个“Hello World”应用程序),我刚创建并且在部署时出现了问题。我已经签名了.dll文件,创建了.dwp文件,并在web.config中将其注册为安全控件。我能够将其添加到Web Part Gallery并添加详细信息;然而,当我尝试将其添加到页面时,我会得到以下错误:

此页面上的Web Part或Web表单控件无法显示或导入。未找到该类型或未将其注册为安全。

以下是我的.dwp文件:

<?xml version="1.0"?>
<WebPart xmlns="http://schemas.microsoft.com/WebPart/v2">
   <Assembly>SimpleWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=################</Assembly>
   <TypeName>MyWebParts.SimpleWebPart</TypeName>
   <Title>My Simple Web Part</Title>
   <Description>A simple Web Part</Description>
</WebPart>

以及我添加到 web.config 中的条目:

<SafeControl Assembly="SimpleWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=################" Namespace="MyWebParts" TypeName="*" Safe="True" />

我还尝试使用通配符来匹配命名空间,但这并没有帮助。我甚至尝试将web.config的信任级别设置为“完全”(在生产环境中我永远不会这样做,但试图缩小问题范围),但仍然没有运气。有什么想法吗?谢谢。


这可能是一个愚蠢的问题,但是你的文件中是否有实际的公钥令牌,而不是一堆哈希值?...它被称为“公共”的原因就在于此。 - Preston Guillot
这不是一个愚蠢的问题。我确实有实际的密钥放置在那些哈希值的位置上。 - Geo Ego
10个回答

33

有一种可能是类型名称与 .webpart 文件不同步。例如:

.webpart 文件中:

<?xml version="1.0" encoding="utf-8"?>
<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <metaData>
      <type name="Namespace.Class1, $SharePoint.Project.AssemblyFullName$" />

而在.cs文件中:

namespace Namespace
{
    public class Class2 : WebPart

SharePointProjectItem.spdata文件中:

  <SafeControl Assembly="Class2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9385058ce1ee51a9" Namespace="Namespace" TypeName="*" Safe="True" SafeAgainstScript="False" />

你可以这样理解:在所有项目相关的文档中三次核对名称的一致性。


1
对我来说,是在 Visual Web Part 下的 SharepointProjectItem.spdata 文件中包含了错误的命名空间。很容易忽略! - Rogier
1
我的 Web 部件最初被称为 VisualWebPart1。我已经重命名了它,但是 .webpart 的第 5 行(上面写着 Namespace.Class1)仍然引用了 VisualWebPart1。在文件中查找有所帮助(这个答案也有帮助)。 - John
当我尝试自定义命名空间以不包括 Web 部件名称时,我遇到了同样的问题。个人认为,命名空间不应包含类的名称,在 Microsoft 的其他地方也不是标准。同时需要更改 SharepointProjectItem.spdata 文件。建议将此标记为答案! - CigarDoug
这解决了我的问题;我最初犯了一个错误,将项目命名为“WeFormBla”,而不是“WebFormBla”,并且没有在所有地方进行更改。 - B. Clay Shannon-B. Crow Raven

4

你是否正在使用SharePoint解决方案(.wsp文件)部署您的WebPart?如果没有,请查看WSPBuilder。我们还使用SharePoint Installer。通过这两个工具,我们在部署中解决了许多问题(无论是人为错误还是其他原因),就像你遇到的问题一样。


我正在使用的SharePoint SmartTemplates利用了WSPBuilder和SharePoint Installer。它们是非常棒的工具,一下子就解决了我的问题。谢谢! - Geo Ego
由于有很多人都遇到了这个问题,我想提供一个SharePoint SmartTemplates的链接:http://smarttemplates.codeplex.com/Wikipage。它是一个非常棒的工具,利用了WSPBuilder和SP Installer的优势,使部署变得完全轻松和一致。 - Geo Ego

3

确保您的Web Part类为Public,听起来很傻,但我曾经遇到过这种情况。此外,请尝试从Web Part库中填充Web Part。


我已经仔细检查过,它使用的类确实是公共的。由于它是手动安装的,它已经显示在画廊中,我无法从“新网页部件”部分填充它。 - Geo Ego
不完全是我的问题,但足够接近让我朝正确的方向查找,谢谢! - Rob

3

当我为我的WebPart程序集更改了命名空间,并且解决方案中的所有源文件中的命名空间没有更新时,我也遇到了这个问题。


2

你尝试将它部署到全局程序集缓存(GAC)了吗?


我的第一个想法是 - DLL 在服务器上的哪里?本地 bin 目录还是 GAC? - Greg Hurlman
该.dll文件位于SharePoint服务器的bin目录中。我尝试将.dll文件安装到WINDOWS\assembly目录,虽然安装成功,但仍无法将控件添加到页面中。我在一个特定端口(非80端口)上使用SharePoint进行工作,并假设我可以将.dll文件安装到该端口对应的\bin\目录下,但无论如何都没有成功。 - Geo Ego
我不明白为什么我把.dll文件移动到WINDOWS\Assembly中后,在“新网页部件”部分没有看到它。它应该出现在列表中,这样我才能将其添加到我的网页部件库中,不是吗? - Geo Ego
我最终通过使用CodePlex提供的SharePoint SmartTemplates工具获得了成功。虽然我仍然想知道为什么我无法手动实现这一点,但现在我能够继续这个项目,所以我稍后会研究它。感谢大家的帮助。 - Geo Ego
Geo,我在这里回答了一个类似的问题: http://stackoverflow.com/questions/1754006/is-sharepoint-local-bin-deployment-possible/1757444#1757444 - IrishChieftain

1

当你将 Web 部件的名称从 VisualWebPart1 更改为 MyNewWebPart 时,通常会发生这种情况。在整个解决方案上执行搜索和替换后,将所有文件和文件夹的名称从 VisualWebPart1 更改为 MyNewWebPart。问题是由于文件 SharePointProjectItem.spdata 没有更新而引起的。打开 SharePointProjectItem.spdata 并将 VisualWebPart1 替换为 MyNewWebPart。这在大多数情况下可以解决问题。

打开解决方案中的每个文件,并验证是否存在对 VisualWebPart1 的引用。如果有,请手动更改为 MyNewWebPart。


1

好的,可能有点晚了,但对其他人也会有用。我创建了一个 WebPart 并出现了错误:“此页面上的 Web 部件或 Web 表单控件无法显示或导入。找不到该类型或未注册为安全。”

我发现我在这个 WebPart 中使用了图表,一旦我删除了图表的引用,它就可以工作了。因此,Chart 控件也必须标记为类型安全。

确保 WebPart 中的所有引用都是类型安全的。


0

Geo,

我已经有一段时间没有使用Web Parts了,但我在这里列出了步骤:

http://www.codersbarn.com/?tag=/webpart

也许那里有一些可以帮助你的东西。

安东尼 :-)


1
你在那篇文章中提出了一些有趣的观点,这些观点我之前还没有接触过,特别是一些可能会导致问题的web.config设置。感谢分享链接! - Geo Ego

0

如果您已经找到了解决方案,那太好了。但是这里有一个提示,供那些正在寻找更多信息的人使用。如果您添加了新的 Web 部件或可视化 Web 部件,并且只是在文件(如代码文件、Element.xml 或甚至 .webpart 文件)中替换命名空间,您可能仍然会遇到此问题。原因是,如上面某处所述,命名空间在 .spdata 文件中没有更改,这是 Visual Studio 自己创建的文件。为确保安全,请检查 inetroot 中的虚拟目录。如果命名空间仍然是旧的,请在解决方案中搜索并找出冲突的命名空间。很可能在 project.spdata 文件中,这是每个人都倾向于忽略的文件。


0
正如Tim Scarborough所提到的,如果更改了命名空间但没有更新所有源文件(因为这不是自动完成的),就会出现这种情况。仅以我的情况为例,问题在于WebPart类有一个新的命名空间a.b,但我忘记在WebPart文件中更新它:
<?xml version="1.0" encoding="utf-8"?>
<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
<metaData>
             //update below!
  <type name="a.b.yourClass, $SharePoint.Project.AssemblyFullName$" />

  <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>
</metaData>
<data>
 <properties>
    <property name="Title" type="string">your Title</property>
    <property name="Description" type="string">your Description</property>
  </properties>
</data>
 </webPart>
</webParts>

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