web-dev-qa-db-ja.com

EWSマネージAPIを介してタスクの.Bodyを読み書きしようとすると、エラーが発生する-「値を読み取る前に、このプロパティをロードまたは割り当てる必要があります。」

Exchange WebサービスマネージAPIを使用してタスクを処理しています(Exchange 2007 SP1)。私はそれらをうまく作成できます。ただし、更新しようとすると、.Bodyフィールドを除くすべてのフィールドで機能します。そのフィールドにアクセス(読み取り/更新)しようとすると、次のエラーが発生します。

"You must load or assign this property before you can read its value."

私が使用しているコードは次のようになります:

   //impersonate the person whose tasks you want to read
   Me.Impersonate(userName); //home-made function to handle impersonation

   //build the search filter
   Exchange.SearchFilter.SearchFilterCollection filter = New Exchange.SearchFilter.SearchFilterCollection();
   filter.Add(New Exchange.SearchFilter.IsEqualTo(Exchange.TaskSchema.Categories, "Sales"));

   //do the search
   EWS.Task exTask = esb.FindItems(Exchange.WellKnownFolderName.Tasks, filter, New Exchange.ItemView(Integer.MaxValue));

   exTask.Subject = txtSubject.Text;  //this works fine
   exTask.Body = txtBody.Text; //This one gives the error implying that the object isn't loaded

奇妙なことに、プロパティバッグを調べると、オブジェクトに33個のプロパティが含まれていることがわかりますが、{Body}はその1つではありません。そのプロパティは、基本クラスの.Itemなどから継承されているようです。

それで、オブジェクトをタイプItemとして再ロードする必要がありますか?または、.Bindなどを使用して再読み込みしますか?何千ものアイテムでこれを行う必要があるので、効率は重要です。

36
tgolisch

EWSを使用するときにも同じ問題が発生しました。私のコードはからのイベント(予定)をリクエストしています

Outlookカレンダー、最後には、イベント自体の本文に到達できませんでした。

私の状況で欠けていた点は、次の「誤植があった場合は許してください」でした。

EWSアイテムクラスからも派生する予定を収集した後、次のことを行いました。

1-タイプアイテムのリストを作成します。

List<Item> items = new List<Item>();

2-すべての予定を項目リストに追加しました:

if(oAppointmentList.Items.Count > 0) // Prevent the exception
{
    foreach( Appointment app in oAppointmentList)
    {
        items.Add(app);
    }
}

3-交換したサービス「私はすでに作成して使用しています」を使用しました:

oExchangeService.LoadPropertiesForItems(items, PropertySet.FirstClassProperties);

app.Body.Textを使用しようとすると、正常に返されます。

コーディングと幸運をお楽しみください

私はリソースに言及するのを忘れました:

http://social.technet.Microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/ce1e0527-e2db-490d-817e-83f586fb1b44

彼は中間ステップを保存するためのLinqの使用に言及しました。これは、リスト項目の使用を避け、メモリを節約するのに役立ちます!

RockmanX

42
RocmanX

Loadメソッドを呼び出すと、私の問題が解決しました:)

foreach (Item item in findResults.Items)
        {                
            item.Load();
            string subject = item.Subject;
            string mailMessage = item.Body;
        }
55
hasianjana

カスタムプロパティセットを使用してプロパティをロードできます。一部のプロパティは、FirstClassPropertiesではなくExtendedプロパティです。

小さな例:

 _customPropertySet = new PropertySet(BasePropertySet.FirstClassProperties、AppointmentSchema.MyResponseType、AppointmentSchema.IsMeeting、AppointmentSchema.ICalUid); 
 _customPropertySet.RequestedBodyType = BodyType.Text; 
 appointment ); 
5
eL-Prova