2011-05-06 4 views
6

저는 Microsoft Exchange Web Services 1.1 SDK를 사용하고 스트리밍 연결을 사용하여 새 메일 알림을 신청합니다. 모든 알림이 정상적으로 수신되지만 Exchange에서 내 구독 정보를 찾을 수 없다는 오류가 발생합니다.내 스트리밍 구독은 어디로 가고 있습니까?

다음은 내가 구독 및 이벤트를 초기화하는 데 사용하는 코드입니다.

public void Subscribe() 
{ 
    var locateMailbox = new Mailbox 
          { 
           Address = "myemail" 
          }; 
    var folderId = new FolderId(WellKnownFolderName.Inbox, locateMailbox); 
    var foldersToWatch = new[] {folderId}; 
    StreamingSubscription streamingSubscription = 
     _exchangeService.SubscribeToStreamingNotifications(foldersToWatch, EventType.NewMail); 
    // Timeout is set at 1 minute intentionally 
    var streamingConnection = new StreamingSubscriptionConnection(_exchangeService, 1); 

    streamingConnection.AddSubscription(streamingSubscription); 

    streamingConnection.OnSubscriptionError += ResolveError; 
    streamingConnection.OnDisconnect += Reconnect; 

    streamingConnection.Open(); 
} 

public void Reconnect(object sender, SubscriptionErrorEventArgs disconnectEventArgs) 
{ 
    if (!((StreamingSubscriptionConnection)sender).IsOpen) 
     ((StreamingSubscriptionConnection)sender).Open(); 
} 

public void ResolveError(object sender, SubscriptionErrorEventArgs errorEventArgs) 
{ 
    var streamingSubscriptionConnection = 
     (StreamingSubscriptionConnection) sender; 
    if (!streamingSubscriptionConnection.IsOpen) 
     streamingSubscriptionConnection.Open(); 
} 

ServiceLocalException - You must add at least one subscription to this connection before it can be opened.

그 예외는 명백해 나는 단순히 Reconnect()의 안에 다른 구독을 만들 수 있다는 것을 알고 있어요. 누군가가 구독이 어디로 가고 있는지 이해할 수 있기를 바랍니다. 나는 Exchange 2010과 같은 제품이 단순히 가입을 잃어 버릴 것이라고 상상할 수 없습니다. 또한, 나는 그 오류를 지적 할 수 없다. 때로는 10 분 동안 구독을 활성 상태로 유지할 수 있으며 다른 경우 2-3 분 후에 구독이 유효하지 않은 오류가 나타납니다.

나는 가치가있어 Exchange 2010 SP1을 사용하고 있습니다.

답변

7

Reflector의 출처를 보면, 구독을 제거 할 수있는 유일한 두 가지 방법처럼 보입니다. (StreamingSubscriptionConnection을 삭제하는 것 외에, 내가하지 않는다고 가정하는 Remove, 또는 이외의 오류 코드 ResolveError 처리기에서 errorEventArgs.Exception을 확인하여 오류를 검사 할 수 있습니다 .의 인스턴스 인 경우 해당 유형으로 캐스팅하고 ErrorCode 속성을 가져 오세요. OnSubscriptionError 이벤트를 시작한 후 구독 항목은 자동으로 제거됩니다.

오류 코드가 표시되는 이유를 추적하는 데 도움이 될 수 있지만 문제를 해결할 수 없어도 det 구독이 제거 될 때 결정하고이 경우 다른 구독을 비동기 적으로 추가하십시오.

+0

내가 제안한대로 했으므로 오류 코드는 'ErrorSubscriptionNotFound'입니다. 왜 나는'sender' 인수를 자세히 조사해 보면 거기에 구독이 있다는 것을 알 수 있기 때문에 확실하지 않습니다. – Mike

+1

오류 코드는 서버에서 온 오류입니다. 드릴 다운하여 구독이 계속 유지되면 클라이언트에 있습니다. 구독을 찾을 수없는 서버입니다. 내 생각 엔 1 분 정도만 타임 아웃을했기 때문에 1 분 정도 지나면 서버가 구독을 취소합니다. 더 긴 시간 초과를 시도하고 문제가 여전히 발생하는지 확인하십시오. 어째서 의도적으로 1 분 타임 아웃을 사용한 이유가 무엇입니까? –

+0

30 분 제한 시간과 동일한 오류가 발생하여 제한 시간을 1 분으로 설정했습니다. 오류를 찾기 위해 30 분 동안 여러 세트를 기다리는 대신 오류를 더 빨리보고 싶었습니다. 하지만 이제는 항상 적극적인 구독을 유지하면서 방어해야한다고 생각합니다. 서버에 딸꾹질이 언제 생길지 결코 알 수 없습니다. 고맙습니다. – Mike

1

오래 전이 질문을 받았지만 오류가 발생하는 방법을 게시하는 방법을 알았습니다. 또한 사무실 2010 sp1을 사용합니다.

보낸 사람의 Count() 메서드를 사용하여 구독이 있는지 확인할 수 있습니다.

private static void onDisconnect(object sender, SubscriptionErrorEventArgs args) 
    { 

     StreamingSubscriptionConnection renew = (StreamingSubscriptionConnection)sender; 
     if(renew.CurrentSubscriptions.Count() > 0){ //if subscription exists reopen as normal 
      renew.Open(); 
     } 
     else 
     { 
      //recreate the whole connection 
     } 
    } 
관련 문제