2015-04-01 53 views
10

我正在使用EWS托管API v2.2来进行EWS呼叫。最近,在我的一位客户中,我们遇到了一个奇怪的情况,即服务调用,任何服务调用都不会收到响应。使用托管API 2.2的EWS呼叫永不返回

我们正在设置一个显式超时,周围有日志记录的服务调用,并且正在使用EWS跟踪监听。监听器显示EWSRequest SOAP消息,就是这样。日志记录显示“服务前电话”日志条目,但不显示“服务后电话”条目。

我怀疑节流可能是其背后并暂时移除了EWS节流限制没有影响,并且在任何情况下,我会期待一个错误的反应,如果限制在踢。

这是服务如何初始化:

public ExchangeWebService(string username, string password, string emailAddress, string exchangeUrl, string exchangeVersion) 
{ 
    ExchangeVersion exVersion = (ExchangeVersion)Enum.Parse(typeof(ExchangeVersion), exchangeVersion); 
    _exchangeService = CreateExchangeService(username, password, emailAddress, exchangeUrl, exVersion); 
    _exchangeService.Timeout = 30000;   
} 

private static ExchangeService CreateExchangeService(string username, string password, string emailAddress, 
                  string exchangeUrl, ExchangeVersion exchangeVersion) 
{ 

    IntegrationLogging _il = new IntegrationLogging(Constants.LoggingSourceName); 

    ExchangeService service = new ExchangeService(exchangeVersion); 
      QualifiedUserName qualifiedName = new QualifiedUserName(username); 
    NetworkCredential credentials = new NetworkCredential(qualifiedName.UserName, password); 

    if (qualifiedName.HasDomain) 
    { 
     credentials.Domain = qualifiedName.Domain; 
    } 

    service.Credentials = credentials; 

    if (string.IsNullOrEmpty(exchangeUrl)) 
    { 
     if (string.IsNullOrEmpty(emailAddress)) 
     { 
      throw new ArgumentException("emailAddress and exchangeUrl parameters cannot both be empty"); 
     } 
     else 
     { 
      _il.WriteTrace(string.Format("CreateExchangeService using auto discovery with email address {0} and user name {1}. {2}", emailAddress, username, Environment.StackTrace)); 
      service.AutodiscoverUrl(emailAddress); 
     } 
    } 
    else 
    { 
     _il.WriteTrace(string.Format("CreateExchangeService using EWS URI {0} and user name {1}", exchangeUrl, username)); 
     service.Url = new Uri(exchangeUrl); 
    } 

    return service; 
} 

从从不返回的方法之一,我们得到的第一个日志条目,但不是第二,我们的PERF监视器的显示螺纹仍处于服务电话线运行。

_il.WriteTrace("ConvertInternalIdToEwsId:mailboxAddress=" + mailboxAddress); 

AlternateIdBase _altBase = _exchangeService.ConvertId(_alternateId, IdFormat.EwsId); 

_il.WriteTrace("ConvertInternalIdToEwsId:Returned from call"); 

return ((AlternateId)_altBase).UniqueId; 

该服务实例的类型为Microsoft.Exchange.WebServices.Data.ExchangeService

这个问题似乎是间歇性的。如何调用不会导致响应,异常或超时?

+2

您是否检查过网络跟踪,例如fiddler或wireshark以查看呼叫是否正在发送到服务器?或者如果有任何回应正在收到? – tjleigh 2015-04-18 23:06:56

+0

你的应用程序是多线程的吗? – 2015-10-19 11:58:52

+0

@YacoubMassad嗨Yacoub。是的。虽然,我相信一次只有一个线程试图访问服务。你在想什么? – Simon 2015-10-21 13:18:07

回答

0

嘿,我会仔细检查,当我在办公室......但也有类似的问题...

对我来说,它最终回归,不得不离开它相当一段时间。

我把我的包裹在try/catch中,并在catch上放了一个断点。

不记得了,但我认为这是在我使用错误的自动发现电子邮件地址时发生的。

try 
{ 
    service.AutodiscoverUrl(emailAddress); 
} 
catch (Exception) 
{ //break point here and leave for at least 10 min 
    throw; 
}