Nel progetto che sto realizzando (un progetto WinForms .NET) in sede di test ho riscontrato un problema, e cioè che il download di un file via http hostato da IIS non funziona se IIS non è configurato per l'accesso anonimo.

Il codice originario usato da me era:

try
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(stringRequest);
    webRequest.Credentials = CredentialCache.DefaultCredentials; 
// Diritti di accesso di default
    
webRequest.Proxy = WebProxy.GetDefaultProxy(); // Proxy di default
    
using(HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
    {
        
using(Stream instream = webResponse.GetResponseStream())
        {
            
// Download del file
        
}
    }
}
catch(WebException ex)
{
    Debug.WriteLine(ex.ToString();
}
catch(Exception ex)
{
    Debug.WriteLine(ex.ToString();

La cosa insidiosa è che questo codice non genera alcuna eccezione: semplicemente il file viene creato ma ha grandezza 0k.

Cercando nella documentazione MSDN ho trovato come configurare l'oggetto Credentials di WebRequest usando un CredentialCache customizzato; il codice di esempio preso dalla documentazione MSDN continua però a dare lo stesso problema:

CredentialCache credentials = new CredentialCache();
NetworkCredential nc = 
new NetworkCredential("username", "password");
credentials.Add(
new Uri("http://localhost/"), "Basic", nc);
credentials.Add(
new Uri("http://localhost/"), "Digest", nc);
webRequest.Credentials = credentials; 

Ho risolto modificando il codice precedente inserendo solo schema di autenticazione NTFS(ed eliminando "Basic" e "Digest" per motivi di sicurezza):

CredentialCache credentials = new CredentialCache();
NetworkCredential nc = 
new NetworkCredential("username", "password");
cred.Add(
new Uri("http://localhost/"), "NTLM", nc);
webRequest.Credentials = credentials; 

In questo modo il download viene effettuato correttamente.

Magari a qualcuno risparmierà mezz'ora di tempo...

powered by IMHO 1.2