La implementación de elementos web personalizados produce el error "No se puede importar este elemento web"

He creado un proyecto de SharePoint vacío en Visual Studio 2010 con algunos elementos web personalizados. Cuando los probé en mi máquina de desarrollo local, se pueden agregar a una página sin ningún problema.

Cuando implemento el wsp a través de PowerShell en un servidor de SharePoint remoto, los elementos web se muestran en la galería de elementos web, pero al agregar uno a una página aparece el error "No se puede importar este elemento web". Los registros no contienen más información. Según algunas respuestas que encontré a través de Google, verifiqué que no hay código en Init. Todo el procesamiento inicial se realiza dentro de CreateChildControls (aunque habría pensado que si esta fuera la causa, obtendría el mismo error en mi máquina local).

Originalmente hice esta pregunta en https://sharepoint.stackexchange.com/questions/11820/custom-web-part-deployment-produces-cannot-import-this-webpart-error. A partir de las sugerencias que recibí, decidí crear un proyecto nuevo en el que había realizado una codificación mínima.

El nuevo proyecto tiene solo un elemento web de etiqueta simple. El código del elemento web es

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);
        }
    }
}

El archivo .webpart del proyecto es

<?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>

He comprobado que se ha añadido una entrada de control segura. He agregado políticas CAS al proyecto (ya que se implementarán en el contenedor en lugar de en el GAC). El manifiesto del paquete se ve así

<?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>

El .wsp se instala bien en la máquina de desarrollo en la que estoy tratando de ejecutarlo. Cuando intento ver el elemento web en la Galería de elementos web, aparece el mensaje "No se puede importar este elemento web", como se muestra arriba. Confirmé que el .dll está en el directorio bin. El archivo web.config contiene esta entrada

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

Cuando veo el xml del elemento web desde la Galería de elementos web, veo

<?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>

¿Alguien tiene alguna idea sobre qué podría estar causando el problema cuando lo implemento en la máquina de desarrollo? La única otra cosa que se me ocurre es que mi máquina local es Windows 7 y la máquina de desarrollo es Windows Server 2008. Ambos ejecutan SharePoint Foundation

preguntado el 10 de mayo de 11 a las 13:05

1 Respuestas

No puede encontrar el ensamblado al que se hace referencia en el elemento web. El error que está viendo es en realidad el equivalente de esta línea de código.

No se puede importar este elemento web.

Lo que debe hacer es verificar la clase completa y los nombres de referencia de ensamblado en su archivo de definición .webpart y actualizar en consecuencia.

Desafortunadamente, no puedo decirle cuál debería ser exactamente porque la definición de su proyecto puede generar el ensamblado con información diferente a la definición de su clase.

contestado el 10 de mayo de 11 a las 18:05

Si este fuera el problema, ¿no vería el mismo error cuando implemento en mi máquina local? He usado el mismo script de Powershell para implementarlo localmente sin ningún problema ... - grimorde

bah, me cortó. Hay que comprobar un par de cosas. 1. Verifique que el ensamblaje esté cargado en el GAC o en la carpeta bin web asociada. De lo contrario, compruebe que su solución generada .wsp realmente contiene el ensamblado. 2. Si ve el ensamblado en el gac y sigue viendo este problema, intente actualizar el nivel de confianza de web.config al máximo Si la opción 2 funciona, entonces faltan entradas de confianza para su ensamblado y / o referencias en sus ensamblajes. También asegúrese de reiniciar siempre IIS después de la implementación: Brian Brinley

1. Sí, definitivamente está en el directorio bin. 2. Aún aparece el error de no se puede importar el elemento web con la confianza total configurada. - grimorde

¿Ha realizado un reinicio de IIS? También otra opción es usar el reflector .net para verificar el espacio de nombres de la clase y el nombre del ensamblado: Brian Brinley

Lo he hecho y también lo he comprobado con Reflector. El nombre del ensamblado, el espacio de nombres, la versión, etc., coinciden. - grimorde

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.