C# 我的流媒体订阅要去哪里?
我正在使用Microsoft Exchange Web Services 1.1 SDK并使用流连接订阅新邮件通知。所有这些都可以很好地接收通知,但我每隔一段时间就会收到关于我的Exchange无法找到我的订阅的错误 下面是我用来初始化订阅和使用的事件的代码C# 我的流媒体订阅要去哪里?,c#,exchangewebservices,exchange-server-2010,C#,Exchangewebservices,Exchange Server 2010,我正在使用Microsoft Exchange Web Services 1.1 SDK并使用流连接订阅新邮件通知。所有这些都可以很好地接收通知,但我每隔一段时间就会收到关于我的Exchange无法找到我的订阅的错误 下面是我用来初始化订阅和使用的事件的代码 public void Subscribe() { var locateMailbox = new Mailbox {
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-必须至少添加一个对此连接的订阅,然后才能将其打开。
这个异常本身就说明了问题,我知道我可以在Reconnect()
中创建另一个订阅。我希望有人能帮助我了解订阅的去向。我无法想象像Exchange 2010这样的产品会失去我的订阅。而且,我不能指出错误。有时我可以将订阅保持活动状态10分钟,而有时我会在2-3分钟后收到订阅无效的错误消息
值得一提的是,我使用的是Exchange 2010 SP1。从Reflector中的源代码来看,似乎只有两种方法可以删除订阅(除了处理
StreamingSubscriptionConnection
,还可以通过调用Remove(我假设您没有这样做),或者通过订阅返回除ServiceError.ErrorMissedNotificationEvents
以外的错误代码。您可以通过查看ResolveError中的errorEventArgs.Exception
来检查错误e> 处理程序。如果它是ServiceResponseException
的实例,则将其强制转换为该类型并获取ErrorCode
属性。在触发OnSubscriptionError
事件后,订阅将自动删除
获取错误代码可能有助于您追踪发生这种情况的原因,但即使您无法修复它,您也可以确定订阅何时将被删除,并在这种情况下异步添加另一个订阅。我知道很久以前就有人问过这一问题,但我想我会发布我如何避开错误的帖子(找不到任何解释它发生的原因的东西)。顺便说一下,也使用Office2010SP1
您可以使用发件人的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
}
}
我按照你的建议做了,我得到的错误代码是ErrorSubscriptionNotFound
。我不知道为什么,因为如果我深入查看sender
参数,我可以看到其中有一个订阅。错误代码是来自服务器的错误。当你深入查看并看到订阅仍然存在时,你就在cl上了客户端。是服务器找不到订阅。我猜服务器在大约一分钟后放弃了订阅,因为您只给了一分钟的超时时间。请尝试更长的超时时间,看看问题是否仍然存在。您为什么故意使用一分钟的超时时间?我将超时时间设置为一分钟,因为我得到了30分钟超时时出现同样的错误。我不想等待几组30分钟来查找错误,而是希望更快地看到错误。但现在我考虑到了这一点,我仍然应该进行防御性编码,以确保我始终保持活动订阅。你永远不知道服务器何时会出现故障。谢谢。看起来我必须等待6小时在奖励赏金之前。别担心。很高兴我能帮上忙。