EWS Managed API TimeZoneDefinition header 转发时未发送
EWS Managed API TimeZoneDefinition header not sent when forwarding
我们最近升级到 Exchange 2013,发现 EWS Managed API 在这个版本中发送 Forward 时实际上并没有发送 TimeZoneDefinition header(事实上它似乎只是为了2007_SP1 我们正在使用)。所以我在谷歌上搜索了一下,找到了一个我可以连接的事件,据说可以将这个 header 写入序列化请求。不幸的是,这不起作用。代码执行但当 end-user 收到转发的电子邮件时,原始发送日期仍为 UTC 而不是他们的时区(我用它初始化服务客户端)。谁能看出为什么这不起作用?这是设置和发送:
var emailForward = originalEmail.CreateForward();
emailForward.ToRecipients.Add(recipient);
emailForward.Save(WellKnownFolderName.Drafts);
_service.OnSerializeCustomSoapHeaders += ServiceOnSerializeAddTimeZoneDefinitionSoapHeader;
emailForward.Send();
_service.OnSerializeCustomSoapHeaders -= ServiceOnSerializeAddTimeZoneDefinitionSoapHeader;
这是事件处理程序:
private void ServiceOnSerializeAddTimeZoneDefinitionSoapHeader(XmlWriter writer)
{
writer.WriteRaw(Environment.NewLine + " <t:TimeZoneContext><t:TimeZoneDefinition Id=\"" + _service.TimeZone.StandardName + "\"/></t:TimeZoneContext>" + Environment.NewLine);
}
如果您不使用新功能,您可以在初始化 ExchangeService object 时继续使用 Exchange2007_SP1 版本。
如果您正在使用新功能,那么我会首先验证您添加的元素是否确实在线。 Enable tracing看看是否包含在内。
另一种选择是修复托管 API 以自动发出 header。 API现在是open-sourced,所以你可以修改它:https://github.com/OfficeDev/ews-managed-api/. As a test, I modified EmitTimeZoneHeader
in CreateItemRequestBase.cs如下:
internal override bool EmitTimeZoneHeader
{
get
{
foreach (TServiceObject serviceObject in this.Items)
{
// BEGIN MODIFICATION
// Handle reply/forward case specially
if (serviceObject is ResponseMessage)
{
return true;
}
// END MODIFICATION
if (serviceObject.GetIsTimeZoneHeaderRequired(false /* isUpdateOperation */))
{
return true;
}
}
return false;
}
}
这对我有用。
我们最近升级到 Exchange 2013,发现 EWS Managed API 在这个版本中发送 Forward 时实际上并没有发送 TimeZoneDefinition header(事实上它似乎只是为了2007_SP1 我们正在使用)。所以我在谷歌上搜索了一下,找到了一个我可以连接的事件,据说可以将这个 header 写入序列化请求。不幸的是,这不起作用。代码执行但当 end-user 收到转发的电子邮件时,原始发送日期仍为 UTC 而不是他们的时区(我用它初始化服务客户端)。谁能看出为什么这不起作用?这是设置和发送:
var emailForward = originalEmail.CreateForward();
emailForward.ToRecipients.Add(recipient);
emailForward.Save(WellKnownFolderName.Drafts);
_service.OnSerializeCustomSoapHeaders += ServiceOnSerializeAddTimeZoneDefinitionSoapHeader;
emailForward.Send();
_service.OnSerializeCustomSoapHeaders -= ServiceOnSerializeAddTimeZoneDefinitionSoapHeader;
这是事件处理程序:
private void ServiceOnSerializeAddTimeZoneDefinitionSoapHeader(XmlWriter writer)
{
writer.WriteRaw(Environment.NewLine + " <t:TimeZoneContext><t:TimeZoneDefinition Id=\"" + _service.TimeZone.StandardName + "\"/></t:TimeZoneContext>" + Environment.NewLine);
}
如果您不使用新功能,您可以在初始化 ExchangeService object 时继续使用 Exchange2007_SP1 版本。
如果您正在使用新功能,那么我会首先验证您添加的元素是否确实在线。 Enable tracing看看是否包含在内。
另一种选择是修复托管 API 以自动发出 header。 API现在是open-sourced,所以你可以修改它:https://github.com/OfficeDev/ews-managed-api/. As a test, I modified EmitTimeZoneHeader
in CreateItemRequestBase.cs如下:
internal override bool EmitTimeZoneHeader
{
get
{
foreach (TServiceObject serviceObject in this.Items)
{
// BEGIN MODIFICATION
// Handle reply/forward case specially
if (serviceObject is ResponseMessage)
{
return true;
}
// END MODIFICATION
if (serviceObject.GetIsTimeZoneHeaderRequired(false /* isUpdateOperation */))
{
return true;
}
}
return false;
}
}
这对我有用。