Мне было поручено написать веб-сервис SOAP в .Net, чтобы быть промежуточным программным обеспечением между EWS2010 и сервером приложений, который ранее использовал WebDAV для подключения к Exchange. (Как я понимаю, WebDAV уходит с EWS2010, поэтому сервер приложений больше не сможет подключаться, как это было ранее, и экспоненциально сложнее подключиться к EWS без WebDAV. Теория заключается в том, что это делается в .NET. должно быть проще, чем что-либо еще... Правильно?!)
Моя конечная цель - иметь возможность получать и создавать/обновлять электронную почту, элементы календаря, контакты и список дел для указанной учетной записи Exchange. (Удаление в настоящее время не требуется, но я могу создать его для будущего рассмотрения, если это будет достаточно просто).
Мне изначально дали пример кода, который действительно работал, но я быстро понял, что он устарел. Используемые типы и классы нигде не отображаются в текущей документации.
Например, метод, используемый для создания соединения с сервером Exchange, был следующим:
ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
Для чего это стоило, это использовало сборку, которая поставлялась с образцом кода: Microsoft.Exchange.WebServices.dll
( "MEWS" ).
Прежде чем я понял, что это не текущий стандартный способ выполнить соединение, и он сработал, я попытался построить его и добавить метод для создания элементов календаря, который я скопировано здесь:
static void CreateAppointment(ExchangeServiceBinding esb)
{
// Create the appointment.
CalendarItemType appointment = new CalendarItemType();
...
}
Сразу же, я столкнулся с разницей между ExchangeService
и ExchangeServiceBinding
( "ESB" ); поэтому я начал использовать Googling, чтобы попытаться выяснить, как получить определение ESB, чтобы метод CreateAppointment
скомпилировался. Я нашел это сообщение в блоге, в котором объясняется, как создать прокси-класс из WSDL, который я сделал.
К сожалению, это вызвало некоторые конфликты, в которых типы, которые были определены в исходной сборке, Microsoft.Exchange.WebServices.dll
(которая поставляется вместе с образцом кода) перекрывались с типами в моей новой сборке EWS.dll
(которую я скомпилировал из кода, сгенерированного из services.wsdl
, предоставляемый сервером Exchange).
Я исключил сборку MEWS, которая только ухудшила ситуацию. Я перешел от нескольких ошибок и предупреждений к 25 ошибкам и 2,510 предупреждениям. Все виды типов и методов не найдены. Здесь что-то явно не так.
Итак, я вернулся на охоту. Я нашел инструкции по добавлению ссылок на службы и веб-ссылок (т.е. дополнительные шаги, которые необходимо предпринять в VS2008), и я думаю, что вернусь к правая дорожка.
Я удалил (фактически, на данный момент, просто исключил) все предыдущие сборки, которые я пытался; и я добавил ссылку на службу для https://my.exchange-server.com/ews/services.wsdl
Теперь мне осталось всего 1 ошибка и 1 предупреждение.
Внимание:
Элемент 'transport' не может содержать дочерний элемент 'extendedProtectionPolicy', потому что модель содержимого родительского элемента пуста.
Это относится к изменению, которое было внесено в web.config, когда я добавил ссылку на службу; и я только что нашел исправление для этого здесь на SO. Я прокомментировал этот раздел, как указано, и это сделало предупреждение утихшим, так что стреляйте для этого.
Ошибка не была так легко обойти, хотя:
Ошибка:
Не удалось найти имя типа или пространства имен" ExchangeService" (вам не хватает директивы using или ссылки на сборку?)
Это относится к функции, которую я использовал для создания соединения EWS, вызываемого каждым из веб-методов:
private ExchangeService getService(String AutoDiscoverEmailAddress, String AuthEmailAddress, String AuthEmailPassword)
{
ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
return svc;
}
Эта функция отлично работала с сборкой MEWS из кода примера, но тип ExchangeService
больше не доступен. (Не ExchangeServiceBinding
, это было первое, что я проверил.)
На этом этапе, так как я не выполняю никаких указаний из документации (я не смог найти нигде в документации, которая говорила, чтобы добавить ссылку на службу на ваш сервер Exchange services.wsdl - но это похоже лучший/самый дальний, который я получил до сих пор), я чувствую, что я летел слепой.
Я знаю, что мне нужно выяснить, что это такое, что должно заменить ExchangeService
/ExchangeServiceBinding
, реализовать это, а затем работать через любые ошибки, возникающие в результате этого переключателя...
Но я понятия не имею, как это сделать или где искать, как это сделать. Googling "ExchangeService" и "ExchangeServiceBinding", похоже, только вернулись к устаревшим сообщениям в блогах и MSDN, ни одна из которых до сих пор не оказалась очень полезной.
Что мне следует заменить ExchangeService
/ExchangeServiceBinding
на? Есть ли другое место, где документы, работающие с EWS, лучше, чем MSDN?