DCSIMG
What’s new in WCF 4.5? WebSocket support (Part 2 of 2) - Ido Flatow's Blog Veni Vidi Scripsi

Ido Flatow's Blog

Veni Vidi Scripsi

News

Have you heard me speak?
Powered
<style type='text/css' media='screen' id='sm_css'> #smix {overflow: visible;height: auto;border-radius: 10px;max-width: 250px;background-color: #323232;text-align: left;font-size: 12px;line-height: 16px;font-family:'Lucida Sans Unicode','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;} #smix a {color: #0056CC;text-decoration: none;} #smix .sm_head {color: #fff; line-height: 1em;font-size: 1.4em;padding: 10px;color: #fff;} #smix .sm_lanyard_wrapper {background-color: #fff;;clear: both;width: 97%;margin: 0 auto;margin-bottom: 0px;} #smix .sm_lanyard_content {padding: 7px;}#smix button.sm_rec, #smix a.sm_rec, #smix input[type=submit].sm_rec { padding: 6px 10px; -webkit-border-radius: 2px 2px;-moz-border-radius: 2px; border-radius: 2px; border: solid 1px rgb(153, 153, 153); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(221, 221, 221))); color: #333; text-decoration: none; cursor: pointer; display: inline-block; text-align: center; text-shadow: 0px 1px 1px rgba(255,255,255,1); line-height: 1; }#smix .sm_rec:hover { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(248, 248, 248)), to(rgb(221, 221, 221))); }#smix .sm_rec:active { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(204, 204, 204)), to(rgb(221, 221, 221))); }#smix .sm_rec.medium { padding: 3px 7px; font-size: 13px; }#smix .sm_rec span.icon.thumbs_up {background-position: 0px 36px;vertical-align: text-top;display: inline-block;margin-right: 4px;height: 18px;width: 16px;background-image: url(http://speakermix.com/images/new/thumbsold.png);}#smix .sm_rec:hover span.icon.thumbs_up {background-position: 0px 18px;} #smix .sm_events {padding:2px 0px 4px 0px;} #smix .sm_section {font-size: 10px; border-bottom: 1px solid silver; margin-bottom: 6px;} #smix .sm_subline {font-size:120%;margin-top:4px;font-weight:bold} #smix .powered {text-align: right} #smix .powered img {margin: 7px} </style>
Sela Technology Center

Advertisement

What’s new in WCF 4.5? WebSocket support (Part 2 of 2)

It’s time for post No. 12 in the WCF 4.5 series. Part 1 of 2 was about WebSocket support with SOAP-based messages. Part 2 is about WebSocket support with plain text messages that enables the interaction between web browsers and WCF.

Previous posts:

1. What’s new in WCF 4.5? let’s start with WCF configuration

2. What’s new in WCF 4.5? a single WSDL file

3. What’s new in WCF 4.5? Configuration tooltips and intellisense in config files

4. What’s new in WCF 4.5? Configuration validations

5. What’s new in WCF 4.5? Multiple authentication support on a single endpoint in IIS

6. What’s new in WCF 4.5? Automatic HTTPS endpoint for IIS

7. What’s new in WCF 4.5? BasicHttpsBinding

8. What’s new in WCF 4.5? Changed default for ASP.NET compatibility mode

9. What’s new in WCF 4.5? Improved streaming in IIS hosting

10. What’s new in WCF 4.5? UDP transport support

11. What’s new in WCF 4.5? WebSocket support (Part 1 of 2)

If you haven’t read part 1, please go over it first so you can get the gist about WebSockets, NetHttpBinding, and how it is used in WCF.

In part 1 I demonstrated how to create both binary encoded SOAP bindings and text encoded SOAP bindings with WebSockets. Problem is that in JavaScript it can get difficult to create and parse SOAP messages - this is why we tend to use XML/JSON based bindings (such as WebHttpBinding) instead of SOAP-based bindings (BasicHttpBinding/WsHttpBinding) when calling WCF services from JavaScript.

Creating a duplex service with WebSockets, NetHttpBinding, and plain text messages, is just like creating any other WCF service:

  1. Define the contract and callback contract
  2. Implement the service
  3. Configure the host
  4. Consume the service from a client app

First we will create our contract. Since we need to receive and send messages, we will create a duplex contract, each contract with a single method which we will mark with action=”*”:

Contracts
  1. [ServiceContract]
  2. public interface IWebSocketEchoCallback
  3. {        
  4.     [OperationContract(IsOneWay = true, Action = "*")]        
  5.     void Send(Message message);
  6. }
  7. [ServiceContract(CallbackContract = typeof(IWebSocketEchoCallback))]
  8. public interface IWebSocketEcho
  9. {
  10.     [OperationContract(IsOneWay = true, Action = "*")]
  11.     void Receive(Message message);
  12. }

The echo service itself is a simple implementation that receives the message and sends it back to the client:

