Recently I discovered that my desktop tool for memorizing English words doesn't work when a client is behind a proxy.
The problem was pretty common and I quickly found this awesome answer on stackoverflow. But still there were a few things to deal with:
1. Move all those hardcoded strings to config files.
2. Define proxy usage per binding.
3. Test the application.
First might be easily accomplished using ConfigurationManager class. Here is the code I got:
using System; using System.Configuration; using System.Net; using log4net; namespace VX.Desktop.Infrastructure { public class CustomProxy : IWebProxy { private const string CustomProxyAddressKey = "CustomProxyAddress"; private const string CustomProxyUserKey = "CustomProxyUser"; private const string CustomProxyPassword = "CustomProxyPassword"; private readonly ILog logger = LogManager.GetLogger(typeof (CustomProxy)); public Uri GetProxy(Uri destination) { var proxyAddress = ConfigurationManager.AppSettings[CustomProxyAddressKey]; if (string.IsNullOrEmpty(proxyAddress)) { logger.Error("Error retrieving CustomProxyAddress from configuration file. Make sure you have a corresponding key in appSettings section of application config file."); return null; } logger.InfoFormat("Proxy address: {0}", proxyAddress); return new Uri(proxyAddress); } public bool IsBypassed(Uri host) { logger.InfoFormat("IsBypassed for host: {0} is false", host); return false; } public ICredentials Credentials { get { logger.InfoFormat("Getting proxy credentials"); string userName = ConfigurationManager.AppSettings[CustomProxyUserKey]; string password = ConfigurationManager.AppSettings[CustomProxyPassword]; logger.InfoFormat("Done. {0}", userName); if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password)) { logger.Error( "Error retrieving proxy credentials from configuration file. Make sure you have corresponding keys in appSettings section of application config file."); } return new NetworkCredential(userName, password); } set { } } } }
Nice ways of addressing the second and the third issues are described here.
So we should use something like:
<bindings> <basicHttpBinding> <binding name="myBindingWithProxy" useDefaultWebProxy="true" /> </basicHttpBinding> </bindings>instead of
<defaultProxy enabled="true" useDefaultCredentials="false"> <module type = "SomeNameSpace.MyProxy, SomeAssembly" /> </defaultProxy>
Now we can use other bindings without any proxies. And to test all this stuff we can use a great tool - Fiddler. Just check the Rules -> Require Proxy Authentication option and you're done.
No comments:
Post a Comment