4

私は EWS の操作方法を見つけるのに苦労してきましたが、自分がやりたいと思っていたことをほぼすべて実行する方法を見つけることができました。EWS を使用して、カスタム データベースと Exchange サーバー (2007) の間の連絡先を管理しています。追加と削除は正常に機能しますが、連絡先を更新できません。これを回避するために、連絡先を削除して再作成しましたが、Outlook (またはその他のもの) で連絡先を編集すると問題が発生します。

私はこのリンクの言うことに従おうとしました:

http://msdn.microsoft.com/en-us/library/exchange/ee693002(v=exchg.80).aspx

しかし、1 つのプロパティしか更新できないというエラーが表示されます。次に、各プロパティを 1 つずつ更新します。電話番号を更新しようとするとすぐに、「名前空間 'http://schemas.microsoft.com/exchange/services の要素 'Updates' /2006/types のコンテンツは不完全です。」

基本的にコードは次のとおりです。

ItemId itemId = contactToUpdate.Id;
Contact updateContact = Contact.Bind(service, itemId);
updateContact.PhoneNumbers[PhoneNumberKey.HomePhone] = customContact.HomeTelephone;
updateContact.Update(ConflictResolutionMode.AlwaysOverwrite);

このエラーが発生する理由を知っている人はいますか? アイテムを実際に更新する方法を誰かが答えることができますか? 見逃したドキュメントはありますか?

EWS dll のバージョンは 15.0.516.12 です。

4

2 に答える 2

9

多くのデバッグを行った後、これに対する答えを見つけました。理由を見つけるためにこれ以上調査するつもりはありませんが、これを行うことはできません。

updateContact = Contact.Bind(service, itemId);
updateContact.PhoneNumbers[PhoneNumberKey.HomePhone] = customContact.HomePhone;
updateContact.PhoneNumbers[PhoneNumberKey.MobilePhone] = customContact.MobilePhone;
updateContact.PhoneNumbers[PhoneNumberKey.BusinessPhone] = customContact.BusinessPhone;
updateContact.Update(ConflictResolutionMode.AlwaysOverwrite);

ただし、設定できる電話番号は1つだけで、デバッグ中(ブレークポイント中)に他の2つの電話番号の値を変更できます。変。

とにかく、問題があります-値が変更されない場合、これらのディクショナリ値の1つを更新することはできません(つまり、答えです)。最初に、値が変更されたかどうかを確認してください。次に、値が空の文字列である場合は、nullとして保存する必要があります。また、値を読み取る前に、ディクショナリエントリが存在するかどうかを確認する必要があります。

string number;
bool numberFound;

numberFound = updateContact.PhoneNumbers.TryGetValue(PhoneNumberKey.HomePhone, out number);
if ((numberFound && number != customContact.HomePhone) ||
    (!numberFound && !string.IsNullOrEmpty(customContact.HomePhone)))
{
    updateContact = Contact.Bind(service, itemId);
    updateContact.PhoneNumbers[PhoneNumberKey.HomePhone] = customContact.HomePhone == "" ? null : customContact.HomePhone;
    updateContact.Update(ConflictResolutionMode.AlwaysOverwrite);
}

アドレスを更新するには:

updateContact = Contact.Bind(service, itemId);
updateContact.PhysicalAddresses[PhysicalAddressKey.Home].Street = customContact.Street == "" ? null : customContact.Street;
updateContact.PhysicalAddresses[PhysicalAddressKey.Home].State = customContact.Suburb == "" ? null : customContact.Suburb;
updateContact.PhysicalAddresses[PhysicalAddressKey.Home].City = customContact.City == "" ? null : customContact.City;
updateContact.PhysicalAddresses[PhysicalAddressKey.Home].CountryOrRegion = customContact.Country == "" ? null : customContact.Country;
updateContact.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode = customContact.AreaCode == "" ? null : customContact.AreaCode;
updateContact.Update(ConflictResolutionMode.AlwaysOverwrite);

私の意見では、これはAPIの実装がお粗末です(そしてドキュメントが貧弱です)。

アイテムのプロパティごとに更新を実行する必要があるという事実は、サーバーがExchange 2007を実行していることが原因である可能性がありますが、これはまだ確認されていません。

Microsoft.Exchange.WebServicesのバージョン14と15の両方で試してみたところ、同じ結果になりました。

アップデート

しかし、待ってください、もっとあります。

さまざまな電話番号や住所などを更新する方法を説明するために、多くのコードを投稿しています。このコードは、タイトル、性別、接尾辞、カスタムプロパティ(ユーザー定義フィールド-必要に応じて)を更新(または設定)する方法も示しています。 Outlookに表示するには、連絡先フォルダにユーザー定義フィールドを追加する必要があります)。

完全に機能するコードは次のとおりです。

Contact updateContact = Contact.Bind(service, itemId);
updateContact.GivenName = customContact.Name;
updateContact.Surname = customContact.Surname;

EmailAddress emailAddress;
bool emailAddressFound;

emailAddressFound = updateContact.EmailAddresses.TryGetValue(EmailAddressKey.EmailAddress1, out emailAddress);
if (emailAddressFound && emailAddress.Address != customContact.Email)
{
    emailAddress.Address = customContact.Email == "" ? null : customContact.Email;
}
else if (!emailAddressFound && !string.IsNullOrEmpty(customContact.Email))
{
    updateContact.EmailAddresses[EmailAddressKey.EmailAddress1] = customContact.Email;
}
updateContact.Initials = customContact.Initials;

string number;
bool numberFound;