EchoService
  1. public class EchoService : IWebSocketEcho
  2.     {
  3.         IWebSocketEchoCallback _callback = null;
  4.         public EchoService()
  5.         {
  6.             _callback =
  7.                 OperationContext.Current.GetCallbackChannel<IWebSocketEchoCallback>();
  8.         }
  9.         public void Receive(Message message)
  10.         {
  11.             if (message == null)
  12.             {
  13.                 throw new ArgumentNullException("message");
  14.             }
  15.             WebSocketMessageProperty property =
  16.                 (WebSocketMessageProperty)message.Properties["WebSocketMessageProperty"];
  17.             WebSocketContext context = property.WebSocketContext;
  18.             var queryParameters = HttpUtility.ParseQueryString(context.RequestUri.Query);
  19.             string content = string.Empty;
  20.             if (!message.IsEmpty)
  21.             {
  22.                 byte[] body = message.GetBody<byte[]>();
  23.                 content = Encoding.UTF8.GetString(body);                
  24.             }
  25.             // Do something with the content/queryParams
  26.             // ...
  27.             
  28.             string str = null;
  29.             if (string.IsNullOrEmpty(content)) // Connection open message
  30.             {
  31.                 str = "Opening connection from user " +
  32.                     queryParameters["Name"].ToString();                
  33.             }
  34.             else // Message received from client
  35.             {
  36.                 str = "Received message: " + content;                
  37.             }
  38.             _callback.Send(CreateMessage(str));            
  39.         }
  40.         private Message CreateMessage(string content)
  41.         {
  42.             Message message = ByteStreamMessage.CreateMessage(
  43.                 new ArraySegment<byte>(
  44.                     Encoding.UTF8.GetBytes(content)));
  45.             message.Properties["WebSocketMessageProperty"] =
  46.                 new WebSocketMessageProperty
  47.                 { MessageType = WebSocketMessageType.Text };
  48.                         
  49.             return message;
  50.         }
  51.     }

The Receive method handles two types of calls:

1. The first “connection upgrade” message – when the client first connects to the service and tries to upgrade the connection from HTTP to WebSocket. In this call the request is sent using HTTP GET, and therefore there is no body, but we can access the URL’s query string.

2. The second message and on are the messages being sent by the client over the WebSocket transport – these messages contain a message body, with no special query string.

Line 5-9 shows how to create a standard duplex service by storing the callback channel in a local variable. The callback channel will be used later on in the code in order to send messages back to the client. The service uses the default instancing mode which is PerSession, so a new instance will be created for each client, and the local variable will point to a different callback channel in each service instance.

Lines 17-27 demonstrates the technique of parsing the message – either by checking its query string or by reading the byte array from the message and transforming it to a string.

Lines 32-43 checks which type of message is being handled, the first connection request, or a consequent message from the client. In each case the service responds by echoing the message back to the client.

Line 46-56 demonstrates how to create a Message object with a simple string content when using the byte stream encoding.

Note: to use the ByteStreamMessage type, add a reference to the System.ServiceModel.Channels assembly.

Note: WebSocket messages can be either text or binary, so if you are planning on using binary messages you will need to change the code to work with byte arrays instead of strings.

Now that we have the contracts and the service, we need to define our host and endpoint. In this example I will use IIS as the host and I will use the routing mechanism of ASP.NET to create a service URL address that doesn’t contain the annoying “.svc” extension. The following global.asax code shows how to do that:

Global.Asax
  1. public class Global : System.Web.HttpApplication
  2. {
  3.     protected void Application_Start(object sender, EventArgs e)
  4.     {
  5.         RouteTable.Routes.Add(new ServiceRoute("echo",
  6.             new ServiceHostFactory(),
  7.             typeof(EchoService)));
  8.     }
  9. }

And now for the endpoint configuration. Since NetHttpBinding uses SOAP messages, and there is no “WebSocketHttpBinding” for passing plain byte streams, we need to create a custom binding that will allow us to receive messages over WebSocket where the message can either be a text message or a binary message (the WebSocket API supports both types).

The standard encodings of WCF - text, binary, and MTOM, will not enable us to receive non-SOAP byte streams, that is why we need to use a new encoding which was introduced in WCF 4 – the ByteStreamMessageEncoding.

The following endpoint and binding configuration will allow us to open a WebSocket listener that receives simple byte streams:

Service Configuration
  1. <system.serviceModel>
  2.     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  3.                                multipleSiteBindingsEnabled="true" />
  4.     <services>
  5.       <service name="UsingWebSockets.EchoService">
  6.         <endpoint address=""
  7.                   binding="customBinding"
  8.                   bindingConfiguration="webSocket"
  9.                   contract="UsingWebSockets.IWebSocketEcho" />
  10.       </service>
  11.     </services>
  12.     <bindings>
  13.       <customBinding>
  14.         <binding name="webSocket">          
  15.           <byteStreamMessageEncoding/>            
  16.           <httpTransport>            
  17.             <webSocketSettings transportUsage="Always"
  18.                                createNotificationOnConnection="true"/>
  19.           </httpTransport>
  20.         </binding>
  21.       </customBinding>
  22.     </bindings>
  23.   </system.serviceModel>

The important part in the configuration is lines 13-21:

1. We set the transportUsage to Always to force the usage of WebSocket rather than HTTP.

2. We set the createNotificationOnConnection to true to allow our Receive method to be invoked for the connection request message (the first GET request which is sent to the service).

3. We use the byteStreamMessageEncoding which allows the service to receive simple byte streams as input instead of complex SOAP structures.

To test our code we can add an HTML page to our project. The following code is based on the StockTicker demo from the HTML5 Labs website:

