2017-07-29 55 views
1

我開發了一個使用MailKit和MimeKit與IMAP4郵件服務器交互的自定義​​類。它的工作就像一個魅力,但我最近注意到的東西,讓我感到有點不舒服:試圖連接到一個沒有任何郵件服務器的主機名時奇怪的超時行爲

看起來像是如果你具體的主機存在,但沒有郵件服務器,它試圖連接大約30秒,最後拋出一個異常,這是在這裏引用。這感覺就像是試圖尋找一個郵件服務器,但沒有人回覆它,它會變得有點「失落」。

我將Timeout屬性設置爲5000ms,但看起來它只適用於一次連接。

事情是......有沒有什麼辦法通過.NET本身來控制上層的「層」,或者這應該被認爲是MailKit的bug?

調用來連接:

imap.ServerCertificateValidationCallback = (s, c, h, e) => true; 
imap.Connect(hostname, puerto, SecureSocketOptions.SslOnConnect); 
imap.Authenticate(username, password); 

異常堆棧跟蹤:

en System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    en System.Net.Sockets.Socket.Connect(EndPoint remoteEP) 
    en System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port) 
    en MailKit.Net.Imap.ImapClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken) 
    en Utilities.Imap4.Imap.Connect(String hostname, String username, String password, ConnectionType secure, Int32 port) en xxxx\Imap4\Imap4\Imap4.cs:línea 121 

回答

1

Timeout屬性不影響連接方法和事實證明,在一個Socket超時屬性有相同的限制。有一個關於如何在超時後中止Socket.Connect()的StackOverflow答案,但它有點難看。您可以實現該答案,然後調用ImapClient.Connect()並將它傳遞給Socket。

+0

謝謝你的回覆,Jeffrey!我會試一下! – Gonzo345

相關問題