numberFound = updateContact.PhoneNumbers.TryGetValue(PhoneNumberKey.HomePhone, out number);
if ((numberFound && number != customContact.HomePhone) || (!numberFound && !string.IsNullOrEmpty(customContact.HomePhone)))
{
    updateContact.PhoneNumbers[PhoneNumberKey.HomePhone] = customContact.HomePhone == "" ? null : customContact.HomePhone;
}
numberFound = updateContact.PhoneNumbers.TryGetValue(PhoneNumberKey.MobilePhone, out number);
if ((numberFound && number != customContact.CellPhone) || (!numberFound && !string.IsNullOrEmpty(customContact.CellPhone)))
{
    updateContact.PhoneNumbers[PhoneNumberKey.MobilePhone] = customContact.CellPhone == "" ? null : customContact.CellPhone;
}
numberFound = updateContact.PhoneNumbers.TryGetValue(PhoneNumberKey.BusinessPhone, out number);
if ((numberFound && number != customContact.WorkPhone) || (!numberFound && !string.IsNullOrEmpty(customContact.WorkPhone)))
{
    updateContact.PhoneNumbers[PhoneNumberKey.BusinessPhone] = customContact.WorkPhone == "" ? null : customContact.WorkPhone;
}

PhysicalAddressEntry phsicalAddress;
bool phsicalAddressFound;
int phsicalAddressLength = (customContact.Street + customContact.Suburb + customContact.City + customContact.Country + customContact.AreaCode).Length;
phsicalAddressFound = updateContact.PhysicalAddresses.TryGetValue(PhysicalAddressKey.Home, out phsicalAddress);
if (phsicalAddressFound)
{
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home].Street = customContact.Street == "" ? null : customContact.Street;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home].State = customContact.Suburb == "" ? null : customContact.Suburb;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home].City = customContact.City == "" ? null : customContact.City;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home].CountryOrRegion = customContact.Country == "" ? null : customContact.Country;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode = customContact.AreaCode == "" ? null : customContact.AreaCode;
}
else if (!phsicalAddressFound && phsicalAddressLength > 0)
{
    updateContact.PhysicalAddresses[PhysicalAddressKey.Home] = homeAddress;
}
phsicalAddressLength = (customContact.BusinessStreet + customContact.BusinessSuburb + customContact.BusinessCity + customContact.BusinessCountry + customContact.BusinessAreaCode).Length;
phsicalAddressFound = updateContact.PhysicalAddresses.TryGetValue(PhysicalAddressKey.Business, out phsicalAddress);
if (phsicalAddressFound)
{
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business].Street = customContact.BusinessStreet == "" ? null : customContact.BusinessStreet;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business].State = customContact.BusinessSuburb == "" ? null : customContact.BusinessSuburb;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business].City = customContact.BusinessCity == "" ? null : customContact.BusinessCity;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business].CountryOrRegion = customContact.BusinessCountry == "" ? null : customContact.BusinessCountry;
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business].PostalCode = customContact.BusinessAreaCode == "" ? null : customContact.BusinessAreaCode;
}
else if (!phsicalAddressFound && phsicalAddressLength > 0)
{
    updateContact.PhysicalAddresses[PhysicalAddressKey.Business] = businessAddress;
}
updateContact.Birthday = customContact.Birthdate;
updateContact.WeddingAnniversary = customContact.MaritalStatusDate;
// Extended properties -------------------------------------------------------------
ExtendedPropertyDefinition extendedPropertyDefinition;
// Gender
if (!string.IsNullOrEmpty(customContact.Gender))
{
    extendedPropertyDefinition = new ExtendedPropertyDefinition(0x3a4d, MapiPropertyType.Short);
    switch (customContact.Gender)
    {
        case "Male":
            updateContact.SetExtendedProperty(extendedPropertyDefinition, 2);
            break;
        case "Female":
            updateContact.SetExtendedProperty(extendedPropertyDefinition, 1);
            break;
        default:
            updateContact.SetExtendedProperty(extendedPropertyDefinition, 3);
            break;
    }
}
// Title
if (!string.IsNullOrEmpty(customContact.Title))
{
    extendedPropertyDefinition = new ExtendedPropertyDefinition(0x3a45, MapiPropertyType.String);
    updateContact.SetExtendedProperty(extendedPropertyDefinition, customContact.Title);
}
// Suffix
if (!string.IsNullOrEmpty(customContact.Suffix))
{
    extendedPropertyDefinition = new ExtendedPropertyDefinition(0x3a05, MapiPropertyType.String);
    updateContact.SetExtendedProperty(extendedPropertyDefinition, customContact.Suffix);
}
// Custom property
extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "customProperty", MapiPropertyType.String);
updateContact.SetExtendedProperty(extendedPropertyDefinition, customContact.CustomProperty);
// File the contact
updateContact.Subject = customContact.Name + " " + customContact.Surname;
updateContact.DisplayName = customContact.Name + " " + customContact.Surname;
updateContact.Update(ConflictResolutionMode.AlwaysOverwrite);
于 2012-11-21T14:08:53.243 に答える
0

マイクロソフトが例で使用している方法を使用して、会社の住所を更新してみましたか:

PhysicalAddressEntry PABusinessEntry = new PhysicalAddressEntry();
PABusinessEntry.Street = "4567 Contoso Way";
PABusinessEntry.City = "Redmond";
PABusinessEntry.State = "OH";
PABusinessEntry.PostalCode = "33333";
PABusinessEntry.CountryOrRegion = "United States of America";
contact.PhysicalAddresses[PhysicalAddressKey.Business] = PABusinessEntry;

このようにして、問題を解決する可能性のある新しい PhysicalAddressEntry オブジェクトが作成されます。

(もちろん、これは電話番号には役立ちません。)

于 2013-11-25T09:51:17.950 に答える