2011-12-07 6 views
9

Sto utilizzando un "trucco" (ben descritto here) per memorizzare le mie e-mail sul server delle applicazioni durante il test.SpecifiedPickupDirectory non crea file finché non viene visualizzato da un utente sul server

mio file di configurazione simile a questo: esiste

<system.net> 
    <mailSettings>  
     <smtp deliveryMethod="SpecifiedPickupDirectory" from="[email protected]">  
      <specifiedPickupDirectory pickupDirectoryLocation="E:\EmailStore" />  
     </smtp> 
    </mailSettings> 
</system.net> 

La directory e non ha problemi di diritti.

Ecco il problema. I file non verranno creati finché non avrò accesso alla cartella sul server. Quindi all'improvviso bang tutti i file vengono inseriti nella directory.

Qualcuno ha idea di cosa sta succedendo?

Ho notato che c'è un'altra scelta - PickupDirectoryFromIis - ma non sono chiaro quando dovrei usare SpecifiedPickupDirectory e quando dovrei usare PickupDirectoryFromIis.

Qual è la differenza tra SpecifiedPickupDirectory e PickupDirectoryFromIis? Quando dovrei usarne uno sull'altro? È questa la causa dei file che non compaiono finché non navigo?

risposta

7

Questo progetto è stato migrato da ASP.NET 3.5 a ASP.NET 4.0

Sembra che System.Net.Mail.SmtpClient ora implementa IDisposable. Modificare il codice per utilizzare il seguente modello sembra aver risolto il problema.

La migliore ipotesi su causa era che il GC non veniva chiamato e che il buffer di file non veniva scaricato.

using (System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage()) 
{ 
    using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient()) 
    { 
     // code 
    } 
} 
0

Questo è strano. Usiamo SpecifiedPickupDirectory anche per i nostri dispositivi di prova, alle funzionalità di invio e ricezione di e-mail di test unitari. Tuttavia, manteniamo la directory sull'unità C: \. L'unità E: \ è mappata su un'unità di rete? O è locale? Hai provato a cambiarlo in una posizione in C: \? Hai lo stesso problema?

+0

E: \ è locale alla macchina. (L'intera macchina è virtuale, ma non dovrebbe essere importante.) La directory è configurata come unità condivisa (in modo che il team addetto al controllo qualità possa esaminare le e-mail.) – Hogan

0

ho provato a scrivere (e ottenere dal web anche) la differenza tra i metodi: http://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod.aspx

Network 

L'e-mail viene inviata tramite una connessione diretta al server SMTP specificato.

SpecifiedPickupDirectory 

Indica che directory specificata da PickupDirectoryLocation verrà utilizzato come directory di prelievo SMTP. Se il client SMTP non è in grado di scrivere sul percorso della directory di prelievo, viene generata un'eccezione I/O da Send. La directory non verrà creata se non esiste. Le credenziali del thread o processo attualmente in esecuzione verranno utilizzate per accedere alla directory. Questo è utile quando si dispone di un programma personalizzato esterno che raccoglie e-mail da quella cartella e li elabora

PickupDirectoryFromIis 

Il messaggio di posta elettronica viene preparata e il file EML viene salvato nella directory predefinita da cui IIS raccoglie e-mail in coda da inviare. Di default questo è: \ Inetpub \ mailroot \ Queue.

Tuttavia, quando si utilizzano il secondo e il terzo metodo di consegna, l'applicazione Web non può essere informata di eventuali errori che potrebbero verificarsi durante la trasmissione del messaggio, e sarà fino a IIS (o un altro agente di posta elettronica che potrebbe essere utilizzato) per gestirli. In generale, il metodo PickupDirectoryFromIis è il metodo preferito, a meno che l'applicazione ASP.NET non abbia il diritto di scrivere nelle cartelle di posta di IIS (verificare con il servizio del provider di hosting Web se non si utilizzano i propri server). Quindi, può essere un problema di autorizzazione?

+0

Grazie per la risposta, alcune note: ho il pieno controllo sul server e ha creato la directory con tutti i diritti per l'account del servizio e tutti gli amministratori locali e ha condiviso la directory con diritti di lettura per tutti gli utenti del dominio. La funzione di invio non ha errori. In effetti il ​​file viene salvato correttamente, tranne che succede più tardi quando accedo al server localmente e navigo nella directory. – Hogan

+0

Sto cercando il tuo problema, ma è davvero strano! Server virtuale e IIS 7 giusto? Quando si accede al server e si accede al percorso, si cammina per \\ nome-server \ share \ EmailStore? Spero che il registro del server possa dirti qualcosa; hai provato a cambiare E: \ EmailStore in \\ nome-server \ share \ EmailStore nel web.config? –

+0

No, devo accedere al server, quindi uso il browser "Computer" (dalla scheda di avvio) per navigare a 'E: \ EmailStore'. (Quando gli utenti esterni al server guardano a '\\ servername \ EmailStore' non vedono i file. – Hogan

Problemi correlati