SharePoint의 목록에 대한 SpitemeVentreceiver 어셈블리 버전을 업데이트하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/382535

  •  23-08-2019
  •  | 
  •  

문제

우리는 Spitemeventreceiver가 자체 어셈블리로 편집되어 있습니다.

우리는 STSDEV를 사용 하여이 eventReceiver를 사용하여 SharePoint 솔루션을 기능으로 패키지하고 있습니다. spitemeventreceiver를 elements.xml 내의 특정 listtemplateID에 할당하지 않고 feature.xml에서 수신기를 연결하고 spitemeventreceiver를 여러 개의 splist 항목에 할당하는 대신 링크를 연결하고 있습니다.

    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        foreach (SPWeb web in site.AllWebs)
        {
            SPListCollection webListCollection = web.Lists;

            foreach (SPList myList in webListCollection)
            {
                if (myList.Title == "Lab Reports")
                {
                    SPEventReceiverDefinitionCollection receivers = myList.EventReceivers;
                    SPEventReceiverDefinition receiver = receivers.Add();
                    receiver.Name = "PostUpdateLabReport";
                    receiver.Assembly = "LabReportEventHandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1111111111111";
                    receiver.Class = "LabReportEventHandlers.LabReportsHandler";
                    receiver.Type = SPEventReceiverType.ItemUpdated;
                    receiver.Update();
                    break;
                }
            }

            web.Dispose();
        }
    }

위의 코드의 반대를 수행하기 위해 FeatureDeactivating을 사용하여 목록에서 EventReceiver를 제거합니다.

의문:

LabReporteVenthandlers가 업데이트되고 버전이 변경되는 미래 이벤트를 어떻게 처리해야합니까?

이것들은 내가 생각할 수있는 옵션입니다.

  1. 기능 비활성화 / 재 활성화 기능 - 업데이트 된 DLL을 SharePoint 솔루션 파일로 다시 래핑하고 위의 코드를 변경하여 새 버전을 반영하고 Stsadmin을 사용하여 솔루션을 업그레이드합니다. 그런 다음 기능을 비활성화/ 재 활성화합니다.

  2. web.config에 어셈블리 리디렉션을 추가하십시오.

  3. LabReporteVenthandlers 버전 번호를 충돌시키지 마십시오.

솔루션 버전을 변경하는 데 도움이 될만한 것이 있습니까?

3 가지 옵션에 문제가 있다고 생각합니다.

  1. 이 기능을 비활성화 한 후 누군가가 반응하기 전에 항목을 업데이트 할 수 있습니다.

  2. Web.config를 수작업으로 편집하고 싶지 않으므로 SharePoint API를 대신 사용하겠습니다. 그 코드는 어디에서 실행합니까?

  3. 이것은 단지 명백하지만 쉽습니다.

도움이 되었습니까?

해결책

어쩌면 이벤트 핸들러가 참조하고 사용하는 별도의 어셈블리로 변경되기 쉬운 논리를 캡슐화 할 수 있습니다. 이런 식으로 이벤트 핸들러 자체는 변경 될 필요가 없으며 업데이트 된 "로직"어셈블리를 GAC 또는 빈 디렉토리 (IES)에만 적절하게 배포합니다.

HTH, JT

다른 팁

새 이벤트 핸들러를 이전 목록에 적용하거나 새 목록에 적용할지 여부에 관계없이 업그레이드로 원하는 것이 확실하지 않습니다.

새 목록 만 업그레이드하려면 어셈블리 정보를 별도의 파일에 넣을 수 있고 FeatureActivated 메소드의 해당 파일을 읽고 새 값을 적용 할 수 있습니다. 업그레이드 할 때 필요한 모든 작업은 별도의 구성 파일을 업데이트하는 것입니다. 새로운 활성화는 새 값과 버전 번호를 사용합니다.

이전 이벤트 처리기를 업그레이드 해야하는 경우 유사한 절차를 수행 할 수 있지만 이전 삭제하기 전에 새 기능 수신기를 추가 할 수 있습니다. 동일한 방법 으로이 작업을 수행하면 새 핸들러를 추가하는 것과 오래된 시간을 제거하는 것 사이의 시간은 최소화되며 정확한 시간에 항목을 추가 할 가능성은 0에 가깝습니다. 완전히 0으로 이동하려면 목록을 숨기거나 업그레이드가 진행 중인지 확인하여 업데이트가 중단되는지 확인하는 추가 항목 Upudated 이벤트 처리기가있을 수 있습니다.

간단히 말해서 : 새 목록의 경우 이전 목록의 외부 파일에서 어셈블리 구성을 읽으십시오. 이전 핸들러를 제거하기 직전에 업그레이드 된 어셈블리 정보를 추가하십시오.

.비

어셈블리의 (기존 및 신규) 버전이 실행될 필요가있는 경우에만 어셈블리 버전을 사용합니다. 나는 이벤트 수신기에서 이것을 필요로하지 않았다. 따라서 이벤트 수신기의 어셈블리 버전을 변경하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top