This is my scenario: I have to read email from exchange 2010 sp2 accounts. I have to use Exchange Web Services, POP3 and IMAP are blocked. I have to test my app in an enviro
Having run into similar issues recently and working to resolve them I discovered a utility that was/is very helpful in troubleshooting: EWS Editor It may not solve your problems but can be used to iterate over different configuration combinations very quickly which will hopefully shed some light on your issues.
I used this app when Working with a client to establish Autodiscover and Service URL connections to test and prod Exchange servers. It was handy not only for me but the client's IT staff as well. They downloaded and used the utility to test and verify their settings.
From http://ewseditor.codeplex.com :
Project description
EWSEditor has three goals:
Demonstrate the Exchange Web Services Managed API functionality and simplicity to developers through its source code.
Demonstrate the Exchange Web Services SOAP traffic used to perform actions initiated through an explorer user interface.
Assist non-developers in debugging and understanding Exchange stores by exploring items, folders, and their properties in depth
This works like a charm to me:
var exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
var username = Settings.EmailUserName;
var password = Settings.EmailPassword;
var domain = Settings.EmailDomain;
var email = Settings.Email;
exchange.Credentials = new WebCredentials(email, password);
exchange.AutodiscoverUrl(email, RedirectionCallback);
and the RedirectionCallback is:
static bool RedirectionCallback(string url)
{
// Return true if the URL is an HTTPS URL.
return url.ToLower().StartsWith("https://");
}
heres is the link: https://msdn.microsoft.com/en-us/library/office/dd635285(v=exchg.80).aspx
Regards!
Try service.TraceEnabled = true;
WFM. In my case I needed to set up SSL/TLS by installing a certificate from the Exchange Server onto the client machine. I was led to this solution from the output of the trace.
Somehow you need to log the result of what redirectionUrl
is. You will get this error when your redirectionUrl
doesn't match the URI you've specified (i.e. your autodiscover validation callback returns FALSE
). Certainly the redirectionUrl
URI is not what you think it is. If you are using SSL - you need to handle the redirect validation callback.
Since you cannot debug the application, perhaps you could send an email to yourself, log to a shared DB or file, or perhaps use the app event log (throwing an application exception).
Note: The first error does tell you the autodiscover URI is https://autodiscover.colpatria.com/autodiscover/autodiscover.xml
. Should this replace the existing string https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml
?
Also see related SO post regarding Exchange Autodiscovery and Validating a Potentially Unsafe Redirection URL on MSDN.
When you used AutodiscoverUrl() with RedirectionUrlValidationCallback, here is a sample code:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.PreAuthenticate = true;
service.Credentials = new WebCredentials("my_username","my_password"); //use WebCredentials instead of NetworkCredential
service.AutodiscoverUrl(userEmailAddress, RedirectionCallback);
And RedirectionCallback method be like:
static bool RedirectionCallback(string url)
{
bool redirectionValidated = false;
Uri redirectionUri = new Uri(url);
//There are two ways of implementing a RedirectionCallback scheme
// Way 1: Return true if the URL is an HTTPS URL.
//return url.ToLower().StartsWith("https://");
if (redirectionUri.Scheme == "https")
redirectionValidated = true;
//Way 2: check if url is autodiscovery url
if (url.Equals(
"https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml"))
redirectionValidated = true;
return redirectionValidated;
}
PS: Take care of proxies disallowing Autodiscovery service. In my case, this code everytime returned "The Autodiscovery service cannot be located" error, but the root cause was 403 Forbidden on Autodiscovery call. It did work after proxy settings.
This is a old post I thought I'd put in a full example solution for the error reported. Simply replace service.AutodiscoverUrl("someuser@somedomain.org"); with System.Uri("https://mail.somedomain.org/ews/Exchange.asmx");
Here's the full block of code
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.Credentials = new WebCredentials("someuser", "somepassword");
//service.AutodiscoverUrl("someuser@somedomain.org");
service.Url = new System.Uri("https://mail.somedomain.org/ews/Exchange.asmx");