2013-03-07 8 views
5

Sto provando a utilizzare Exchange EWS 2 su debian tramite Mono (versione 2.10.8.1 & 3.0.6) Sto sviluppando su Windows 8 utilizzando vs2012.Esecuzione di Exchange EWS su Mono LdapException

Il programma funziona perfettamente su Windows e ottengo l'output previsto.

Su mono tuttavia continuo ad ottenere il seguente output ed eccezione.

<Trace Tag="AutodiscoverConfiguration" Tid="1" Time="2013-03-07 19:09:05Z"> 
Starting SCP lookup for domainName='example.com', root path='' 
</Trace> 
Connect Error 

Unhandled Exception: LdapException: (91) Connect Error 
System.Net.Sockets.SocketException: No such host is known 
    at System.Net.Dns.hostent_to_IPHostEntry (System.String h_name, System.String[]   h_aliases, System.String[] h_addrlist) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostByName (System.String hostName) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostEntry (System.String hostNameOrAddress) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostAddresses (System.String hostNameOrAddress) [0x00000] in <filename unknown>:0 
    at System.Net.Sockets.TcpClient.Connect (System.String hostname, Int32 port) [0x00000] in <filename unknown>:0 
    at System.Net.Sockets.TcpClient..ctor (System.String hostname, Int32 port) [0x00000] in <filename unknown>:0 
    at Novell.Directory.Ldap.Connection.connect (System.String host, Int32 port, Int32 semaphoreId) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: LdapException: (91) Connect Error 
System.Net.Sockets.SocketException: No such host is known 
    at System.Net.Dns.hostent_to_IPHostEntry (System.String h_name, System.String[] h_aliases, System.String[] h_addrlist) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostByName (System.String hostName) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostEntry (System.String hostNameOrAddress) [0x00000] in <filename unknown>:0 
    at System.Net.Dns.GetHostAddresses (System.String hostNameOrAddress) [0x00000] in <filename unknown>:0 
    at System.Net.Sockets.TcpClient.Connect (System.String hostname, Int32 port) [0x00000] in <filename unknown>:0 
    at System.Net.Sockets.TcpClient..ctor (System.String hostname, Int32 port) [0x00000] in <filename unknown>:0 
    at Novell.Directory.Ldap.Connection.connect (System.String host, Int32 port, Int32 semaphoreId) [0x00000] in <filename unknown>:0 

Apparentemente sta tentando di cercare un host che non riesce a trovare. Sia i miei sistemi Windows che Linux utilizzano lo stesso server DNS, quindi non causano il problema.

Ho letto la traccia su Windows quando funziona, e la traccia mostra che le ricerche falliscono alcune volte e il metodo di individuazione automatica prova alcuni URL diversi fino a quando non colpisce su uno che funziona - su mono tuttavia sembra che cada dopo il primo fallimento e questa è la fine.

Ho provato su google per usare ews su mono ma non ho trovato nessuno che lo stia facendo, quindi non sono proprio sicuro di cos'altro provare.

Il codice utilizzato è al di sotto - praticamente tutto di essa è tratto da esempi di codice su http://msdn.microsoft.com/en-us/library/exchange/dd633709(v=exchg.80).aspx

class Program 
{ 
    private static int verbose = 10; 
    private static string loginEmail = "[email protected]"; 
    private static string password = "#############"; 

    static void Main(string[] args) 
    { 
     try 
     { 

      ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack; 

      ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 

      service.Credentials = new WebCredentials(loginEmail, password); 

      if (verbose >= 10) 
      { 

       service.TraceEnabled = true; 
       service.TraceFlags = TraceFlags.All; 

      } 

      service.AutodiscoverUrl(loginEmail, RedirectionUrlValidationCallback); 

      Console.WriteLine("AutoDiscover Completed"); 

      getContacts(service); 

      Console.ReadLine(); 

     } 
     catch (Exception e) { 
      Console.WriteLine(e.Message); 
      foreach (string key in e.Data.Keys) 
      { 
       Console.WriteLine(String.Format("{0}: {1}",key, e.Data[key])); 
      } 
      throw e; 
     } 

    } 

