2010-05-28 8 views
3

Je crée une application de bureau en C# pour envoyer une notification par courrier électronique à un ensemble d'utilisateurs abonnés. J'utilise Webdav pour implémenter cette fonction et en utilisant OWA (accès web Outlook) et tout fonctionne bien jusqu'à ce que le courrier électronique 33 puis 'Operation Timeout' exception est levée. Je peux réexécuter mon application pour envoyer des courriels aux utilisateurs restants, mais encore une fois après certains e-mails, des exceptions se produisent à nouveau. Bien sûr, je pourrais effectuer cette opération en une seule fois. J'ai essayé d'ajouter une valeur de délai d'attente à mon objet HttpWebRequest et de mettre également une valeur Thread.Spleep après l'envoi de chaque courrier afin que chaque requête web http n'interfère pas avec la requête suivante. Mais maintenant je suis coincé avec cette exception de timeout et je ne sais pas comment le gérer.Expiration du délai d'exécution à l'aide de WebDav

Une idée serait que ma session connectée dans owa a expiré mais je me connecte chaque fois que j'envoie un nouvel email.

S'il vous plaît pouvez-vous me fournir de l'aide si vous avez expérimenté avec Web dav.

Edit: Après avoir mis en DataTable toutes les adresses e-mail de destination je suis Looping throught eux et d'appeler cette méthode pour envoyer des emails par webdav

