Вопрос

У меня есть набор приемников событий для типа содержимого и библиотеки контента SharePoint 2010. Ранее они будут установлены и автоматически активировать, когда я запустил скрипт для установки решения WSP. Однако я выкопал другой способ сделать это, однако, и теперь они будут устанавливать соответствующим образом при запуске решения в режиме отладки в Visual Studio, но они не будут установлены при запуске скрипта stearmented Power Shell. Я проверил сайт и убедился, что функция была активирована, но после того, как я до сих пор не видел приемники событий с помощью SPM.

Я следовал руководству из эта страница

Приемник событий Elements.xml:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="101">
    <Receiver>
      <Name>EventReceiverItemCheckedIn</Name>
      <Type>ItemCheckedIn</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>SharePointFeatures.EventReceiver.EventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>EventReceiverItemCheckingIn</Name>
      <Type>ItemCheckingIn</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>SharePointFeatures.EventReceiver.EventReceiver</Class>
      <SequenceNumber>1001</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>EventReceiverItemUpdated</Name>
      <Type>ItemUpdated</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>SharePointFeatures.EventReceiver.EventReceiver</Class>
      <SequenceNumber>1002</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>EventReceiverItemUpdating</Name>
      <Type>ItemUpdating</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>harePointFeatures.EventReceiver.EventReceiver</Class>
      <SequenceNumber>1003</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>EventReceiverItemDeleting</Name>
      <Type>ItemDeleting</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>SharePointFeatures.EventReceiver.EventReceiver</Class>
      <SequenceNumber>1004</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>
.

Функция Template.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
  <Properties>
    <Property Key="GloballyAvailable" Value="true"/>
    <Property Key="AssemblyQualifiedName" Value="$SharePoint.Type.800d2e40-4c00-4517-9ff4-d11da11b6826.AssemblyQualifiedName$"/>
    <Property Key="AssemblyFullName" Value="$SharePoint.Project.AssemblyFullName$"/>
  </Properties>
</Feature>
.

Ресиверный код функции:

[Guid("fbe26e13-dba2-4fe6-b947-9f2c34accd39")]
public class FeaturesEventReceiver : SPFeatureReceiver
{
    private string EventReceiverClassName;
    private string AssemblyFullName;
    /// <summary>
    /// Feature activated logic
    /// </summary>
    /// <param name="properties"></param>
    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {

        try
        {
            SPWeb web = properties.Feature.Parent as SPWeb;

            //di-associate EventReceiver from Print only content type
            SetAssemblyParams(properties.Feature.Properties);
            DisableEventReceiver(web);


            //associate EventReceiver to content type as defined in configuration <activefields sharepointcontenttypename="Print Only"> 
                FmiMetadataMappingHandler mappingHandler = WebConfigurationManager.OpenWebConfiguration("/", web.Site.WebApplication.Name).GetSection(Utils.GetConfigSectionNameForWeb(web)) as FmiMetadataMappingHandler;
                SPContentType ct = web.ContentTypes[mappingHandler.ActiveFields.SharepointContentTypeName];

                if (ct != null)
                {
                    SPEventReceiverDefinition def = ct.EventReceivers.Add();
                    def.Name = "EventReceiverItemCheckingIn";
                    def.Type = SPEventReceiverType.ItemCheckingIn;
                    def.SequenceNumber = 1000;
                    def.Assembly = AssemblyFullName;
                    def.Class = EventReceiverClassName;
                    def.Update();

                    // bind event receiver to ItemCheckedIn Event                                      
                    def = ct.EventReceivers.Add();
                    def.Name = "EventReceiverItemCheckedIn";
                    def.Type = SPEventReceiverType.ItemCheckedIn;
                    def.SequenceNumber = 1001;
                    def.Assembly = AssemblyFullName;
                    def.Class = EventReceiverClassName;
                    def.Update();

                    // bind event receiver to ItemUpdated Event                                      
                    def = ct.EventReceivers.Add();
                    def.Name = "EventReceiverItemUpdated";
                    def.Type = SPEventReceiverType.ItemUpdated;
                    def.SequenceNumber = 1002;
                    def.Assembly = AssemblyFullName;
                    def.Class = EventReceiverClassName;
                    def.Update();

                    // bind event receiver to ItemUpdating Event                                      
                    def = ct.EventReceivers.Add();
                    def.Name = "EventReceiverItemUpdating";
                    def.Type = SPEventReceiverType.ItemUpdating;
                    def.SequenceNumber = 1003;
                    def.Assembly = AssemblyFullName;
                    def.Class = EventReceiverClassName;
                    def.Update();

                    // bind event receiver to ItemDeleting Event                                      
                    def = ct.EventReceivers.Add();
                    def.Name = "CWTEventReceiverItemDeleting";
                    def.Type = SPEventReceiverType.ItemDeleting;
                    def.SequenceNumber = 1004;
                    def.Assembly = AssemblyFullName;
                    def.Class = EventReceiverClassName;
                    def.Update();
                    //update content type with event receiver
                    ct.Update(true);

                    Utils.LogMessage("CWT Feature Event Receivers added successfully.");
                }

        }
        catch (Exception ex)
        {
            Utils.LogError(ex.Message, ex.StackTrace);
        }

    }

