Configurar credenciales del proxy en el web.config

Si tenemos una aplicación que necesita hacer uso de Internet y nos encontramos con un proxy, es necesario especificar de alguna manera la dirección del mismo. Si además es necesario hacer uso de unas credenciales para que se nos autorice el acceso, debemos especificar más valores en la configuración.

Cuando solamente se realiza una llamada desde nuestro código a Internet, podemos pensar que esta podría ser una solución válida:

var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
var proxy = new WebProxy(Settings.Default.UrlProxy);

proxy.Credentials = new NetworkCredential(Settings.Default.UserProxy,
                                          Settings.Default.PasswordProxy,
                                          Settings.Default.DomainProxy);
httpWebRequest.Proxy = proxy;

Sin embargo, puede que esta no sea la forma más correcta cuando necesitamos hacer distintas peticiones en distintos puntos de nuestra aplicación. ¿Cuál sería la mejor solución? Definir un módulo dentro de la sección <defaultProxy> del archivo de configuración. En él especificaremos una clase donde implementaremos la interfaz IWebProxy como muestro a continuación:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Utils.Properties;

namespace Utils
{
    public class Proxy : IWebProxy
    {
        public ICredentials Credentials
        {
            get
            {
                return new NetworkCredential(Settings.Default.UserProxy,
                                            Settings.Default.PasswordProxy,
                                            Settings.Default.DomainProxy);
            }
            set { }
        }

        public Uri GetProxy(Uri destination)
        {
            return new Uri(Settings.Default.UrlProxy);
        }

        public bool IsBypassed(Uri host)
        {
            return false;
        }
    }
}

Por último, añadimos las siguientes líneas en el web.config, dentro de <configuration> para que, cada vez que creemos una petición con WebRequest, automáticamente utilice esta configuración.

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="Utils.Proxy, Utils" />
    </defaultProxy>
 </system.net>

¡Saludos!