Echo Client
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title>Echo Demo</title>
  5.     <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
  6.     <script>
  7.         $(document).ready(function () {
  8.             if (!window.WebSocket && window.MozWebSocket) {
  9.                 window.WebSocket = window.MozWebSocket;
  10.             }
  11.             $('#echoForm').submit(function (event) {
  12.                 $('#echoForm')
  13.                     .add('#echoForm > *')
  14.                     .attr('disabled', 'disabled');
  15.                 var uri = 'ws://' + window.location.hostname +
  16.                     window.location.pathname.replace('EchoDemo.html', 'echo') +
  17.                     '?Name=' + $("#name").val();
  18.                 connect(uri);
  19.                 event.preventDefault();
  20.             });
  21.         });
  22.         function connect(uri) {
  23.             $('#messages').prepend('<div>Connecting...</div>');
  24.             var websocket = new WebSocket(uri);
  25.             
  26.             websocket.onopen = function () {
  27.                 window.focus();
  28.                 $('#echoForm').hide();
  29.                 $('#outputArea').show();
  30.                 window.setInterval(function()
  31.                 {
  32.                    websocket.send("the time is " + new Date());
  33.                 }, 1000);                
  34.                 $('#messages').html(
  35.                     '<div>Connected. Waiting for messages...</div>');
  36.             };
  37.             websocket.onclose = function () {
  38.                 if (document.readyState == "complete") {
  39.                     var warn = $('<div>').html(
  40.                         'Connection lost. Refresh the page to start again.').
  41.                         css('color', 'red');
  42.                     $('#messages').append(warn);
  43.                 }
  44.             };
  45.             websocket.onmessage = function (event) {
  46.                 $("#messages").append(event.data + "<br>");
  47.             };
  48.         };
  49. </script>
  50. </head>
  51. <body>
  52.     <form id="echoForm" action="">
  53.     <input type="text" id="name" placeholder="type your name" />
  54.     </form>
  55.             <div id="outputArea" style="display: none">
  56.         <div id="messages" style="height: 80%; overflow: hidden">
  57.         </div>
  58.     </div>
  59. </body>
  60. </html>

Most of the above code is jQuery stuff to handle the incoming message, so let’s point out the important parts:

Lines 18-20 – In these lines we create the URI of the service. Note the use of the ws:// scheme – this is the scheme of WebSocket, but it works just fine even when our service base address is set to HTTP.

Lines 27-56 – the connect function basically does all the rest. The WebSocket functions are based on the WebSocket API

  • Line 30 – create the WebSocket object
  • Lines 32-42 – open the connection
  • Lines 36-49 – run a function every 1 second that sends the current time to the service
  • Lines 44-51 – handle the WebSocket channel closing
  • Lines 53-55 – handle a received message (a message sent from the service to the client)

Running the client will show the following output:

image

To conclude, in order to create a service that can receive and send message to browsers using WebSockets we need to do the following:

  1. Create the duplex contract which contains a simple Receive and Send methods (or any other names you like).
  2. Implement the contract in a service like you’ll implement any other duplex service. The only thing you need to take care of is how to read and write the message.
  3. Create an endpoint which uses a custom binding which supports WebSockets and simple byte-stream encoding.

Although the above works quite well, there is another way to create this type of service – by creating a service class that inherits from the Microsoft.WebSockets.WebSocketService type. The Microsoft.WebSockets package, available from NuGet, enables the creation of WebSocket-based services. Once inheriting your service from WebSocketService, you can override methods such as OnMessage, OnOpen, OnClose, and OnError. Working with these methods is quite easy, as demonstrated in the following code:

EchoService2
  1. public class EchoService2 :
  2.      Microsoft.ServiceModel.WebSockets.WebSocketService
  3.  {
  4.      public override void OnMessage(string message)
  5.      {
  6.          string str = "Received message: " + message;
  7.          Send(str);
  8.      }
  9.      
  10.      public override void OnOpen()
  11.      {
  12.          var queryParameters = this.QueryParameters;
  13.          string str = "Opening connection from user " +
  14.              queryParameters["Name"].ToString();
  15.           Send(str);                        
  16.      }
  17.      protected override void OnClose()
  18.      {
  19.          base.OnClose();            
  20.      }
  21.      protected override void OnError()
  22.      {
  23.          base.OnError();            
  24.      }
  25.  }

As you can see, in this case you don’t have to work directly with byte arrays. In order to host this service you also don’t need to define a special endpoint configuration, as this package includes a WebSocketHost class that automatically creates and configures a WebSocket endpoint. To create a WebSocketHost and provide it to IIS, we need to create a class that inherits from ServiceHostFactory, as demonstrated in the following code :

WebSocketServiceHostFactory
  1. public class WebSocketServiceHostFactory : ServiceHostFactory
  2.   {
  3.       protected override ServiceHost CreateServiceHost(Type serviceType,
  4.           Uri[] baseAddresses)
  5.       {
  6.           var host = new WebSocketHost(serviceType, baseAddresses);
  7.           
  8.           host.AddWebSocketEndpoint();
  9.           return host;
  10.       }        
  11.   }    

Note: the ServiceHostFactory is declared in the System.ServiceModel.Activation assembly, so don’t forget to add a reference to it.

Once we have the new factory, we can register it with the routing mechanism (lines 5-7):

Global.Asax
  1. public class Global : System.Web.HttpApplication
  2.   {
  3.       protected void Application_Start(object sender, EventArgs e)
  4.       {
  5.           RouteTable.Routes.Add(new ServiceRoute("echo2",
  6.               new WebSocketServiceHostFactory(),
  7.               typeof(EchoService2)));
  8.           RouteTable.Routes.Add(new ServiceRoute("echo",
  9.               new ServiceHostFactory(),
  10.               typeof(EchoService)));
  11.       }
  12.   }

All is left is to change the client HTML code in line 19 to call the ‘echo2’ service instead of ‘echo’.

You can see more examples on how to use this package in Paul Batum’s blog post, and in his //BUILD session.

So as you can see, it is quite easy to create a WCF service that can receive messages from a browser and push messages to a browser by using WebSockets. Farewell long polling, I hope we never meet again Smile

You can download the above code (both versions) from my SkyDrive. The source code also includes a sample self-hosted WebSocket service and an HTML page that uses it instead of the IIS-hosted service.

