4

同じ問題: https://stackoverflow.com/questions/11294207/exchange-web-services-argumentexception-using-my-own-contact-class

Microsoft.Exchange.WebServices.Data.Appointment から派生クラスを作成しようとしています。ただし、シリアル化エラーのように見えるものをスローせずに派生クラスを保存することはできません。これは、派生クラスに変更を加えていない場合でも発生します。

これは機能します:

public void CreateTestAppointment() {
        Appointment appointment = new Appointment(Exchange) {
            ItemClass = "IPM.Appointment", //Exchange Specific. Dont touch unless you     know what this does. I sure as hell don't.
            Subject = string.Format("{0} Test", "Oliver")
        };
        appointment.RequiredAttendees.Add("okane@cottinghambutler.com");
        appointment.Body = new MessageBody {
            Text = "Meeting invite body text placeholder"
        };

        //Add item to the appropriate categories
        appointment.Categories.Add(string.Format("[C]{0}", "Arbitrary Client Group"));

        // Add calendar properties to the appointment.
        appointment.Start = DateTime.Now.AddMinutes(10);
        appointment.End = DateTime.Now.AddMinutes(30);

        appointment.Save(Hc360CallCalendarFolderId, SendInvitationsMode.SendOnlyToAll);
    }

しかし、これはしません:

 public void CreateTestAppointment() {
        InheritedAppointment appointment = new InheritedAppointment(Exchange) {
            ItemClass = "IPM.Appointment", //Exchange Specific. Dont touch unless you know what this does. I sure as hell don't.
            Subject = string.Format("{0} Test", "Oliver")
        };
        appointment.RequiredAttendees.Add("okane@cottinghambutler.com");
        appointment.Body = new MessageBody {
            Text = "Meeting invite body text placeholder"
        };

        //Add item to the appropriate categories
        appointment.Categories.Add(string.Format("[C]{0}", "Arbitrary Client Group"));

        // Add calendar properties to the appointment.
        appointment.Start = DateTime.Now.AddMinutes(10);
        appointment.End = DateTime.Now.AddMinutes(30);

        appointment.Save(Hc360CallCalendarFolderId, SendInvitationsMode.SendOnlyToAll);
    }

派生クラスで実際に何もしていないので、これは非常に奇妙です。

    public class InheritedAppointment : Microsoft.Exchange.WebServices.Data.Appointment {
    public InheritedAppointment(ExchangeService serivce)
        : base(serivce) {

    }}

これは XML にシリアル化されているようで、一部の値は null ですが、それが何であるかを理解することはできません。これが生のエラーです

テスト名: TestMeetingCreation テストのフルネーム: Hc360LibTests.UnitTest1.TestMeetingCreation テスト ソース: c:\Users\okane\Documents\Visual Studio 2012\Projects\HealthCheck360OutlookCallScheduleHelper\Hc360LibTests\UnitTest1.cs: 15 行目 テスト結果: 失敗 テスト期間: 0:00 :00.5728502

結果メッセージ: テスト メソッド Hc360LibTests.UnitTest1.TestMeetingCreation が例外をスローしました: System.ArgumentException: 空の文字列 '' は有効なローカル名ではありません。結果 StackTrace: Microsoft.Exchange.WebServices.Data.EwsServiceXmlWriter.WriteStartElement(XmlNamespace xmlNamespace, String localName) で System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns) で Microsoft.Exchange.WebServices.Data.PropertyBag Microsoft.Exchange.WebServices.Data.CreateRequest の .WriteToXml(EwsServiceXmlWriter ライター) 2.WriteElementsToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.WriteBodyToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.WriteToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.EmitRequest(IEwsHttpWebRequest request) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest() at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request) at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequestMicrosoft.Exchange.WebServices.Data.ExchangeService.InternalCreateItems(IEnumerable 1 items, FolderId parentFolderId, Nullable1 messageDisposition, Nullableの 1.Execute()1 sendInvitationsMode, ServiceErrorHandling errorHandling)
at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable
c:\Users\okane\Documents\Visual Studio 2012\Projects の HealthCheck360ExchangeLib.CallSlotRepository.CreateTestAppointment() で Microsoft.Exchange.WebServices.Data.Appointment.Save(FolderId destinationFolderId, SendInvitationsMode sendInvitationsMode) で 1 messageDisposition, Nullable`1 sendInvitationsMode) \HealthCheck360OutlookCallScheduleHelper\HealthCheck360ExchangeLib\CallSlotRepository.cs:c:\Users\okane\Documents\Visual Studio 2012\Projects\HealthCheck360OutlookCallScheduleHelper\Hc360LibTests\UnitTest1.cs:Hc360LibTests.UnitTest1.TestMeetingCreation() の 70 行目:17 行目

4

1 に答える 1

5

継承されたアイテムを保存することはできないようです。

EWS マネージ API のコードを詳しく調べると、シリアル化によって XML 内の要素名が ServiceObjectDefinitionAttribute またはメソッド ServiceObject.GetXmlElementNameOverride から決定されることがわかります。Appointment クラスはItem を継承し、Item は ServiceObject を継承します。Appointment クラスにも ServiceObjectDefinitionAttribute があり、XML 要素名 "CalendarItem" でシリアル化されます。

したがって、Appointment から継承されたクラスを使用するには、クラスで ServiceObjectDefintionAttribute を使用するか、GetXmlElementNameOverride をオーバーライドする必要があります。残念ながら、ServiceObjectDefintionAttribute と GetXmlElementNameOverride は内部的なものであるため、これを行う方法はありません。

問題は、継承されたクラスを使用する理由です。Exchange がクラスのプロパティを保存できると思っていましたか? その場合、 ExtendedPropertiesを確認することをお勧めします。

アップデート:

拡張プロパティを独自のクラスの実際のプロパティとして公開する場合は、Appointment オブジェクトに委譲することで実行できます。完全ではありませんが、オプションです。

public class ExtendedAppointment
{
    Appointment _appointment;

    public ExtendedAppointment(Appointment appointment)
    {
        _appointment = appointment;
    }

    public Appointment Appointment { get { return _appointment; } }

    public object SomeExtendedProperty
    {
        get 
        { 
            return _appointment.ExtendedProperties[0].Value;
        }

        set
        {
            _appointment.ExtendedProperties[0].Value = value;
        }
    }
}
于 2013-01-04T12:56:19.023 に答える