//============================================================ // CLASS SUMMARY //============================================================ /// <summary> /// Provides example code for the TrackbackClient class. /// </summary> public static void ClassExample() { #region TrackbackClient // Initialize the Trackback peer-to-peer notification protocol client TrackbackClient client = new TrackbackClient(); client.Host = new Uri("http://www.example.com/trackback/5"); // Construct the trackback message to be sent TrackbackMessage message = new TrackbackMessage(new Uri("http://www.bar.com/")); message.Encoding = Encoding.UTF8; message.WeblogName = "Foo"; message.Title = "Foo Bar"; message.Excerpt = "My Excerpt"; // Send a synchronous trackback ping TrackbackResponse response = client.Send(message); // Verify response to the trackback ping if (response != null) { if (response.HasError) { // Use the TrackbackResponse.ErrorMessage property to determine the reason the trackback ping failed } } #endregion }
/// <summary> /// Sends the specified message to an Trackback server to execute an Trackback ping request. /// This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes. /// </summary> /// <param name="message">A <see cref="TrackbackMessage"/> that represents the information needed to execute the Trackback ping request.</param> /// <param name="userToken">A user-defined object that is passed to the method invoked when the asynchronous operation completes.</param> /// <remarks> /// <para> /// To receive notification when the Trackback ping request has been sent or the operation has been cancelled, add an event handler to the <see cref="SendCompleted"/> event. /// You can cancel a <see cref="SendAsync(TrackbackMessage, Object)"/> operation by calling the <see cref="SendAsyncCancel()"/> method. /// </para> /// </remarks> /// <exception cref="ArgumentNullException">The <paramref name="message"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="InvalidOperationException">The <see cref="Host"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception> /// <exception cref="InvalidOperationException">This <see cref="TrackbackClient"/> has a <see cref="SendAsync(TrackbackMessage, Object)"/> call in progress.</exception> //[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)] public void SendAsync(TrackbackMessage message, Object userToken) { Guard.ArgumentNotNull(message, "message"); if (this.Host == null) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The Host property has not been initialized. \n\r Message payload: {0}", message)); } else if (this.SendOperationInProgress) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The TrackbackClient has a SendAsync call in progress. \n\r Message payload: {0}", message)); } this.SendOperationInProgress = true; this.AsyncSendHasBeenCancelled = false; asyncHttpWebRequest = TrackbackClient.CreateWebRequest(this.Host, this.UserAgent, message, this.UseDefaultCredentials, this.clientOptions); object[] state = new object[6] { asyncHttpWebRequest, this, this.Host, message, this.clientOptions, userToken }; IAsyncResult result = asyncHttpWebRequest.BeginGetResponse(new AsyncCallback(AsyncSendCallback), state); ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(AsyncTimeoutCallback), state, this.Timeout, true); }
/// <summary> /// Called when a corresponding asynchronous send operation completes. /// </summary> /// <param name="result">The result of the asynchronous operation.</param> private static void AsyncSendCallback(IAsyncResult result) { TrackbackResponse response = null; WebRequest httpWebRequest = null; TrackbackClient client = null; Uri host = null; TrackbackMessage message = null; WebRequestOptions options = null; object userToken = null; if (result.IsCompleted) { object[] parameters = (object[])result.AsyncState; httpWebRequest = parameters[0] as WebRequest; client = parameters[1] as TrackbackClient; host = parameters[2] as Uri; message = parameters[3] as TrackbackMessage; options = parameters[4] as WebRequestOptions; userToken = parameters[5]; if (client != null) { WebResponse httpWebResponse = (WebResponse)httpWebRequest.EndGetResponse(result); response = new TrackbackResponse(httpWebResponse); client.OnMessageSent(new TrackbackMessageSentEventArgs(host, message, response, options, userToken)); client.SendOperationInProgress = false; } } }
//============================================================ // CALLBACK DELEGATE METHODS //============================================================ #region AsyncSendCallback(IAsyncResult result) /// <summary> /// Called when a corresponding asynchronous send operation completes. /// </summary> /// <param name="result">The result of the asynchronous operation.</param> private static void AsyncSendCallback(IAsyncResult result) { //------------------------------------------------------------ // Local members //------------------------------------------------------------ TrackbackResponse response = null; WebRequest httpWebRequest = null; TrackbackClient client = null; Uri host = null; TrackbackMessage message = null; WebRequestOptions options = null; object userToken = null; //------------------------------------------------------------ // Determine if the async send operation completed //------------------------------------------------------------ if (result.IsCompleted) { //------------------------------------------------------------ // Extract the send operations parameters from the user state //------------------------------------------------------------ object[] parameters = (object[])result.AsyncState; httpWebRequest = parameters[0] as WebRequest; client = parameters[1] as TrackbackClient; host = parameters[2] as Uri; message = parameters[3] as TrackbackMessage; options = parameters[4] as WebRequestOptions; userToken = parameters[5]; //------------------------------------------------------------ // Verify expected parameters were found //------------------------------------------------------------ if (client != null) { //------------------------------------------------------------ // Get the Trackback response to the Trackback ping request //------------------------------------------------------------ WebResponse httpWebResponse = (WebResponse)httpWebRequest.EndGetResponse(result); //------------------------------------------------------------ // Extract the Trackback response to the Trackback ping request //------------------------------------------------------------ response = new TrackbackResponse(httpWebResponse); //------------------------------------------------------------ // Raise SendCompleted event to notify registered handlers of state change //------------------------------------------------------------ client.OnMessageSent(new TrackbackMessageSentEventArgs(host, message, response, options, userToken)); //------------------------------------------------------------ // Reset async operation in progress indicator //------------------------------------------------------------ client.SendOperationInProgress = false; } } }
public void SendAsync(TrackbackMessage message, Object userToken) { //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(message, "message"); //------------------------------------------------------------ // Validate client state //------------------------------------------------------------ if (this.Host == null) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The Host property has not been initialized. \n\r Message payload: {0}", message)); } else if (this.SendOperationInProgress) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The TrackbackClient has a SendAsync call in progress. \n\r Message payload: {0}", message)); } //------------------------------------------------------------ // Set async operation tracking indicators //------------------------------------------------------------ this.SendOperationInProgress = true; this.AsyncSendHasBeenCancelled = false; //------------------------------------------------------------ // Build Trackback web request used to send the Trackback ping request //------------------------------------------------------------ asyncHttpWebRequest = TrackbackClient.CreateWebRequest(this.Host, this.UserAgent, message, this.UseDefaultCredentials, this.clientOptions); //------------------------------------------------------------ // Get the async response to the web request //------------------------------------------------------------ object[] state = new object[6] { asyncHttpWebRequest, this, this.Host, message, this.clientOptions, userToken }; IAsyncResult result = asyncHttpWebRequest.BeginGetResponse(new AsyncCallback(AsyncSendCallback), state); //------------------------------------------------------------ // Register the timeout callback //------------------------------------------------------------ ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(AsyncTimeoutCallback), state, this.Timeout, true); }
//============================================================ // PUBLIC METHODS //============================================================ #region Send(TrackbackMessage message) /// <summary> /// Sends the specified message to a Trackback server to execute an Trackback ping request. /// </summary> /// <param name="message">A <see cref="TrackbackMessage"/> that represents the information needed to execute the Trackback ping request.</param> /// <returns>A <see cref="TrackbackResponse"/> that represents the server's response to the Trackback ping request.</returns> /// <exception cref="ArgumentNullException">The <paramref name="message"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="InvalidOperationException">The <see cref="Host"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception> /// <exception cref="InvalidOperationException">This <see cref="TrackbackClient"/> has a <see cref="SendAsync(TrackbackMessage, Object)"/> call in progress.</exception> public TrackbackResponse Send(TrackbackMessage message) { //------------------------------------------------------------ // Local members //------------------------------------------------------------ TrackbackResponse response = null; //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(message, "message"); //------------------------------------------------------------ // Validate client state //------------------------------------------------------------ if (this.Host == null) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The Host property has not been initialized. \n\r Message payload: {0}", message)); } else if (this.SendOperationInProgress) { throw new InvalidOperationException(String.Format(null, "Unable to send Trackback message. The TrackbackClient has a SendAsync call in progress. \n\r Message payload: {0}", message)); } //------------------------------------------------------------ // Execute the Trackback ping request //------------------------------------------------------------ WebRequest webRequest = TrackbackClient.CreateWebRequest(this.Host, this.UserAgent, message, this.UseDefaultCredentials, this.clientOptions); using (WebResponse webResponse = (WebResponse)webRequest.GetResponse()) { response = new TrackbackResponse(webResponse); } return(response); }