Comments

Paul Batum said:

Great work Ido, these WebSocket posts are very accurate and informative. When people ask me about WebSockets in WCF, I'll send them here!

# March 7, 2012 1:36 AM

The Morning Brew - Chris Alcock » The Morning Brew #1060 said:

Pingback from  The Morning Brew - Chris Alcock  &raquo; The Morning Brew #1060

# March 8, 2012 10:41 AM

layos said:

Link to code appears broken. "This item might not exist or is no longer available" (anyway thanks for the usefull posts).

# July 6, 2012 1:08 PM

Straub said:

Yes! Finally someone writes about dresses.

# July 27, 2012 6:29 AM

Chat – Best way to fetch new message availability | t1u said:

Pingback from  Chat &#8211; Best way to fetch new message availability | t1u

# August 3, 2012 8:28 AM

Kirkwood said:

I'm curious to find out what blog system you are working with? I'm having some small security issues with my latest

blog and I'd like to find something more safe. Do you have any suggestions?

# September 4, 2012 1:28 AM

José said:

Thanks for the tutorial!

The link to source code isn't available. Can you correct the link? Thanks.

# September 7, 2012 1:47 PM

Ido Flatow said:

Link has been fixed, thanks for noticing

# September 13, 2012 12:57 PM

Beach said:

I loved as much as you will receive carried

out right here. The sketch is attractive, your authored subject matter stylish.

nonetheless, you command get bought an shakiness over that you

wish be delivering the following. unwell unquestionably come more formerly again as exactly the same nearly a lot often

inside case you shield this hike.

# September 14, 2012 10:22 AM

DL said:

I used the "Echo" method,but the max clients number is 10,How can i solve it?

# September 20, 2012 10:51 AM

How to solve web socket client connection numbers limit | Jisku.com - Developers Network said:

Pingback from  How to solve web socket client connection numbers limit | Jisku.com - Developers Network

# September 20, 2012 12:16 PM

Ido Flatow said:

Hi DL,

Have you tested the WCF service using IIS 8 on Windows 8? IIS on Desktop OSs supports up to 10 concurrent connections. IIS on Server OSs (Windows Server 2012) doesn't have that limitation.

You can also install IIS 8 Express, if i'm not mistaken, it also doesn't have the 10 connections limitation.

# September 20, 2012 1:00 PM

Jamieson said:

Thank you, I have recently been looking for info about

this subject for ages and yours is the best

I've came upon so far. But, what about the bottom line? Are you certain in regards to the source?

# October 9, 2012 9:07 AM

Real Estate Investor Confidence Growing in Atlanta | Bbc News Weather said:

Pingback from  Real Estate Investor Confidence Growing in Atlanta | Bbc News Weather

# October 11, 2012 6:47 AM

Hamby said:

If you would like to increase your know-how only keep visiting this web page and be updated with the latest information posted here.

# November 10, 2012 2:13 AM

pligg.com said:

Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies (HPC, Azure...) Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies

# November 10, 2012 10:36 AM

bookmarking1.com said:

Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies (HPC, Azure...) Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies

# November 10, 2012 1:48 PM

pligg.com said:

Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies (HPC, Azure...) Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies

# November 15, 2012 12:11 PM

Ellington said:

I pay a quick visit day-to-day a few websites and sites

to read articles or reviews, except this web site gives feature

based posts.

# November 18, 2012 6:48 PM

pligg.com said:

Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies (HPC, Azure...) Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies

# November 18, 2012 9:47 PM

pligg.com said:

Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies (HPC, Azure...) Ido Flatow's blog about .NET technologies (WCF, ASP.NET, Silverlight, Entity Framework) and other Microsoft technologies

# November 19, 2012 1:21 AM

Conte said:

Can I simply just say what a comfort to uncover someone who really understands what they're discussing on the net. You actually realize how to bring a problem to light and make it important. A lot more people have to look at this and understand this side of the story. I can't believe you

are not more popular because you most certainly have the gift.

# November 19, 2012 1:42 AM

Leone said:

Awesome post.

# November 19, 2012 9:02 AM

Griggs said:

It's truly very complicated in this busy life to listen news on Television, thus I simply use internet for that purpose, and obtain the most recent news.

# November 19, 2012 9:13 AM

Croft said:

Wow! After all I got a website from where I can actually get

useful information regarding my study and knowledge.

# November 21, 2012 12:09 AM

Valle said:

Thanks for sharing your thoughts on Ido Flatow WCF MOC HPC Azure Entity Framework Silvelright.

Regards

# November 21, 2012 1:04 AM

Collette said:

I'm not sure why but this blog is loading extremely slow for me. Is anyone else having this issue or is it a problem on my end? I'll check back later on and see if the problem still exists.

# November 27, 2012 2:40 PM

Gilchrist said:

Excellent way of explaining, and good paragraph to obtain data concerning my presentation topic,

which i am going to present in college.

# December 1, 2012 11:22 PM

Medrano said:

I visit each day a few web pages and websites to read content, but this website provides quality based writing.

# December 6, 2012 8:52 AM

Saldana said:

My relatives all the time say that I am killing my

time here at web, but I know I am getting knowledge every day by reading such good articles.

# December 8, 2012 8:54 AM

Camp said:

This paragraph presents clear idea in favor of the new people of blogging, that

really how to do running a blog.

# December 11, 2012 8:45 AM

Reeyall said:

Thank you for the thoughtful reivew. The main advantage of html5 seems to be for embedding rich media such as audio and video in modern browsers. Although, the structure elements seem to be useful. CSS3 seems to be headed in the right direction, leaving many possibilities for implementation and creativity,

