Asp.net 多用户EWS通知中心
我正在尝试创建一个服务,将exchange通知推送到asp.net应用程序,最终使用SignalR 我的计划是创建一个通知中心,在每个用户登录到asp应用程序时为其订阅通知,并侦听通知。收到通知后,项目的第二部分将使用signalR仅向每个用户发送正确的通知。一旦他们注销或超时,通知中心将取消他们的订阅 到目前为止,我已经做了一些基本的测试,可以在一个小控制台应用程序中接收通知,并对我的凭证进行硬编码。我正在努力解决的是如何同时为多个人做这件事。例如,我必须为每个用户创建单独的线程,还是有更好的方法 我想不管怎样,我将不得不使用模拟,而不是持有每个用户的凭据,对吗?如果每个用户都有一个活动会话,我还必须找到一种自动刷新超时的方法 下面是我发现并一直在使用的一段代码,如果有人能分享我如何最好地实现这一点的想法或示例,我将不胜感激 非常感谢 安迪Asp.net 多用户EWS通知中心,asp.net,exchange-server,exchangewebservices,signalr-hub,Asp.net,Exchange Server,Exchangewebservices,Signalr Hub,我正在尝试创建一个服务,将exchange通知推送到asp.net应用程序,最终使用SignalR 我的计划是创建一个通知中心,在每个用户登录到asp应用程序时为其订阅通知,并侦听通知。收到通知后,项目的第二部分将使用signalR仅向每个用户发送正确的通知。一旦他们注销或超时,通知中心将取消他们的订阅 到目前为止,我已经做了一些基本的测试,可以在一个小控制台应用程序中接收通知,并对我的凭证进行硬编码。我正在努力解决的是如何同时为多个人做这件事。例如,我必须为每个用户创建单独的线程,还是有更好的
我解决这个问题的方法是:
/// <summary>
/// Impersonate one user at a time and without using the autodiscovery method to find the proper url for the userSmtp,
/// and copy the provided url to the usersmtp.
/// </summary>
/// <param name="url"> </param>
/// <param name="userSmtp">user smtp</param>
/// <param name="enableTrace">to enable logging from the XML tracing </param>
/// <param name="exchangeVersion">Exchange server version used</param>
private Uri ImpersonateUser(Uri url, string userSmtp, bool enableTrace, ExchangeVersion exchangeVersion)
{
Uri result = url;
var log = "ImpersonateUser \n";
try
{
log += "0/8 Checking services redundancy\n";
if (Services.ContainsKey(userSmtp))
{
Services.Remove(userSmtp);
}
log += "1/8 Create a new service for " + userSmtp + "\n";
var service = new ExchangeService(exchangeVersion);
log += "2/8 Get credentials for the service\n";
var serviceCred = ((System.Net.NetworkCredential)(((WebCredentials)(Services.First().Value.Credentials)).Credentials));
log += "3/8 Assign credentials to the new service\n";
service.Credentials = new WebCredentials(serviceCred.UserName, serviceCred.Password);
log += "4/8 TraceEnabled is" + enableTrace.ToString() + "\n";
service.TraceEnabled = enableTrace;
log += "5/8 Get the Url for the service with AutodiscoverUrl \n";
service.Url = url;
log += "6/8 Assign a new ImpersonatedUserId to the new service for" + userSmtp + "\n";
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, userSmtp);
try
{
log += "7/8 Validating the impersonation\n";
RuleCollection rulecoll = service.GetInboxRules();
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser: failed to validate the impersonation for {0}\n Exception: {1}\n", userSmtp, ex.Message);
int hr = System.Runtime.InteropServices.Marshal.GetHRForException(ex);
if (hr == -2146233088) // We do not have right to impersonate this user.
{
result = null;
return result;
}
else
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): trying to resolve {0} with Autodiscover instead...", userSmtp);
result = ImpersonateUser(userSmtp, enableTrace, exchangeVersion);
}
}
log += "8/8 Adding the service \n";
if (!Services.ContainsKey(userSmtp))
{
Services.Add(userSmtp, service);
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): {0} has been impersonated\n", service.ImpersonatedUserId.Id);
}
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): exception {0}\n The exception occured after the following steps: \n{1}", ex.Message, log);
}
return result;
}
//
///一次模拟一个用户,而不使用自动发现方法查找用户SMTP的正确url,
///并将提供的url复制到usersmtp。
///
///
///用户smtp
///从XML跟踪启用日志记录
///使用的Exchange服务器版本
私有Uri模拟用户(Uri url、字符串userSmtp、bool enableTrace、ExchangeVersion ExchangeVersion)
{
Uri结果=url;
var log=“模拟用户\n”;
尝试
{
日志+=“0/8检查服务冗余\n”;
if(Services.ContainsKey(userSmtp))
{
删除(userSmtp);
}
日志+=“1/8为”+userSmtp+“\n”创建新服务;
var服务=新的ExchangeService(exchangeVersion);
log+=“2/8获取服务的凭据\n”;
var serviceCred=((System.Net.networkcredentials)((WebCredentials)(Services.First().Value.Credentials)).Credentials));
log+=“3/8为新服务分配凭据\n”;
service.Credentials=新的WebCredentials(serviceCred.UserName、serviceCred.Password);
log+=“4/8 TraceEnabled是”+enableTrace.ToString()+“\n”;
service.TraceEnabled=启用跟踪;
log+=“5/8使用AutoDiscoveryURL获取服务的Url\n”;
Url=Url;
log+=“6/8为“+userSmtp+”\n”的新服务分配一个新的模拟用户ID;
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,userSmtp);
尝试
{
日志+=“7/8验证模拟\n”;
RuleCollection rulecoll=service.GetInboxRules();
}
捕获(例外情况除外)
{
_logDevice.LogSrvMessage(1,“ExchangeLiteService:ImpersonateUser:无法验证{0}\n异常:{1}\n”,userSmtp,ex.Message)的模拟;
int hr=System.Runtime.InteropServices.Marshal.GetHRForException(ex);
if(hr==-2146233088)//我们无权模拟此用户。
{
结果=空;
返回结果;
}
其他的
{
_logDevice.LogSrvMessage(1,“ExchangeLiteService:ImpersonateUser(2):尝试使用自动发现来解析{0}”,userSmtp);
结果=模拟用户(userSmtp、enableTrace、exchangeVersion);
}
}
日志+=“8/8添加服务\n”;
如果(!Services.ContainsKey(userSmtp))
{
添加(userSmtp,服务);
_logDevice.LogSrvMessage(1,“ExchangeLiteService:ImpersonateUser(2):{0}已被模拟,\n”,service.ImpersonatedUserId.Id);
}
}
捕获(例外情况除外)
{
_logDevice.LogSrvMessage(1,“ExchangeLiteService:ImpersonateUser(2):异常{0}\n异常发生在以下步骤之后:\n{1}”,例如消息,日志);
}
返回结果;
}
下面是调用上一个函数(即所有用户)的代码,记住您应该以某种方式存储每个要模拟的帐户的电子邮件地址
/// <summary>
/// To Impersonate users in order to get the info from them.
/// </summary>
/// <param name="userSmtps">List of users to be impersonated</param>
/// <param name="enableTrace"> To enable logging from the XML tracing</param>
/// <param name="exchangeVersion">Exchange server version used </param>
public void ImpersonateUsers(ICollection<string> userSmtps)
{
var log = "ImpersonateUsers\n";
var firstUserSmtp = "";
if (userSmtps != null)
if (userSmtps.Count > 0)
{
//the url for the first smtp
try
{
log += "1/2 Impersonating the first userSmtp\n";
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Getting the Url from the autodiscovery for the first smtp {0} ", userSmtps.First());
bool enableTrace = Services.First().Value.TraceEnabled;
ExchangeVersion exchangeVersion = Services.First().Value.RequestedServerVersion;
firstUserSmtp = userSmtps.First();
var commonSmtpUrl = ImpersonateUser(userSmtps.First(), enableTrace, exchangeVersion);
if (commonSmtpUrl == null) userSmtps.Remove(firstUserSmtp);
// If the list contains other than the first one
log += "2/2 Impersonating " + (userSmtps.Count - 1) + " userSmtps\n";
if (userSmtps.Count >= 1)
{
foreach (var userSmtp in userSmtps)
{
try
{ //skip ther first one because it is already impersonated.
if (userSmtp == firstUserSmtp)
{
continue;
}
// Impersonate the users
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {0} ...", userSmtp);
commonSmtpUrl = ImpersonateUser(userSmtp, enableTrace, exchangeVersion);
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {1}\n exception {0}\n", ex.Message, userSmtp);
}
}
}
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: exception {0}\n The exception occured after the following steps: \n{1}", ex.Message, log);
}
}
}
//
///模拟用户以便从他们那里获取信息。
///
///要模拟的用户列表
///从XML跟踪启用日志记录
///使用的Exchange服务器版本
公共无效模拟用户(ICollection用户SMTPS)
{
var log=“模拟用户\n”;
var firstUserSmtp=“”;
if(userSmtps!=null)
如果(userSmtps.Count>0)
{
//第一个smtp的url
/// <summary>
/// To Impersonate users in order to get the info from them.
/// </summary>
/// <param name="userSmtps">List of users to be impersonated</param>
/// <param name="enableTrace"> To enable logging from the XML tracing</param>
/// <param name="exchangeVersion">Exchange server version used </param>
public void ImpersonateUsers(ICollection<string> userSmtps)
{
var log = "ImpersonateUsers\n";
var firstUserSmtp = "";
if (userSmtps != null)
if (userSmtps.Count > 0)
{
//the url for the first smtp
try
{
log += "1/2 Impersonating the first userSmtp\n";
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Getting the Url from the autodiscovery for the first smtp {0} ", userSmtps.First());
bool enableTrace = Services.First().Value.TraceEnabled;
ExchangeVersion exchangeVersion = Services.First().Value.RequestedServerVersion;
firstUserSmtp = userSmtps.First();
var commonSmtpUrl = ImpersonateUser(userSmtps.First(), enableTrace, exchangeVersion);
if (commonSmtpUrl == null) userSmtps.Remove(firstUserSmtp);
// If the list contains other than the first one
log += "2/2 Impersonating " + (userSmtps.Count - 1) + " userSmtps\n";
if (userSmtps.Count >= 1)
{
foreach (var userSmtp in userSmtps)
{
try
{ //skip ther first one because it is already impersonated.
if (userSmtp == firstUserSmtp)
{
continue;
}
// Impersonate the users
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {0} ...", userSmtp);
commonSmtpUrl = ImpersonateUser(userSmtp, enableTrace, exchangeVersion);
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {1}\n exception {0}\n", ex.Message, userSmtp);
}
}
}
}
catch (Exception ex)
{
_logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: exception {0}\n The exception occured after the following steps: \n{1}", ex.Message, log);
}
}
}