문제

SharePoint 내에 웹 디렉팅 이벤트 수신기를 등록하려고합니다. 이것은 내 개발 환경에서 잘 작동하지만 여러 준비 환경에서는 잘 작동하지 않습니다. 내가 다시 얻는 오류는 "값은 예상 범위에 속하지 않습니다."입니다. 다음은 내가 사용하는 코드입니다.

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite elevatedSite = new SPSite(web.Site.ID))
    {
        using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
        {
            try
            {
                elevatedWeb.AllowUnsafeUpdates = true;
                SPEventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
                eventReceiver.Type = SPEventReceiverType.WebDeleting;
                Type eventReceiverType = typeof(MyEventHandler);
                eventReceiver.Assembly = eventReceiverType.Assembly.FullName;
                eventReceiver.Class = eventReceiverType.FullName;
                eventReceiver.Update();
                elevatedWeb.AllowUnsafeUpdates = false;
            }
            catch (Exception ex)
            {
                // Do stuff...
            }
        }
    }
});

기능 요소 파일을 통해이 작업을 수행 할 수 있다는 것을 알고 있지만 (지금은 해당 접근법을 시도하고 있습니다) 위의 접근 방식을 선호합니다.

ULS 로그에서 일관되게 얻는 오류는 다음과 같습니다.

03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     Database                        6f8g    Unexpected  Unexpected query execution failure, error code 3621. Additional error information from SQL Server is included below. "The statement has been terminated." Query text (if available): "{?=call proc_InsertEventReceiver(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"  
03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     General                         8e2s    Medium      Unknown SPRequest error occurred. More information: 0x80070057   

어떤 아이디어?


업데이트 - 내가 배운 흥미로운 것들 ...

다음을 수행하도록 코드를 수정했습니다.

  • 내가 보는 대부분의 예에서는 안내없이 eventReceivers.add ()를 호출합니다.
  • 내가 보는 대부분의 예제 이후 이벤트 수신기에 이름과 시퀀스 번호를 제공했습니다.

ULS 로그로 이동하는 여분의 추적 진술과 함께이 변경 사항을 배치했으며 충분한 iisresets를 수행하고 조립의 GAC를 지우린 후 ULS 로그에서 새로운 트레이스 진술을보기 시작했습니다. 그리고 더 이상 오류가 없습니다!

그래서 나는 원래 코드로 돌아가서 어떤 변화가 정확히 도움이되었는지보기 시작했습니다. 나는 마침내 소스 컨트롤의 원본 버전으로 끝났고 여전히 작동했다 : -s.

따라서 대답은 그것이 캐싱 문제라는 것입니다. 그러나 원래 일을하려고 할 때 iisresets를 시도하여 일부 SharePoint 서비스 Owstimer를 다시 시작합니다 (이것은 이벤트 핸드러를 실행하지만 아마도 오류가 발생하는 이벤트 등록에 관여하지 않을 것입니다). 어셈블리 캐싱이 진행되지 않았는지 확인하기위한 재부팅조차도 이전에는 도움이되지 않았습니다.

내가 계속해야 할 유일한 것은 다음과 같은 단계를 따르는 것입니다.

  1. 등록 코드 및 이벤트 핸드 클래스가 포함 된 어셈블리의 GAC를 지우십시오.
  2. iisreset을하십시오.
  3. WSP를 제거하십시오.
  4. iisreset을하십시오.
  5. WSP를 설치하십시오.
  6. iisreset을하십시오.

작동하기 위해 SharePoint 서비스를 재부팅하거나 다시 시작한 적이 없지만 코드를 변경하기 전에 작동하기 전에 작업을 수행했습니다.

나는 내가 찾을 수있는 것을 볼 수있는 반사판으로 더 많이 파낼 수 있다고 생각하지만, 당신이 막 다른 골목 (관리되지 않는 코드)에 꽤 빨리 다가 갈 것이라고 생각합니다. 기존 DLL을 붙잡을 수있는 것이 궁금합니다. SQL Server가 어떤 식 으로든 상상할 수 없습니다. 그럼에도 불구하고 재부팅은 (SQL Server를 포함한 전체 농장 이이 환경에서 동일한 기계에 있습니다) 고정되었을 것입니다.

도움이 되었습니까?

해결책

따라서 전체 문제는 Guid를 제공하여 이벤트 수신기를 생성하는 것으로 보입니다.

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));

이제 나는하고있다 :

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

불행히도 이것은 이벤트가 이미 등록되어 있는지 확인하고 싶을 때 하나의 라이너 대신 아래 코드와 같은 작업을 수행해야합니다.

// Had to use the below instead of: web.EventReceivers[new Guid(MyEventReceiverId)]
private SPEventReceiverDefinition GetWebDeletingEventReceiver(SPWeb web)
{
    Type eventReceiverType = typeof(MyEventHandler);
    string eventReceiverAssembly = eventReceiverType.Assembly.FullName;
    string eventReceiverClass = eventReceiverType.FullName;

    SPEventReceiverDefinition eventReceiver = null;

    foreach (SPEventReceiverDefinition eventReceiverIter in web.EventReceivers)
    {
        if (eventReceiverIter.Type == SPEventReceiverType.WebDeleting)
        {
            if (eventReceiverIter.Assembly == eventReceiverAssembly && eventReceiverIter.Class == eventReceiverClass)
            {
                eventReceiver = eventReceiverIter;
                break;
            }
        }
    }

    return eventReceiver;
}

왜 상황이 남아있는 것처럼 보이고 청소가 필요한지는 아직 명확하지 않으므로 (IISRESET, 재부팅 등) 다른 사람 이이 문제가있는 경우이를 명심하십시오.

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