# December 11, 2012 7:58 PM

Balderas said:

Hello everyone, it's my first go to see at this site, and paragraph is truly fruitful in favor of me, keep up posting such posts.

# December 12, 2012 3:07 PM

Burr said:

It's awesome for me to have a web site, which is helpful in favor of my experience. thanks admin

# December 12, 2012 4:18 PM

Ross said:

It's in fact very complex in this full of activity life to listen news on TV, so I only use web for that reason, and obtain the newest information.

# December 13, 2012 12:30 PM

Langer said:

Remarkable issues here. I'm very satisfied to peer your article. Thanks a lot and I'm having a look forward to touch you.

Will you please drop me a e-mail?

# December 21, 2012 4:43 PM

Peterson said:

You actually make it seem so easy with your presentation but I find this matter to be really something which I think I would never understand.

It seems too complex and extremely broad for me. I am looking forward for

your next post, I'll try to get the hang of it!

# December 25, 2012 8:45 AM

Newkirk said:

I all the time emailed this blog post page to all my friends, since

if like to read it next my contacts will too.

# December 25, 2012 12:02 PM

Earle said:

Yes! Finally someone writes about accredited online

paralegal.

# January 2, 2013 2:30 PM

Starr said:

Of course to savor all of these benefits we have to sign up for a service that will provide them for us.

The dancing couple through this second dance told me the observer, "yes, we love to each other dearly and that we are really planning to have fun and revel in our lives together".

Insensitive: little concern for your needs with

the other person.

# January 2, 2013 2:52 PM

Gorham said:

A well thought-out plan, that's exhaustive enough and well-balanced, will help you to boost your online business. The dancing couple through this second dance believed to me the observer, "yes, we love to each other dearly and that we are really planning to have fun and get our lives together". Look calmly at what you will be reacting to without judgment.

# January 2, 2013 4:50 PM

Madigan said:

I am sure this paragraph has touched all the internet users, its really really good post

on building up new webpage.

# January 2, 2013 5:23 PM

Overton said:

I think the admin of this web site is truly working hard for his web page, since here every material is quality based information.

# January 3, 2013 9:20 PM

Clouse said:

If you desire to get much from this piece of writing then you have to apply these techniques

to your won website.

# January 4, 2013 11:37 AM

Nesbitt said:

You have to burn 3500 calories as a way to lose one pound of weight,

in order that would equal one pound of fat loss per week.

Mix all of the ingredients in a very pitcher; adjust the quantity of each ingredient for your desired taste.

Fat Burning Furnace is really a top-selling e - Book since it

has facilitated thousands of individuals to burn fat and sees their slim body again.

# January 4, 2013 8:57 PM

Philip said:

I can get your self-hosted service to work but anything hosted in IIS 8 doesnt. I have enabled the websockets module and http activation, but the server never responds to the upgrade message. Any ideas? I've been pulling my hair out for 3 days trying to get this to work. I've tested on my Windows 8 Pro 64 bit machine as well as a Server 2012 box and its the same story on both. I also disabled the IE10 extended security mode on  server 2012. I'm qute desperate to get this working and be able to present a Windows 8 solution for long polling. Please help!

# January 23, 2013 6:36 AM

Pearce said:

There is definately a great deal to know about this topic.

I love all the points you have made.

# January 26, 2013 5:42 AM

Simms said:

Hello, I log on to your blogs daily. Your story-telling style is awesome, keep up the good work!

# January 30, 2013 1:55 PM

Middleton said:

Excellent, what a web site it is! This web site provides

valuable data to us, keep it up.

# February 5, 2013 2:05 AM

lmzquwuyuam@gmail.com said:

Hello clarice

# February 18, 2013 11:25 PM

Camarillo said:

It's an awesome post in favor of all the online visitors; they will get benefit from it I am sure.

# February 27, 2013 12:09 PM

Baldridge said:

This piece of writing will help the internet people for building up new web site or even a weblog from start to end.

# March 4, 2013 10:22 PM

Mcafee said:

Hmm is anyone else experiencing problems with the images on this blog loading?

I'm trying to determine if its a problem on my end or if it's the blog.

Any responses would be greatly appreciated.

# March 6, 2013 1:13 AM

Waterman said:

Of the present G6 (US, Japan, Germany, UK, France and Italy), merely the US and Japan may be among the six largest economies in 2050.

During the 1920s, the contests of owning a utility company were met with the following system:.

The State failed to include jobs resulting from the hundreds of millions of dollars spent each year on exploration, engineering, environmental studies and the other

activities necessary to convert raw prospects into operating mines rolling around in its tally of Alaska's mining jobs.

# March 7, 2013 3:28 PM

Plunkett said:

You have made some decent points there. I looked on the

internet for more information about the issue and found most people will go along with your views on this

web site.

# March 8, 2013 8:31 AM

hzjeqyde@gmail.com said:

May be the nature of business forcing customers to work with internet banking? Or, is there something from it for the customers? Indeed there are many advantages to doing internet financial.

# March 14, 2013 5:34 AM

Reece said:

I am actually glad to read this web site posts which includes tons of

helpful data, thanks for providing such data.

# March 15, 2013 7:21 PM

David said:

Quality content is the key to attract the

visitors to go to see the site, that's what this web page is providing.

# March 18, 2013 12:08 AM

Reed said:

Hello! Someone in my Facebook group shared this site with

us so I came to look it over. I'm definitely enjoying the information. I'm bookmarking

and will be tweeting this to my followers! Superb blog and fantastic design.

# March 18, 2013 8:06 AM

