2014-06-23 2 views
1

전역 UID를 사용하여 약속을 찾으려고합니다. 전 세계 UID가 무엇인지 미리 알고 있습니다 (약속을 만들 때 설정할 수 있습니다).확장 속성을 사용하여 EWS 약속을 찾으려고 시도합니다.

이 URL을 참조하여 ExtendedPropertyDefinition을 만들었습니다. http://msdn.microsoft.com/en-us/library/cc815676(v=office.15).aspx.

 var service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
     service.Credentials = new NetworkCredential("","",""); 
     service.Url = new Uri(""); 
     ExtendedPropertyDefinition epICalId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, 3, MapiPropertyType.String); 
     ItemView view = new ItemView(50); 
     view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties); 
     view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending); 
     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Calendar, new SearchFilter.IsEqualTo(epICalId, "CustomUID123"), view); 
     var x = findResults.TotalCount; 

문제는 회의가 반환되지 않는다는 것입니다. 어떤 아이디어?

ICalUID를 여전히 바이너리 개체로 변환 할 수 없습니다. 그것은 다른 객체라는 것일 수도 있습니다 (아래 주석 참조). 하지만 확장 속성을 사용하여 검색 필터를 설정할 수 있습니다. 아래 코드에서 "temp"개체를 저장하고 검색을 위해 다시 사용하기 만하면됩니다.

 var PROP_DEF_PidLidGlobalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting, 0x00000003, MapiPropertyType.Binary); 
     appt.Load(new PropertySet(BasePropertySet.FirstClassProperties, PROP_DEF_PidLidGlobalObjectId); 
     object temp; 
     appt.TryGetProperty(PROP_DEF_PidLidGlobalObjectId, out temp); 
     var sf2 = new SearchFilter.IsEqualTo(PROP_DEF_PidLidGlobalObjectId, Convert.ToBase64String(temp as byte[])); 

답변

0

문제는 귀하의 PropertySet에 귀하의 ExtendedPropertyDefinition이 포함되지 않는다고 생각됩니다. FindItemsResults를 호출 할 때 확장 된 속성 값이 검색을 위해로드되지 않습니다. 그래서 변경 :

view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties); 

그게 해결되지 않을 경우

view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, epICalId); 

Viewing custom extended properties by using the EWS Managed API 좋은 자원이다

합니다.

1

잘못된 MapiPropertyType을 사용하고 있습니다. GlobalID는 문자열이 아닌 이진 속성입니다. EWS는 Base64 문자열을 사용하여 SOAP에서이를 처리합니다. 바이너리 타입의 확장 된 속성이 바이트 배열로 전달 될 것이라고 생각합니다. 따라서 바이너리 확장 속성을 가져 오거나 설정하는 중이라면 필요하다면 직접 Base64 변환을 처리해야 할 수도 있습니다. 이미 Base64 문자열이 있으면 문제가 없습니다. 확장 속성을 이진으로 정의하고 검색 필터에서 Base64 문자열을 사용하십시오. EWS는 나머지를해야합니다.

아, 미안하지만, 나는 그것을 놓쳤습니다. DefaultExtendedPropertySet.Appointment를 체크인합니다. 대신 DefaultExtendedPropertySet.Meeting이어야합니다. 그런 경우 글로벌 고유 ID를 설정하려는 경우 대신 "새"확장 속성을 설정합니다. GlobalUniqueID는 설정할 수 없습니다. 시도해도 Exchange에서 오류가 발생하지는 않지만 요청한대로 수행 한 것은 아닙니다. GlobalUniqueID는 약속의 날짜/시간을 기반으로 생성됩니다. 그것은 ICalUID와 일치 할 수 있습니다 (나는 그들이 일치 할 수 있다는 것을 모르기 때문에 사과합니다). 그러나 꼭 그런 것은 아닙니다. GlobalUniqueID와 CleanGlobalUniqueID의 차이점을 살펴보십시오. 나는 ICalUID 자체가 그와 별개로 설정 될지 모르지만, 나는 그것을 의심한다. 이 중 하나를 검색하려면 약속을 만든 다음 원하는 확장 속성을로드하고 검색을 위해 다른 위치에 유지하거나 고유 한 식별자로 확장 속성을 설정하고 검색해야합니다.

+0

MapiType을 수정하면 ItemView에서 개체를 다시 가져올 수있었습니다. 그러나 나는 여전히 인코딩 문제가 있습니다. Convert.ToBase64String을 실행하면 반환되는 byte []에 ICalUId에 포함 된 값과 비슷한 문자열이 표시됩니다. – quarksoup

+0

ICalUID와 글로벌 고유 ID는 동일한 속성이 아닙니다. 그들은 서로 다른 가치를 가질 것입니다. – user1017413

+0

나는 그들이 똑같은지 꽤 확신한다. MS-OXOCAL.pdf http://msdn.microsoft.com/en-us/library/cc425490(v=exchg.80).aspx의 섹션 4.1.2.1을 확인하십시오. 제공된 값은 ICalUID와 동일하게 나타납니다. – quarksoup

관련 문제