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;
    }
}

这对我有用。