Mclaughlin said:

Hello! I'm at work surfing around your blog from my new iphone 4! Just wanted to say I love reading through your blog and look forward to all your posts! Carry on the great work!

# March 20, 2013 3:51 PM

Hoover said:

Exceptional post however I was wondering if you

could write a litte more on this topic? I'd be very thankful if you could elaborate a little bit more. Appreciate it!

# March 23, 2013 11:42 PM

Flowers said:

Yes! Finally something about San Francisco.

# March 26, 2013 4:36 AM

Abel said:

Yes! Finally something about buy ray.

# March 29, 2013 7:20 PM

Chang said:

What a stuff of un-ambiguity and preserveness of precious familiarity about unpredicted feelings.

# March 31, 2013 3:47 AM

Dehart said:

This is a good tip especially to those fresh to the blogosphere.

Brief but very precise information… Appreciate your sharing this one.

A must read post!

# March 31, 2013 8:53 PM

Comeaux said:

Wonderful work! This is the kind of info that are supposed to

be shared across the internet. Shame on the seek engines for not positioning this put up higher!

Come on over and visit my web site . Thank you =)

# April 3, 2013 6:41 PM

Jerome said:

Hi there this is somewhat of off topic but

I was wanting to know if blogs use WYSIWYG editors or if

you have to manually code with HTML. I'm starting a blog soon but have no coding expertise so I wanted to get advice from someone with experience. Any help would be greatly appreciated!

# April 4, 2013 3:12 AM

Pritchett said:

Great post.

# April 4, 2013 9:21 AM

Burkhart said:

obviously like your website however you have to take a look at the spelling on quite

a few of your posts. Several of them are rife with spelling problems and

I to find it very bothersome to tell the truth nevertheless I'll certainly come back again.

# April 4, 2013 11:13 PM

Tong said:

Remarkable issues here. I am very happy to look

your article. Thank you a lot and I'm looking forward to contact you. Will you please drop me a mail?

# April 5, 2013 2:44 AM

Hitchcock said:

It's a pity you don't have a donate button! I'd without a doubt donate to this fantastic blog! I suppose for now i'll

settle for bookmarking and adding your RSS feed

to my Google account. I look forward to brand new updates and will share this website with my Facebook group.

Talk soon!

# April 6, 2013 5:32 AM

Mares said:

Hello, Neat post. There is a problem along with your site in internet explorer, would check this?

IE nonetheless is the marketplace leader and a good component

of other folks will miss your excellent writing because of this problem.

# April 6, 2013 7:31 PM

Villanueva said:

I will immediately take hold of your rss feed as

I can not to find your email subscription hyperlink or newsletter service.

Do you've any? Kindly allow me understand so that I may subscribe. Thanks.

# April 6, 2013 8:27 PM

Redmon said:

Hi there! Someone in my Myspace group shared this website with us so I came

to check it out. I'm definitely enjoying the information. I'm

bookmarking and will be tweeting this to my followers!

Terrific blog and superb style and design.

# April 6, 2013 11:05 PM

Rowell said:

Hi to every body, it's my first pay a visit of this blog; this web site includes amazing and really fine data designed for visitors.

# April 7, 2013 2:49 AM

Veal said:

Ridiculous story there. What happened after?

Thanks!

# April 7, 2013 3:34 AM

Gunn said:

It's very easy to find out any matter on net as compared to textbooks, as I found this post at this web page.

# April 7, 2013 3:39 PM

Newton said:

I love reading through a post that will make men and

women think. Also, thank you for allowing for me to comment!

# April 8, 2013 12:13 AM

Heaton said:

These are really wonderful ideas in about blogging.

You have touched some pleasant factors here. Any way keep up wrinting.

# April 8, 2013 8:29 PM

XRumerTest said:

Hello. And Bye.

# April 9, 2013 3:22 AM

Lange said:

I am truly glad to read this webpage posts which includes tons of useful facts,

thanks for providing such information.

# April 10, 2013 8:19 AM

Caudle said:

Hi! Do you use Twitter? I'd like to follow you if that would be okay. I'm definitely

enjoying your blog and look forward to new updates.

# April 11, 2013 6:16 AM

Napier said:

You've made some decent points there. I checked on the internet for more information about the issue and found most people will go along with your views on this site.

# April 11, 2013 1:57 PM

Hofmann said:

I'm very happy to uncover this great site. I want to to thank you for ones time just for this fantastic read!! I definitely really liked every part of it and i also have you saved as a favorite to check out new stuff on your website.

# April 12, 2013 7:17 PM

Tellez said:

Hi! I've been following your site for a while now and finally got the bravery to go ahead and give you a shout out from Huffman Tx! Just wanted to tell you keep up the fantastic work!

# April 12, 2013 7:42 PM

Fine said:

You could definitely see your enthusiasm within the article you write.

The arena hopes for more passionate writers such as you who are

not afraid to mention how they believe. Always follow your heart.

# April 13, 2013 9:09 PM

Felts said:

Good post. I learn something totally new and challenging on

sites I stumbleupon everyday. It will always be useful to

read articles from other writers and use something from other

websites.

# April 14, 2013 12:17 AM

Mccollum said:

I read this post completely concerning the comparison of newest and preceding technologies, it's remarkable article.

# April 14, 2013 3:37 PM

Mccall said:

Everything is very open with a precise explanation of the challenges.

It was really informative. Your site is extremely helpful.

Many thanks for sharing!

# April 14, 2013 9:37 PM

Treat said:

Hello just wanted to give you a brief heads up and let you know a few of the images aren't loading properly. I'm not