    private static void getContacts(ExchangeService service){ 


     // Get the number of items in the Contacts folder. 
     ContactsFolder contactsfolder = ContactsFolder.Bind(service, WellKnownFolderName.Contacts); 

     // Set the number of items to the number of items in the Contacts folder or 1000, whichever is smaller. 
     int numItems = contactsfolder.TotalCount < 1000 ? contactsfolder.TotalCount : 1000; 

     // Instantiate the item view with the number of items to retrieve from the Contacts folder. 
     ItemView view = new ItemView(numItems); 

     // To keep the request smaller, request only the display name property. 
     //view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ContactSchema.DisplayName); 

     // Retrieve the items in the Contacts folder that have the properties that you selected. 
     FindItemsResults<Item> contactItems = service.FindItems(WellKnownFolderName.Contacts, view); 

     // Display the list of contacts. 
     foreach (Item item in contactItems) 
     { 
      if (item is Contact) 
      { 
       Contact contact = item as Contact; 

       Console.WriteLine(); 
       Console.WriteLine(contact.DisplayName); 
       if (verbose >= 2) 
       { 
        Console.WriteLine(" " + contact.Id); 
       } 

       try 
       { 
        Console.WriteLine(" " + contact.EmailAddresses[EmailAddressKey.EmailAddress1].ToString()); 
       } 
       catch (Exception e) 
       { 
        if (verbose >= 5) 
        { 
         Console.WriteLine(" " + "Email Address 1 Not Available : " + e.Message); 
        } 
       } 
      } 
     } 

    } 

    #region taken from tutorial 

    private static bool CertificateValidationCallBack(
     object sender, 
     System.Security.Cryptography.X509Certificates.X509Certificate certificate, 
     System.Security.Cryptography.X509Certificates.X509Chain chain, 
     System.Net.Security.SslPolicyErrors sslPolicyErrors) 
    { 
     // If the certificate is a valid, signed certificate, return true. 
     if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None) 
     { 
      return true; 
     } 

     // If there are errors in the certificate chain, look at each error to determine the cause. 
     if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0) 
     { 
      if (chain != null && chain.ChainStatus != null) 
      { 
       foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus) 
       { 
        if ((certificate.Subject == certificate.Issuer) && 
         (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot)) 
        { 
         // Self-signed certificates with an untrusted root are valid. 
         continue; 
        } 
        else 
        { 
         if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError) 
         { 
          // If there are any other errors in the certificate chain, the certificate is invalid, 
          // so the method returns false. 
          return false; 
         } 
        } 
       } 
      } 

      // When processing reaches this line, the only errors in the certificate chain are 
      // untrusted root errors for self-signed certificates. These certificates are valid 
      // for default Exchange server installations, so return true. 
      return true; 
     } 
     else 
     { 
      // In all other cases, return false. 
      return false; 
     } 
    } 

    private static bool RedirectionUrlValidationCallback(string redirectionUrl) 
    { 
     // The default for the validation callback is to reject the URL. 
     bool result = false; 

     Uri redirectionUri = new Uri(redirectionUrl); 

     // Validate the contents of the redirection URL. In this simple validation 
     // callback, the redirection URL is considered valid if it is using HTTPS 
     // to encrypt the authentication credentials. 
     if (redirectionUri.Scheme == "https") 
     { 
      result = true; 
     } 
     return result; 
    } 

    #endregion 

} 

La risposta da beepbeep mi ha aiutato a risolvere questo problema.

Dopo aver usato il suggerimento di BeepBeep ho poi avuto un problema che Mono sembrava non avere dnsapi.dll (secondo le eccezioni). Ho risolto questo problema saltando autodiscover per ora.

Per fare questo, ho sostituito

service.AutodiscoverUrl(loginEmail, RedirectionUrlValidationCallback); 

con

service.Url = new Uri("https://blah.com/ews/exchange.asmx"); 

Poi ho avuto un errore con il certificato (l'eccezione detto qualcosa come 'errore con richiesta o decrittazione') - è sufficiente sapere che mono non include certificati root ca per impostazione predefinita, maggiori informazioni qui: Mono FAQ about Security

Ho scelto il modo più pigro di ge i certs che volevo, usando lo strumento mozroots. Questo tuttavia non ha funzionato come previsto e l'errore persisteva.

Ho quindi utilizzato il tststest anche dalle domande frequenti di cui sopra per determinare il problema - era correlato alla catena di certificati che stavo usando (la radice era accettata, ma l'intermedio non veniva accettato). Ho quindi utilizzato il terzo strumento documentato nelle FAQ (certmgr) per installare i certificati.

In seguito, tutto funziona.

+0

mi permetto di aggiungere io sono nuovo sia EWS e mono – m3z

+0

ho aggiornato a mono 3.0.6 - lo stesso problema – m3z

risposta

2

stesso problema e risolto utilizzando questo codice:

ExchangeService service = new ExchangeService(); 
service.EnableScpLookup = false; 
+0

Grazie. Darò una prova. – m3z

+0

Penso che mi abbia portato al prossimo passo. Ora devo capire come includere dnsapi.dll in mono. o qualcosa. ... Off per fare un po 'di lettura penso – m3z

+0

Grazie. Ora sta funzionando. Ho dovuto fare altre cose, che ho intenzione di aggiungere dettagli alla mia domanda per riferimento di altri, ma il tuo suggerimento mi ha dato la chiave. – m3z

Problemi correlati