Тайм-аут операции выбрасывается с использованием WebDav - PullRequest
3 голосов
/ 28 мая 2010

Я создаю настольное приложение на C #, чтобы отправить уведомление по электронной почте группе подписавшихся пользователей. Я использую Webdav для реализации этой функции и использую OWA (Outlook Web Access), и все работает нормально до 33 почты, после чего Operation Timeout выдается исключение , Я могу повторно запустить свое приложение, чтобы отправлять электронные письма оставшимся пользователям, но снова после некоторых электронных писем снова возникают исключения. Конечно, я мог бы выполнить эту операцию за один проход. Я попытался добавить некоторое значение тайм-аута в мой объект HttpWebRequest, а также поместил некоторое значение Thread.Spleep после отправки каждого письма, чтобы каждый веб-запрос http не мешал следующему запросу. Но теперь я застрял в этом исключении тайм-аута и не знаю, как с ним справиться.

Одной из идей было бы то, что мой сеанс вошедшего в систему в owa истек, но я вхожу в систему каждый раз, когда отправляю новое электронное письмо.

Пожалуйста, не могли бы вы оказать мне некоторую помощь, если вы имели опыт работы с Web dav.

Редактировать: После ввода в таблицу данных всех адресов электронной почты назначения я зацикливаюсь на них и вызываю этот метод для отправки писем через 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;
            }
        }

Ответы [ 3 ]

3 голосов
/ 25 августа 2010

Используйте Fiddler, чтобы увидеть, что происходит.Также проверьте EventViewer.

http://forums.iis.net/p/1156153/1897467.aspx просто подводит итог тому, что я уже сказал.

1 голос
/ 22 августа 2010

Попробуйте также отправить заголовок «Keep-Alive», установив HttpWebRequest.KeepAlive в True

0 голосов
/ 22 декабря 2011

Попробуйте вызвать метод запроса закрытия.

Для вашего кода:

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

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

В моем случае это работает.

...