private bool SendingEmailWithDavAttachment(string subject, string body, string destionationEmailAddress, string filePath) 
     { 
      try 
      { 
       System.Net.HttpWebRequest PUTRequest; 
       System.Net.HttpWebRequest PUTRequest1; 
       System.Net.WebResponse PUTResponse; 
       System.Net.WebResponse PUTResponse1; 
       System.Net.HttpWebRequest PROPPATCHRequest; 
       System.Net.WebResponse PROPPATCHResponse; 
       System.Net.HttpWebRequest MOVERequest; 
       System.Net.WebResponse MOVEResponse; 
       System.Net.CredentialCache MyCredentialCache; 

       string strMailboxURI = ""; 
       string strSubURI = ""; 
       string strTempURI = ""; 
       string strServer = ConfigurationSettings.AppSettings["MailServer"].ToString(); 

       string strPassword = ConfigurationSettings.AppSettings["EmailPassword"].ToString(); 
       // "Mailbox folder where email is being sent from"; 
       string strAlias = ConfigurationSettings.AppSettings["EmailUsername"].ToString(); 

       string strTo = destionationEmailAddress; 

       string strSubject = subject; 
       string strBody = ""; 
       byte[] bytes = null; 

       System.IO.Stream PUTRequestStream = null; 
       System.IO.Stream PROPPATCHRequestStream = null; 
       System.IO.Stream PUTRequestStream1 = null; 

       strMailboxURI = "http://" + strServer + "/exchange/" + strAlias; 
       strSubURI = "http://" + strServer + "/exchange/" + strAlias + "/##DavMailSubmissionURI##/"; 
       strTempURI = "http://" + strServer + "/exchange/" + strAlias + "/drafts/" + strSubject + ".eml/"; 

       strBody = "To: " + strTo + "\n"; 
       strBody += "Subject: " + strSubject + "\n" + 
       "Date: " + System.DateTime.Now + 
       "X-Mailer: test mailer" + "\n" + 
       "MIME-Version: 1.0" + "\n" + 
       "Content-Type: text/html;" + "\n" + 
       "Charset = \"iso-8859-1\"" + "\n" + 
       "\n" + body; 

       MyCredentialCache = new System.Net.CredentialCache(); 
       MyCredentialCache.Add(new System.Uri(strMailboxURI), "Basic", new System.Net.NetworkCredential(strAlias, strPassword)); 

       PUTRequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strTempURI); 

       PUTRequest.Credentials = MyCredentialCache; 

       PUTRequest.Method = "PUT"; 
       bytes = Encoding.UTF8.GetBytes((string)strBody); 
       PUTRequest.ContentLength = bytes.Length; 
       PUTRequestStream = PUTRequest.GetRequestStream(); 
       PUTRequestStream.Write(bytes, 0, bytes.Length); 
       PUTRequestStream.Close(); 
       PUTRequest.ContentType = "message/rfc822"; 
       PUTRequest.KeepAlive = true; 
       PUTResponse = (System.Net.HttpWebResponse)PUTRequest.GetResponse(); 

       //Do the PROPPATCH 
       string strxml = "<?xml version='1.0'?>" + 
       "<d:propertyupdate xmlns:d='DAV:'>" + 
       "<d:set>" + 
       "<d:prop>" + 
       "<isCollection xmlns='DAV:'>False</isCollection>" + 
       "</d:prop>" + 
       "</d:set>" + 
       "</d:propertyupdate>"; 

       PROPPATCHRequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strTempURI); 
       PROPPATCHRequest.KeepAlive = true; 
       PROPPATCHRequest.Credentials = MyCredentialCache; 
       PROPPATCHRequest.Headers.Set("Translate", "f"); 
       PROPPATCHRequest.ContentType = "text/xml"; 
       PROPPATCHRequest.ContentLength = strxml.Length; 
       PROPPATCHRequest.Method = "PROPPATCH"; 
       byte[] PROPPATCHbytes = Encoding.UTF8.GetBytes(strxml); 
       PROPPATCHRequest.ContentLength = PROPPATCHbytes.Length; 
       PROPPATCHRequestStream = PROPPATCHRequest.GetRequestStream(); 
       PROPPATCHRequestStream.Write(PROPPATCHbytes, 0, PROPPATCHbytes.Length); 
       PROPPATCHRequestStream.Close(); 
       PROPPATCHResponse = (System.Net.HttpWebResponse)PROPPATCHRequest.GetResponse(); 

       string fileName = path.Substring(path.LastIndexOf("\\") + 1); 

       string attachURI = strTempURI + fileName; 
       PUTRequest1 = (System.Net.HttpWebRequest)HttpWebRequest.Create(attachURI); 
       PUTRequest1.Credentials = MyCredentialCache; 


       PUTRequest1.Method = "PUT"; 
       PUTRequest1.KeepAlive = true; 
       System.IO.FileStream inFile; 
       byte[] binaryData; 
       inFile = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
       binaryData = new Byte[inFile.Length]; 
       long bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length); 
       inFile.Close(); 
       PUTRequest1.ContentLength = binaryData.Length; 
       PUTRequestStream1 = PUTRequest1.GetRequestStream(); 
       PUTRequestStream1.Write(binaryData, 0, binaryData.Length); 
       PUTRequestStream1.Close(); 
       PUTResponse1 = (System.Net.HttpWebResponse)PUTRequest1.GetResponse(); 


       //Move File 
       MOVERequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strTempURI); 
       MOVERequest.Credentials = MyCredentialCache; 
       MOVERequest.Method = "MOVE"; 
       MOVERequest.Headers.Add("Destination", strSubURI); 
       MOVEResponse = (System.Net.HttpWebResponse)MOVERequest.GetResponse(); 

       return true; 
      } 
      catch (Exception ex) 
      { 
       //Log error occurrance 
       DataLayer.DataLayer.WriteErrorLog("MySource", String.Format("Email sending failed.Exception: {0}",ex.Message), DateTime.Now, destionationEmailAddress,"Failure"); 
       return false; 
      } 
     } 
+0

Pourriez-vous poster un extrait du code que vous avez? –

+0

J'ai édité ma question et ajouté la méthode que j'utilise pour effectuer le processus! – Blerta

+0

Avez-vous déjà résolu cela? Je cours dans le même problème en essayant de marquer des email comme READ. Après que les deux premiers soient traités, il se bloque, puis expire. –

Répondre

1

Essayez d'envoyer aussi « Keep-Alive » tête en mettant HttpWebRequest.KeepAlive-True

+0

Il ne fait que prolonger l'envoi de 33 à 40 avec succès, puis l'erreur Erreur de temporisation s'affiche à nouveau. – Blerta

0

Essayez d'appeler la méthode Close de demande.

Pour votre code:

PROPPATCHResponse = (System.Net.HttpWebResponse)PROPPATCHRequest.GetResponse(); 
PROPPATCHResponse.Close(); //<-- Invoke Close Method 

PUTResponse1 = (System.Net.HttpWebResponse)PUTRequest1.GetResponse(); 
PUTResponse1.Close();  //<-- Invoke Close Method 

Dans mon cas, cela fonctionne.