Today at Seattle Code Camp day 2 -- Peter & Brad gave the attendees a taste of Dependency Injection via ObjectBuilder (which is part our CAB deliverable), TDD & Pair Programming, Model-View-Presenter, Monad and CAB. The slides for the presentation will be posted at Peter's site. Both Peter & Brad fielded a lot of questions on all of the above topics.
One of the attendees asked about our the Offline App Block & how would he replace the out of the box ConnectionDetectionStrategy (because the default implementation relies on wininet api's used by Internet Explorer). I couldn't find the original article & code that came with below implementation (I think this is from David), it illustrates how to ping a web service to check for connectivity. using System;using System.Runtime.InteropServices;using System.Xml.XPath;using System.IO;using System.Configuration;using Microsoft.ApplicationBlocks.Common;using Microsoft.ApplicationBlocks.SmartClient.Offline;using System.Web;using System.Net;
namespace Microsoft.Samples.OfflineSampleClient{ /// <summary> /// This is a simple implementation of a ConnectionDetectionStrategy. /// It periodically pings the web server to see if is available. /// </summary> public class PingWebServerStrategy : IConnectionDetectionStrategy, IProvider { private int pollInterval;
public const int MinimumPollingIntervalInSeconds = 1;
public PingWebServerStrategy() { }
/// <summary> /// Getter property to retrieve the polling interval in seconds /// </summary> /// <value>Polling interaval in seconds</value> public int PollInterval { get { return pollInterval; }}
/// <summary> /// Query method to cause provider to actively detect the connection state /// </summary> /// <returns>True if provider believes we are connected</returns> public bool IsConnected() { bool connected = true;
try { HttpWebRequest _webRequest2 = (HttpWebRequest)WebRequest.Create( "http://localhost/OfflineSampleWebService/OfflineSampleWebService.asmx" ); _webRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials; using ( HttpWebResponse myHttpWebResponse=(HttpWebResponse)_webRequest2.GetResponse() ) { if ( !_webRequest2.HaveResponse ) { connected = false; } } } catch( Exception ex ) { connected = false; }
return connected; }
/// <summary> /// IProvider.Initialize method implementation. Retrieves configuration information from app.config file /// </summary> /// <param name="configurationNode">XmlNode to parse for configuration information</param> public void Initialize(XPathNavigator configurationNode) { XPathNodeIterator iter = configurationNode.Select("pollingInterval"); iter.MoveNext();
pollInterval = GetCurrentPollingInterval(iter.Current.Value); if(pollInterval < MinimumPollingIntervalInSeconds) { throw new ConfigurationException(ProvidersResourceTable.GetString(ProvidersResourceTable.ConnectionManagerPollingIntervalMessage)); } }
private int GetCurrentPollingInterval( string pollingIntervalString ) { try { return Convert.ToInt32(pollingIntervalString); } catch( FormatException e ) { throw new ConfigurationException( ProvidersResourceTable.GetString( ProvidersResourceTable.PollingIntervalShouldBeNumeric ), e ); } } }}