我做了一个视窗服务。
我有这个代码来连接到Exchange服务来阅读电子邮件,在我的本地计算机上它工作得很好,但我把它放在服务器上,它就不能工作了。
我安装了这个服务。
在服务中,我转到Login => This account选项卡,添加一个管理员帐户,然后启动服务。
public void ConnectToExchangeServer()
{
WriteToFile(DateTime.Now + " Connecting to Exchange Server..");
try
{
exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
exchange.Credentials = new NetworkCredential("username", "password", "na.empresa.com");
exchange.Url = new Uri("https://mail.empresa.com/EWS/Exchange.asmx");
exchange.PreAuthenticate = true;
exchange.TraceEnabled = true;
WriteToFile(DateTime.Now + " Connected to Exchange Server : " + exchange.Url.Host);
}
catch (Exception ex)
{
WriteToFile(DateTime.Now + " Error Connecting to Exchange Server!!" + ex.Message);
}
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
ConnectToExchangeServer();
try
{
SearchFilter.SearchFilterCollection findAllResult = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
WriteToFile(DateTime.Now + " Start read mail");
if (exchange != null)
{
FindItemsResults<Item> findResults = exchange.FindItems(WellKnownFolderName.Inbox, findAllResult, new ItemView(100));
WriteToFile(DateTime.Now + "Email qty " + findAllResult.Count);
if (findResults.TotalCount <= 0)
{
WriteToFile(DateTime.Now + " No new Emails found!!");
return;
}
foreach (Item item in findResults)
{
WriteToFile(DateTime.Now + " List Emails");
}
}
else
{
WriteToFile(DateTime.Now + "Object:ExchangeService is null -> " + exchange);
}
}
catch (Exception ex)
{
WriteToFile(DateTime.Now +" " +ex.ToString());
}
}
在日志中,我看到:
5/13/2021 1:13:24 PM Connecting to Exchange Server..
5/13/2021 1:13:24 PM Connected to Exchange Server : mail.empresa.com
5/13/2021 1:13:24 PM Start read mail
5/13/2021 1:13:44 PM Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Unable to connect to the remote server ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond xxx.xxx.xxx.xxx:443
at System.Net.Sockets.Socket.InternalEndConnect(IAsyncResult asyncResult)
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetWebRequestStream(IEwsHttpWebRequest request)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.TraceAndEmitRequest(IEwsHttpWebRequest request, Boolean needSignature, Boolean needTrace)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest()
--- End of inner exception stack trace ---
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest()
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems[TItem](IEnumerable`1 parentFolderIds, SearchFilter searchFilter, String queryString, ViewBase view, Grouping groupBy, ServiceErrorHandling errorHandlingMode)
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(FolderId parentFolderId, SearchFilter searchFilter, ViewBase view)
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(WellKnownFolderName parentFolderName, SearchFilter searchFilter, ViewBase view)
at ServiceIPS.Service1.OnElapsedTime(Object source, ElapsedEventArgs e)
你能找个人帮我纠正这个错误吗?
发布于 2021-05-14 09:56:34
我相信正因为如此
exchange是一个类字段。OnElapsedTime是计时器事件
每次执行
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
ConnectToExchangeServer();您将覆盖exchange。并且在exchange的新实例尚未连接时捕获exchange.FindItems,因为在前一个完成之前执行的下一个OnElapsedTime是并发执行的。
当您进入OnElapsedTime时,您可能应该暂停/暂停计时器。然后在退出此方法时重新启动/启用。
另一种选择是连接以在OnElapsedTime中声明exchange。但接下来你会遇到另一个问题。因为当您执行FindItems时,您将加倍处理您的项目。因此,最好的方法是确保在任何时候都只有一次OnElapsedTime执行。然后,您可能仍然希望在内部声明exchange。或者检查连接是否处于活动状态,以免连接次数过多。
https://stackoverflow.com/questions/67524733
复制相似问题