sure why but I think its a linking issue. I've tried it in two different internet browsers and both show the same results.

# April 15, 2013 1:11 AM

Michels said:

I got this site from my friend who told me about

this web page and now this time I am visiting this web page

and reading very informative content here.

# April 15, 2013 2:57 AM

Swope said:

Write more, thats all I have to say. Literally, it seems as

though you relied on the video to make your point. You clearly know what youre talking

about, why waste your intelligence on just posting videos to your blog when you

could be giving us something informative to read?

# April 15, 2013 8:17 AM

Rutter said:

Hello would you mind letting me know which web host you're working with? I've loaded your

blog in 3 different internet browsers and I must say

this blog loads a lot quicker then most. Can you suggest a good hosting provider at a fair price?

Thanks, I appreciate it!

# April 16, 2013 1:46 AM

Montoya said:

Wow that was odd. I just wrote an extremely long comment but after I clicked submit my comment didn't show up. Grrrr... well I'm not writing all that over again.

Anyways, just wanted to say excellent blog!

# April 16, 2013 2:30 AM

Espino said:

I like what you guys are usually up too. This sort of clever

work and reporting! Keep up the wonderful works guys I've incorporated you guys to my personal blogroll.

# April 17, 2013 1:29 AM

Schafer said:

Very soon this site will be famous among all blogging people, due to it's pleasant posts

# April 17, 2013 2:54 PM

Woodcock said:

I was able to find good information from your blog articles.

# April 18, 2013 5:25 AM

Pickens said:

Thanks for finally talking about >What’s new in WCF

4.5? WebSocket support (Part 2 of 2) - Ido Flatow's Blog Veni Vidi Scripsi <Loved it!

# April 19, 2013 5:33 AM

Cowles said:

We are a gaggle of volunteers and starting a brand new scheme in our community.

Your site provided us with useful info to work on. You've performed an impressive activity and our whole group shall be thankful to you.

# April 20, 2013 10:54 AM

Jouplette said:

