private static void ResponseCallback( IAsyncResult result )
{
if ( Server.IsShuttingDown )
return;
HeartbeatRequestState state = ( HeartbeatRequestState )result.AsyncState;
try {
string responseText;
using ( HttpWebResponse response = ( HttpWebResponse )state.Request.EndGetResponse( result ) ) {
// ReSharper disable AssignNullToNotNullAttribute
using ( StreamReader responseReader = new StreamReader( response.GetResponseStream() ) ) {
// ReSharper restore AssignNullToNotNullAttribute
responseText = responseReader.ReadToEnd();
}
RaiseHeartbeatSentEvent( state.Data, response, responseText );
}
// try parse response as server Uri, if needed
if ( state.GetServerUri ) {
string replyString = responseText.Trim();
if ( replyString.StartsWith( "bad heartbeat", StringComparison.OrdinalIgnoreCase ) ) {
Logger.Log( LogType.Error, "Heartbeat: {0}", replyString );
} else {
try {
Uri newUri = new Uri( replyString );
Uri oldUri = Server.Uri;
if ( newUri != oldUri ) {
Server.Uri = newUri;
RaiseUriChangedEvent( oldUri, newUri );
}
} catch ( UriFormatException ) {
Logger.Log( LogType.Error,
"Heartbeat: Server replied with: {0}",
replyString );
}
}
}
} catch ( Exception ex ) {
if ( ex is WebException || ex is IOException ) {
Logger.Log( LogType.Warning,
"Heartbeat: {0} is probably down ({1})",
state.Request.RequestUri.Host,
ex.Message );
} else {
Logger.Log( LogType.Error, "Heartbeat: {0}", ex );
}
}
}