【发布时间】:2015-06-06 08:54:47
【问题描述】:
我正在使用 EWS 托管 API v2.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;
}
从一个永不返回的方法中,我们得到了第一个日志条目,但没有第二个,我们的性能监视器显示线程仍在服务调用的行处运行。
_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。
这个问题似乎是间歇性的。调用如何不导致响应、异常或超时?
【问题讨论】:
-
您是否检查过网络跟踪,例如 fiddler 或 wireshark 以查看呼叫是否正在发送到服务器?或者是否收到任何回复?
-
你的应用程序是多线程的吗?
-
@YacoubMassad 嗨,Yacoub。是的。虽然,我相信一次只有一个线程试图访问该服务。你在想什么?
-
@Simon,我以前也遇到过同样的问题。我的应用程序是多线程的。您是否在多个线程中使用相同的
ExchangeService实例?为了解决我的问题,我在没有托管 API 的情况下直接连接到 EWS。看看this。