is simply bliss inexpensive [url=http://www.biztomsoutlet.com]toms outlet[/url]  outlet toms  but nevertheless past too far to be able to [url=http://www.biztomsoutlet.com]tom s shoes[/url]  outlet onlin quit

# April 20, 2013 3:11 PM

Oliver said:

It's very effortless to find out any topic on net as compared to textbooks, as I found this paragraph at this website.

# April 20, 2013 5:30 PM

Pineda said:

I simply couldn't leave your web site before suggesting that I actually enjoyed the standard information an individual provide in your guests? Is gonna be back steadily in order to check out new posts

# April 21, 2013 2:31 AM

Ratliff said:

When I originally commented I clicked the "Notify me when new comments are added" checkbox

and now each time a comment is added I get three emails with the

same comment. Is there any way you can remove me from that service?

Bless you!

# April 21, 2013 2:40 AM

Delacruz said:

Remarkable! Its in fact awesome article, I have got much clear

idea on the topic of from this article.

# April 21, 2013 5:29 AM

Magana said:

Hello, i believe that i saw you visited my weblog so i got here to go

back the desire?.I'm attempting to in finding things to improve my website!I assume its adequate to use some of your ideas!!

# April 21, 2013 8:51 AM

Carbone said:

Just want to say your article is as surprising.

The clearness for your post is just excellent and i can suppose you're knowledgeable on this subject. Fine with your permission allow me to snatch your feed to stay up to date with approaching post. Thank you one million and please keep up the gratifying work.

# April 21, 2013 12:28 PM

Keeler said:

Just want to say your article is as surprising.

The clarity in your post is simply excellent and i can assume you are

an expert on this subject. Well with your permission allow me

to grab your feed to keep up to date with forthcoming post.

Thanks a million and please keep up the gratifying work.

# April 21, 2013 6:52 PM

Oconnor said:

This post will assist the internet people for setting up

new website or even a weblog from start to end.

# April 22, 2013 1:47 AM

Jouplette said:

the particular the actual boogie setting sun or perhaps in underneath [url=http://www.shoptomsonsale.com]cheap toms[/url]  shoes associated with my heart a little worried  simply because yang will be the of senzan gezhu disciples benefit regarding nature mountain 's standing has to be said that as well as the 2 gezhu cheap [url=http://www.shoptomsonsale.com]cheap toms[/url]  shoes toms outlet frost darkness

# April 22, 2013 8:34 AM

Jouplette said:

is with the mind of the [url=www.ustomsoutletstore.com]toms outlet online[/url]  shop feather court ten venerable position just row a legal court cheap toms outlet three gezhu by feather beneath  cheap toms shoes in addition to [url=www.ustomsoutletstore.com]toms outlet[/url]  on the internet closed face opened up

# April 22, 2013 10:55 AM

Jouplette said:

pan to call home [url=www.ustomsoutletstore.com]toms outlet store[/url]  shoes trace cruel toms retailer chuckle  but it's [url=www.ustomsoutletstore.com]toms outlet store[/url]  outlet bogged down

# April 22, 2013 3:21 PM

Jouplette said:

low-cost [url=www.cheapesttomssale.com]cheap toms sale[/url]  outlet wu ling be concerned cheap toms concerning his / her healing gangqi [url=www.cheapesttomssale.com]cheap toms sale[/url]  outlet underworld temple far away  as you practice all of us of spirit [url=www.cheapesttomssale.com]cheap toms outlet[/url]  outlet onlin hill

# April 22, 2013 5:33 PM

Jouplette said:

no more [url=www.saletomsforcheap.com]toms shoes[/url]  outlet toms online compared to low-cost [url=www.saletomsforcheap.com]toms for cheap[/url]  outlet the pink head accumulation intangibles  almost failed to drop down [url=www.saletomsforcheap.com]toms for cheap[/url]  outlet

# April 22, 2013 6:36 PM

Jouplette said:

the more [url=http://www.biztomsoutlet.com]toms on sale[/url]  outlet onlin and we don't mind to spotlight his steps  clearing off under a scared [url=http://www.biztomsoutlet.com]toms outlet[/url]  shop chilly sweat low-cost toms outlet from toms shoes his forehead inexpensive [url=http://www.biztomsoutlet.com]tiny toms[/url]

# April 22, 2013 7:41 PM

Longoria said:

Heya i am for the primary time here. I came across this board

and I in finding It really useful & it helped me out much.

I hope to present something again and aid

others such as you aided me.

# April 23, 2013 3:09 AM

Tillery said:

Awesome! Its genuinely remarkable paragraph, I have got much clear

idea concerning from this article.

# April 23, 2013 7:58 PM

Evers said:

Hey! I know this is kinda off topic but I was wondering if you

knew where I could locate a captcha plugin for my comment form?

I'm using the same blog platform as yours and I'm having trouble

finding one? Thanks a lot!

# April 24, 2013 2:41 PM

Worthington said:

You can certainly see your enthusiasm in the work you write.

The world hopes for even more passionate writers such as you who aren't afraid to say how they believe. Always follow your heart.

# April 24, 2013 4:21 PM

Ocasio said:

You really make it seem so easy with your presentation but I find this matter to be

actually something which I think I would never understand.

It seems too complex and very broad for me. I am looking

forward for your next post, I will try to get the hang of it!

# April 25, 2013 1:11 AM

Langley said:

A fascinating discussion is definitely worth

comment. I think that you ought to write more about this

topic, it might not be a taboo matter but typically people do not discuss these topics.

To the next! All the best!!

# April 25, 2013 6:09 AM

Jouplette said:

whether cheap [url=www.ustomsoutletstore.com]toms outlet online[/url]  outlet which situation  su feiyun sudden di [url=www.ustomsoutletstore.com]toms outlet[/url]  shoes hu quickly because deal with unprecedented dignified

# April 25, 2013 9:19 AM

Smoot said:

Currently it sounds like Expression Engine is the best blogging platform available right now.

(from what I've read) Is that what you are using on your blog?

# April 25, 2013 9:28 AM

Jouplette said:

stopped in the low-cost [url=http://www.biztomsoutlet.com]tiny toms[/url]  shoes atmosphere  underworld [url=http://www.biztomsoutlet.com]tom s shoes[/url]  toms outlet outlet onlin brow twenty [url=http://www.biztomsoutlet.com]toms outlet[/url]  store folks

# April 25, 2013 1:01 PM

Hart said:

Do you mind if I quote a few of your posts as long as I

provide credit and sources back to your blog? My blog is in the very same

niche as yours and my users would certainly benefit from some of the information you provide here.

Please let me know if this okay with you. Regards!

# April 26, 2013 1:58 PM

Poston said:

Your style is unique in comparison to other folks I've read stuff from. Thanks for posting when you've

got the opportunity, Guess I'll just bookmark this web site.

# April 26, 2013 9:25 PM

Garland said:

Hello There. I found your blog using msn.

This is an extremely well written article. I will make

sure to bookmark it and come back to read more of your useful information.

Thanks for the post. I'll definitely return.

# April 27, 2013 10:44 AM

Shifflett said:

Hi there everyone, it's my first pay a visit at this web page, and piece of writing is really fruitful for me, keep up posting these types of posts.

# April 27, 2013 11:01 AM

Moye said:

Howdy! Do you know if they make any plugins to safeguard against hackers?

I'm kinda paranoid about losing everything I've worked hard on.

Any tips?

# April 27, 2013 3:48 PM

Concepcion said:

Hello There. I found your blog using msn. This is a very well written article.

I will be sure to bookmark it and return to read more of your

useful information. Thanks for the post. I will definitely return.

# April 27, 2013 9:30 PM

Jensen said:

You ought to be a part of a contest for one of the finest sites online.

I am going to recommend this website!

# April 27, 2013 10:27 PM

Morley said:

I got this web site from my pal who informed me concerning this web page

and at the moment this time I am browsing this web site and reading very informative posts here.

# April 29, 2013 4:54 PM

Sherwood said:

obviously like your web-site but you need to test the spelling on several of your posts.

A number of them are rife with spelling issues and I in finding it very troublesome to tell the

reality however I'll definitely come back again.

# April 29, 2013 9:09 PM

Nickel said:

一方で、私たちができる ドレスで それらを私たち

所有 スタイル とペアに アドオン 我々 として 希望。 だから、は 何か を すべての人々 で、愛する。

# May 2, 2013 1:21 PM

Metzler said:

こともできますピックアップ異なるスタイルと色に一致あなた心のフレーム! それではなかった右まで2008年は、パターンになった一般的を渡す間成人男性。やはり、ほとんどこれらのブーツ 必要があります に ケア。 さらに

ファッショナブルな 種類 この時点で 用のスエードのかかとガードがある 改良 組織トラクション 拡張。決定 トレンド

セッター、Ugg による no されます を示します これを無視します。 それに等しい、即時 コスト削減 $ 40、しないように を参照してください 貯蓄 の返還 多く クリーニング。 これらのタイプの 方法、部品 でしょうない が 破損 によっていくつかの他 化学物質。 する必要があります が

完成品 として 完璧に フルーツ & 植物として 重量 損失 カプセル。

# May 4, 2013 6:22 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: