using System; using System.IO; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Serialization; using UDDI.API; using UDDI; using UDDI.Diagnostics; namespace UDDI.Replication { [SoapDocumentService( ParameterStyle = SoapParameterStyle.Bare, RoutingStyle = SoapServiceRoutingStyle.RequestElement )] [WebService( Namespace=UDDI.Replication.Constants.Namespace )] public class ReplicationMessages { /// **************************************************************** /// public GetChangeRecords /// ---------------------------------------------------------------- /// /// Web method for getting change records /// /// ---------------------------------------------------------------- /// /// An instance of the get_changeRecords message /// /// ---------------------------------------------------------------- /// /// Returns a changeRecords element /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action = "\"\"", RequestElementName = "get_changeRecords" )] [UDDIExtension( transaction = true, https = true, certificate = true, messageType = "get_changeRecords" )] public ChangeRecordDetail GetChangeRecords( UDDI.Replication.GetChangeRecords message ) { // // Log more information than for a usual message to help diagnose possible replication errors. // StartOperatorMessageLog( "GetChangeRecords", message ); //Debug.Enter(); Debug.VerifySetting( "OperatorKey" ); // // Make sure the request is allowed by the communication graph. // ControlledMessage.Test( message.RequestingNode, Config.GetString( "OperatorKey" ), MessageType.GetChangeRecords ); // // Retrieve the change records. // ChangeRecordDetail detail = new ChangeRecordDetail(); try { detail = message.Get(); EndOperatorMessageLog( "GetChangeRecords", detail ); } catch( Exception e ) { DispositionReport.Throw( e ); EndOperatorMessageLog( "GetChangeRecords", e ); } //Debug.Leave(); return detail; } /// **************************************************************** /// public NotifyChangeRecordsAvailable /// ---------------------------------------------------------------- /// /// /// ---------------------------------------------------------------- /// /// An instance of the notify_changeRecordsAvailable message. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action = "\"\"", RequestElementName = "notify_changeRecordsAvailable" )] [UDDIExtension( transaction = true, https = true, certificate = true, messageType = "notify_changeRecordsAvailable" )] public DispositionReport NotifyChangeRecordsAvailable( UDDI.Replication.NotifyChangeRecordsAvailable message ) { // // Log more information than for a usual message to help diagnose possible replication errors. // StartOperatorMessageLog( "NotifyChangeRecordsAvailable", message ); //Debug.Enter(); Debug.VerifySetting( "OperatorKey" ); DispositionReport dr = new DispositionReport(); // // Make sure the request is allowed by the communication graph. // ControlledMessage.Test( message.NotifyingNode, Config.GetString( "OperatorKey" ), MessageType.GetChangeRecords ); try { message.Notify(); EndOperatorMessageLog( "NotifyChangeRecordsAvailable", null ); } catch( Exception e ) { DispositionReport.Throw( e ); EndOperatorMessageLog( "NotifyChangeRecordsAvailable", e ); } //Debug.Leave(); return dr; } /// **************************************************************** /// public DoPing /// ---------------------------------------------------------------- /// /// /// ---------------------------------------------------------------- /// /// An instance of the do_ping message /// /// ---------------------------------------------------------------- /// /// Returns an operator element with details on this operator /// node. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action = "\"\"", RequestElementName = "do_ping" )] [UDDIExtension( transaction = true, https = true, certificate = true, messageType = "do_ping" )] [return: XmlElement( "operatorNodeID", Namespace=UDDI.Replication.Constants.Namespace, IsNullable=false )] public string DoPing( UDDI.Replication.DoPing message ) { StartOperatorMessageLog( "DoPing", message ); //Debug.Enter(); // // Retrieve the change records. // string detail = null; try { detail = message.Ping(); EndOperatorMessageLog( "DoPing", detail ); } catch( Exception e ) { DispositionReport.Throw( e ); EndOperatorMessageLog( "DoPing", e ); } //Debug.Leave(); return detail; } /// **************************************************************** /// public GetHighWaterMarks /// ---------------------------------------------------------------- /// /// /// ---------------------------------------------------------------- /// /// An instance of the get_highWaterMarks message /// /// ---------------------------------------------------------------- /// /// Returns a list of high water marks seen by this node. /// /// **************************************************************** /// [WebMethod, SoapDocumentMethod( Action = "\"\"", RequestElementName = "get_highWaterMarks" )] [UDDIExtension( transaction = true, https = true, certificate = true, messageType = "get_highWaterMarks" )] public HighWaterMarkDetail GetHighWaterMarks( UDDI.Replication.GetHighWaterMarks message ) { // // Log more information than for a usual message to help diagnose possible replication errors. // StartOperatorMessageLog( "GetHighWaterMarks", message ); //Debug.Enter(); // // Retrieve the change records. // HighWaterMarkDetail detail = null; try { detail = message.Get(); EndOperatorMessageLog( "GetHighWaterMarks", detail ); } catch( Exception e ) { DispositionReport.Throw( e ); EndOperatorMessageLog( "GetHighWaterMarks", e ); } //Debug.Leave(); return detail; } // // The methods below help us log more information about the replication requests. We need this information in order // to diagnose any possible problems that we have when replicating with other nodes. // private void StartOperatorMessageLog( string operationName, object message ) { WriteOperatorMessage( "Started " + operationName + " request at ", message ); } private void EndOperatorMessageLog( string operationName, object response ) { WriteOperatorMessage( "Ended " + operationName + " request at ", response ); } private void WriteOperatorMessage( string message, object payload ) { UTF8EncodedStringWriter writer = new UTF8EncodedStringWriter(); writer.Write( message ); writer.Write( " " ); writer.WriteLine( DateTime.Now ); writer.WriteLine( "\r\nRaw Request:" ); writer.WriteLine( "" ); if( null != payload ) { try { XmlSerializer serializer = new XmlSerializer( payload.GetType() ); serializer.Serialize( writer, payload ); } catch { writer.WriteLine( "Unable to serialize payload." ); } finally { writer.Close(); } } Debug.OperatorMessage( SeverityType.Info, CategoryType.Replication, OperatorMessageType.None, writer.ToString() ); } } }