2015-04-01 15 views
10

Sto utilizzando l'API gestita EWS v2.2 per effettuare chiamate EWS. Recentemente in uno dei miei clienti, abbiamo una strana situazione in cui le chiamate di servizio, le chiamate di servizio, non ricevono mai una risposta.La chiamata EWS tramite l'API gestita 2.2 non restituisce mai

Stiamo impostando un timeout esplicito, le chiamate di servizio circostanti con registrazione e utilizzano l'ascolto di traccia EWS. L'ascoltatore mostra il messaggio SOAP EWSRequest e il gioco è fatto. La registrazione mostra la voce di registro "prima della chiamata di servizio" ma non la voce "dopo la chiamata di servizio".

sospettavo limitazione potrebbe essere dietro di esso e hanno temporaneamente rimossi i limiti EWS di limitazione per alcun effetto e, in ogni caso, mi aspetto una risposta di errore se throttling scalciava in.

Questo è come il servizio viene inizializzato :

public ExchangeWebService(string username, string password, string emailAddress, string exchangeUrl, string exchangeVersion) 
{ 
    ExchangeVersion exVersion = (ExchangeVersion)Enum.Parse(typeof(ExchangeVersion), exchangeVersion); 
    _exchangeService = CreateExchangeService(username, password, emailAddress, exchangeUrl, exVersion); 
    _exchangeService.Timeout = 30000;   
} 

private static ExchangeService CreateExchangeService(string username, string password, string emailAddress, 
                  string exchangeUrl, ExchangeVersion exchangeVersion) 
{ 

    IntegrationLogging _il = new IntegrationLogging(Constants.LoggingSourceName); 

    ExchangeService service = new ExchangeService(exchangeVersion); 
      QualifiedUserName qualifiedName = new QualifiedUserName(username); 
    NetworkCredential credentials = new NetworkCredential(qualifiedName.UserName, password); 

    if (qualifiedName.HasDomain) 
    { 
     credentials.Domain = qualifiedName.Domain; 
    } 

    service.Credentials = credentials; 

    if (string.IsNullOrEmpty(exchangeUrl)) 
    { 
     if (string.IsNullOrEmpty(emailAddress)) 
     { 
      throw new ArgumentException("emailAddress and exchangeUrl parameters cannot both be empty"); 
     } 
     else 
     { 
      _il.WriteTrace(string.Format("CreateExchangeService using auto discovery with email address {0} and user name {1}. {2}", emailAddress, username, Environment.StackTrace)); 
      service.AutodiscoverUrl(emailAddress); 
     } 
    } 
    else 
    { 
     _il.WriteTrace(string.Format("CreateExchangeService using EWS URI {0} and user name {1}", exchangeUrl, username)); 
     service.Url = new Uri(exchangeUrl); 
    } 

    return service; 
} 

Da uno dei metodi che non ritorna mai, si ottiene la prima voce di registro, ma non il secondo e il nostro monitor di perf mostra il filo ancora in corso alla linea della chiamata di servizio.

_il.WriteTrace("ConvertInternalIdToEwsId:mailboxAddress=" + mailboxAddress); 

AlternateIdBase _altBase = _exchangeService.ConvertId(_alternateId, IdFormat.EwsId); 

_il.WriteTrace("ConvertInternalIdToEwsId:Returned from call"); 

return ((AlternateId)_altBase).UniqueId; 

L'istanza di servizio è di tipo Microsoft.Exchange.WebServices.Data.ExchangeService.

Questo problema sembra essere intermittente. Come può una chiamata non risultare in una risposta, un'eccezione o un timeout?

+2

Avete controllato una traccia di rete, ad esempio fiddler o wireshark per vedere se la chiamata viene inviata al server? O se viene ricevuta una risposta? – tjleigh

+0

La tua applicazione è multi-threaded? –

+0

@YacoubMassad Ciao Yacoub. Sì. Sebbene, credo che solo un thread stia tentando di accedere al servizio alla volta. Cosa stai pensando? – Simon

risposta

0

Hey Io doppio controllo quando io sono in ufficio ... ma aveva un problema simile ...

Nel mio caso si fa alla fine tornare, ha dovuto lasciare per parecchio tempo.

Ho avuto il mio avvolto in un tentativo/cattura, e mettere un punto di rottura sul fermo.

Non ricordo, ma penso che questo sia accaduto quando stavo usando l'indirizzo email auto discovery sbagliato.

try 
{ 
    service.AutodiscoverUrl(emailAddress); 
} 
catch (Exception) 
{ //break point here and leave for at least 10 min 
    throw; 
} 
Problemi correlati