    private void SetAssemblyParams(SPFeaturePropertyCollection properties)
    {
        EventReceiverClassName = properties["AssemblyQualifiedName"].Value;
        AssemblyFullName = properties["AssemblyFullName"].Value;
    }// end SetAssemblyParams

    /// <summary>
    /// feature deactivating
    /// </summary>
    /// <param name="properties"></param>
    public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
    {
        SetAssemblyParams(properties.Feature.Properties);
        DisableEventReceiver(properties.Feature.Parent as SPWeb);
    }

    /// <summary>
    ///  di-associate event receiver from content type
    /// </summary>
    /// <param name="web"></param>
    private void DisableEventReceiver(SPWeb web)
    {
        try
        {
            FmiMetadataMappingHandler mappingHandler = WebConfigurationManager.OpenWebConfiguration("/", web.Site.WebApplication.Name).GetSection(Utils.GetConfigSectionNameForWeb(web)) as FmiMetadataMappingHandler;
            SPContentType ct = web.ContentTypes[mappingHandler.ActiveFields.SharepointContentTypeName];
            string errMsg = string.Empty;
            if (ct == null)
            {
                errMsg = string.Format("{0} has not been created in web {1} ", mappingHandler.ActiveFields.SharepointContentTypeName, web.Title);
                Utils.LogError(errMsg);
                throw new Exception(errMsg);

            }
            if (ct != null)
            {
                SPEventReceiverDefinition[] fmiEvents = new SPEventReceiverDefinition[ct.EventReceivers.Count];
                ct.EventReceivers.CopyTo(fmiEvents, 0);

                for (int i = 0; i < fmiEvents.Length; i++)
                {
                    if (fmiEvents[i].Class.Equals(EventReceiverClassName, StringComparison.CurrentCultureIgnoreCase))
                    {
                        fmiEvents[i].Delete();
                        Utils.LogError("cwt receiver removed");
                    }
                }


                ct.Update(true);
              //  web.Update();

            }
        }
        catch (Exception ex)
        {
            Utils.LogError(ex.Message);
        }
    }
.

* Обновление *

Итак, теперь он не будет установлен вообще, даже в режиме отладки. Я посмотрел в журналы, и функция генерирует ошибку во время «FEUREACTIVED» части установки. Я прокомментировал весь код в FeatureActived и все, кроме попытки / пойма в FeatureceActiveActive, и он все еще бросает эту ошибку.

Сообщение об ошибке: Type names passed to Assembly.GetType() must not specify an assembly.

Это было полезно?

Решение

I am still not sure what the problem was, but I made it go away. Maybe this is the real solution I was looking for, I do not know. At any rate, I went through the motions commenting out all of my code except for the actual event handler methods themselves. I then tried running the solution in debug mode. No dice. At that point I basically knew it couldn't have been anything I was really doing (it could have but I "knew" it). So, on a hunch, I rebuilt the solution and packaged it, THEN ran it in debug mode. Voila. I then systematically re-added the various code pieces starting with the feature receiver code and everything has been deploying since. I do, however, continue to package first to prevent my original issue from happening again. I am not sure that's absolutely necessary but it's easier than running into that same problem again.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top