.NET Blog

Tony Cavaliere

 
My Favourite Albums
  And the Grappa wins.
E-mail me Send mail
Add to Technorati Favorites AddThis Feed Button

Subscribe to Cynot Why Not


Recent posts

Disclaimer

Hey unlike other bloggers I stand by what I say but just in case. The opinions expressed herein are my own except on Tuesday when the second card is not turned up otherwise it ain't worth squat.

© Copyright 2010

Calling a WCF Service from Silverlight 2.0: Part Two

In part one of this post series, I showed the working Silverlight application that calls a WCF service. If you would like to see this application then go to part one.

In this post we will show how one goes about creating this application. This post is divided into fout main sections;

  1. Creating the WCF service.
  2. Creating the Silverlight application that consumes the service.
  3. Deployment Issues
  4. Deploying the WCF service and Silverlight control.

Initial Setup

Let's start by creating a Silverlight application. Start VS2008 and then select File->New Project menu option. This will bring up the New Project dialog. This dialog is shown in Figure 1. I have decided to name this project WCF.

New Project 

Figure 1: Creating a Silverlight Application.

In my case I have chosen the to create a Silverlight application using the VB.NET language. After clicking the OK button, the Add Silverlight Application dialog appears. As shown in Figure 2, accept the defaults and click the OK button.

Add Silverlight Application

Figure 2: The Add Silverlight Application Dialog.

VS2008 should have created a solution with two projects; the first an ASP.NET application used to host the Silverlight control and a second which is the Silverlight control. Figure 3 shows the solution window with these two projects.

Initial Silverlight Solution 

Figure 3: The Initial Silverlight Solution.

We are now ready to create the WCF service.

 

WCF Service

The service we about to create will return a list of person objects. Begin by adding a new class to the web site project. To do this right click on the WCFWeb project and select the Add New Item menu option. This will result in the Add New Item dialog appearing as shown in Figure 4.

Add New Item Person Class

Figure 4: Adding the Person class

Name the class Person and select the OK button. This will cause an additional dialog to appear asking whether you want to add the code to the App_Code directory, select OK. Modify the generated Person class as per Listing 1.

Imports System.ServiceModel

Imports System.Runtime.Serialization

Imports Microsoft.VisualBasic

 

'This class needs to be serializable. The DataContract attribute is the WCF way

'of doing this.

<DataContract()> _

Public Class Person

 

    'First name of the person. You must opt in to make a property serializable,

    'hence the DataMember attribute.

    Private _First As String

    <DataMember()> _

    Public Property First() As String

        Get

            Return _First

        End Get

        Set(ByVal value As String)

            _First = value

        End Set

    End Property

 

    'Last name of the person. You must opt in to make a property serializable,

    'hence the DataMember attribute.

    Private _Last As String

    <DataMember()> _

    Public Property Last() As String

        Get

            Return _Last

        End Get

        Set(ByVal value As String)

            _Last = value

        End Set

    End Property

 

    'Simple constructor.

    Public Sub New(ByVal first As String, ByVal last As String)

        Me.First = first

        Me.Last = last

    End Sub

 

End Class

Listing 1: Person Class

The Person class is rather simple containing just two properties and one constructor. The class is decorated with the <DataContract()> attribute which indicates it is serializable. The <DataMember()> attributes that decorate the two properties indicates that the members are part of the contract and are serializable. Unlike the <Serializable()> attribute, where by default properties are automatically serialized, with the <DataContract()> attribute you must explicitly chose which properties are included during serialization.

Next add a WCF Service template to the web project. Right click on the web project and select the Add New Item menu option. This will bring up the Add New Item dialog as shown in Figure 5. Call the service PersonService.

Add New Item - WCF Service

Figure 5: Add the WCF Service

After selecting the Add button, three new files are added to the web project; IPersonService.vb, PersonService.vb and PersonService.svc. In addition, the web.config file is modified with the addition of the <system.serviceModel> section.

Let's investigate each file.

As previously mentioned the web.config is modified whenever a WCF service is added to the project. Specifically, the section <system.serviceModel> is added. It is here that the configuration of the newly added WCF service exists. Two changes are required in order to get the service to properly working. Firstly, the binding wsHttpBinding needs to be changed to basicHttpBinding as Silverlight currently only supports the basicHttpBinding. The second change, although not strictly required, is to hard code the port for the dns. I like to do this to ensure that the application will always work regardless of which port the development web server decides to chose. An alternative approach would be to create a web application which automatically configures an IIS virtual directory. In order to hard code a port number select the web site project and go to the Properties window. Next set Use dynamic ports to False and then chose some port number. I like to use a port number of 666. Now you can update the web.config and hard code the dns value to localhost:666. Figure 6 shows the property window with the hard code port number and Listing 2 shows the <system.serviceModel> section with the binding and port number changes.

Property Window Port Number

Figure 6: The Web Site Project Properties Window with the hard coded port number

 

 

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="PersonServiceBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceDebug includeExceptionDetailInFaults="false" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="PersonServiceBehavior" name="PersonService">

                <endpoint address="" binding="basicHttpBinding" contract="IPersonService">

                    <identity>

                        <dns value="localhost:666" />

                    </identity>

                </endpoint>

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

            </service>

        </services>

    </system.serviceModel>

Listing 2: web.config

The change to the IPersonService.vb interface is small as all we need to do is change the generated function name to something more meaningful. Listing 3 shows the necessary changes to IPersonService.vb.

 

Imports System.ServiceModel

 

<ServiceContract()> _

Public Interface IPersonService

 

    <OperationContract()> _

    Function GetPeople() As List(Of Person)

 

End Interface

Listing 3: IPersonService.vb

Note the only change to the templated interface is the function name and that it returns a list of person objects. The interface is decorated with the <ServiceContract()> attribute indicating the interface defines a service contract in a WCF application. The <OperationContract()> attribute indicates that the GetPeople function defines an operation that is part of a service contract. The bottom line is that a client (Silverlight in our case) can call the function GetPeople across process boundaries.

The PersonService class needs to implement the IPersonService interface. Listing 4 contains the modifications to the class.

 

Imports System.ServiceModel

 

'Implementation of IPersonService.

<ServiceBehavior(IncludeExceptionDetailInFaults:=True)> _

Public Class PersonService

    Implements IPersonService

 

    'Return an in memory list of people.

    Public Function GetPeople() As List(Of Person) Implements IPersonService.GetPeople

        Dim people As New List(Of Person)

        people.Add(New Person("John", "Smith"))

        people.Add(New Person("Jane", "Summers"))

        Return people

    End Function

 

End Class

Listing 4: PersonService.vb

The implementation of the GetPeople function is rather simple. Firstly, we create a reference to a List of Person objects. Next two person objects are added to the list collection and finally this list of persons is returned.

The PersonService.svc represents the end point to the service. Provided we run the service within the development environment, this file does not require any modifications. Later, in the this post we will discuss deployment issues and we will see that modifications to this file and additional code is required when hosting the service on a web server that uses multiple host headers (i.e., more than one address). More on that later.

Right click on the PersonService.svc and select the  View in Browser menu option. If all is well you should see the default service web page appearing (see Figure 7).

Browse to PersionService

Figure 7: Navigating to the PersonService.svc service.

That's it we have created a WCF service. Now let's move on to consuming this service from within a Silverlight application.

 

Consuming the WCF Service from within Silverlight

We will start by adding a reference to the service. Right click on the Silverlight project and select the Add Service Reference menu item. This will bring up the Add Service Reference dialog. Select the Discover button. This will cause the IDE to search the solution for all services, displaying them in the list box. Since there is only one service in the solution the Services list box will only contain a single service, namely, PersonService.svc. Change the namespace to PersonProxy. After doing this the dialog should appear similar to Figure 8.

Add Service Reference

Figure 8: Adding a Service Reference to the Silverlight Project

Select OK. This will add the PersonProxy reference to the project and in addition will add the ServiceReferences.ClientConfig configuration file. This configuration file requires modification as it does not contain the fully qualified name of the service. It is missing the namespace, WCF (the name of the project). I'm not sure if this is a Beta 2 bug and perhaps it will be fixed for RTM. After this change the ServiceReferences.ClientConfig file should appear the same as in Listing 5.

<configuration>

    <system.serviceModel>

        <bindings>

            <basicHttpBinding>

                <binding name="BasicHttpBinding_IPersonService"

                    maxBufferSize="65536"

                    maxReceivedMessageSize="65536">

                    <security mode="None" />

                </binding>

            </basicHttpBinding>

        </bindings>

        <client>

            <endpoint address="http://localhost:666/WCFWeb/PersonService.svc"

                binding="basicHttpBinding"

                bindingConfiguration="BasicHttpBinding_IPersonService"

                contract="WCF.PersonProxy.IPersonService"

                name="BasicHttpBinding_IPersonService" />

        </client>

    </system.serviceModel>

</configuration>

Listing 5: ServiceReferences.ClientConfig

This configuration file is included as content into the Silverlight XAP deployment file. If you need to change the end point, as you would need to do so if you are changing the location of the WCF service, then you can rename the XAP extension to ZIP, unzip the contents, modify the endpoint, re-zip the file and rename the extension back to XAP.

Before we can write any code to call the service, we need to add some UI to the Page.xaml file. I have chosen to display the data in a DataGrid. To initiate the call to the sercice I have added a button control. Finally, in case there were any errors generated during the call to the service, I have included a TextBlock. Let's proceed with the UI.

Listing 6 contains the complete XAML for the UI. The default generated Grid has been replaced with a StackPanel. Within the StackPanel are the Button, DataGrid and TextBlock controls. It is best not to paste the code from this listing into your copy of Page.xaml as the DataGrid requires an addition reference which is automatically included when you drag and drop the control.

<UserControl

   xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 

   x:Class="WCF.Page"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Width="500" Height="250">

 

    <StackPanel x:Name="LayoutRoot" Background="Bisque">

        <Button Content="Call WCF Service" FontSize="24" Width="220" Height="50"

               Margin="15" Click="btnWCF_Click" />

        <my:DataGrid x:Name="grdPeople" AutoGenerateColumns="False"

                    FontSize="24" Width="500" RowHeight="50" 

                    Visibility="Collapsed">

            <my:DataGrid.Columns>

                <my:DataGridTextColumn Header="First Name" FontSize="24" Width="230"

                   DisplayMemberBinding="{Binding First}" />

                <my:DataGridTextColumn Header="Last Name" FontSize="24" Width="237"

                   DisplayMemberBinding="{Binding Last}" />

            </my:DataGrid.Columns>

        </my:DataGrid>

        <TextBlock x:Name="txtError" TextWrapping="Wrap" Width="500" Height="350"

                  ScrollViewer.VerticalScrollBarVisibility="Auto" />

    </StackPanel>

 

</UserControl>

Listing 6: Page.xaml

A couple of notes on the DataGrid. The AutoGenerateColumns is set to false so that we can control which items are data bound. We are declaratively binding the first and last name using the DisplayMemberBinding attribute. Later in the code behind we will call the service and set the ItemSource of the DataGrid.

That's it for the UI now let's concentrate on the code behind.

The code behind for Page.xaml is responsible for calling the WCF service and then setting the ItemSource of the DataGrid to the list of person objects. Listing 7 contains the complete code listing for page.xaml.vb.

Partial Public Class Page

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    Private Sub btnWCF_Click( _

        ByVal sender As System.Object, _

        ByVal e As System.Windows.RoutedEventArgs)

 

        Dim proxy As New PersonProxy.PersonServiceClient()

        AddHandler proxy.GetPeopleCompleted, AddressOf onGetPeopleCompleted

        proxy.GetPeopleAsync()

 

        grdPeople.Visibility = Windows.Visibility.Collapsed

        grdPeople.ItemsSource = Nothing

 

    End Sub

 

    Public Sub onGetPeopleCompleted( _

        ByVal sender As Object, _

        ByVal e As PersonProxy.GetPeopleCompletedEventArgs)

 

        If e.Error Is Nothing Then

            grdPeople.Visibility = Windows.Visibility.Visible

            grdPeople.ItemsSource = e.Result

        Else

            txtError.Text = e.Error.ToString

        End If

 

    End Sub

 

End Class

Listing 7: Page.xaml.vb

The code consists of two methods. The btnWCF_Click method is wired to the button click event. This is where we instantiate the PersonProxy. Next an event handler for the GetPeopleCompleted event is added specifying the method to be called when the event is fired. We then initiate the call to the service by invoking GetPeopleAsync. Silverlight will only allow asynchronous calls to services.

The method onGetPeopleCompleted is responsible for binding the data to the DataGrid. As a precaution, we first check to see if an error has occurred and if so the error is displayed in a TextBlock. I have found that exceptions that happen during the call to the WCF service are by default hidden, i.e., they appear as (404) Not Found exception. This is a security feature as you don't necessarily want the consumers of the service to have knowledge of your code. Further investigation is  required to know how to best handle these kinds of exceptions.

If no error is generated during the call to the WCF service then the returned data (e.Result) is is bound to the DataGrid via the ItemSource property.

That's it we are done. Let's try running the application. Right click the WCFTestPage.aspx file in the web site project and select View in Browser menu option. This should bring up the browser and hopefully the Silverlight control will appear. Click the Call WCF Service button and after a short period of time a DataGrid should appear, containing a list of people. Figure 9 shows the DataGrid with the list of people.

I also have a working copy of this Silverlight control embedded in my previous post.

WCF Test Page

Figure 9: Running the Silverlight Test Page. 

 

Deployment Issues

I wanted to share with you some challenges I came across when I deployed this WCF service to my ISP. Hopefully this will save you some time.

The first problem I came across was using Silverlight for cross-domain communication, that is, Silverlight by default can only call services that are hosted on the same domain. This prevents cross-site request forgery and prevents a Silverlight control from making unauthorized calls to a third party service. In order for a Silverlight control to access a service in another domain the service must grant access. This can be done by installing one of two files on the web server. I will discuss only one of these files, the ClientAccessPolicy.xml. The contents of this file is shown in Listing 8.

<?xml version="1.0" encoding="utf-8" ?>

<access-policy>

  <cross-domain-access>

    <policy>

      <allow-from http-request-headers="*">

        <domain uri="*" />

      </allow-from>

      <grant-to>

        <resource include-subpaths="true" path="/" />

      </grant-to>

    </policy>

  </cross-domain-access>

</access-policy>

Listing 8: ClientAccessPolicy.xml

To add this file to the web site project, right click the project and select the Add New Item menu option. From the Add New Item dialog box select the XML file template and name it ClientAccessPolicy.xml. Finally, cut and paste the contents of the XML in listing 8 into this XML file.

As indicated by the <domain uri="*" /> node, this file allows requests from any domain. For further details on allowing cross-domain access visit MSDN Site. This file must be deployed to the root of the domain where the service is installed.

The second problem was a little more difficult to resolve. After I installed the the ClientAccessPolicy.xml file to the web server I received the following error:

This collection already contains an address with scheme http: There can be at most one address per scheme in the collection.

After a bit of searching I found a few posts that explained this multiple bindings issue. Out of the box .NET does not support multiple bindings per site and since I am hosting this service on my ISP the likelihood that it has multiple bindings is great. Thankfully there is a way around this that involves creating your own custom service host factory. This factory is responsible for choosing the appropriate base address. Listing 9 shown this custom service host factory.

 

Imports Microsoft.VisualBasic

Imports System.ServiceModel.Activation

Imports System.ServiceModel

 

Public Class CustomHostFactory

    Inherits ServiceHostFactory

 

    Protected Overrides Function CreateServiceHost( _

        ByVal serviceType As System.Type, _

        ByVal baseAddresses() As System.Uri) _

        As System.ServiceModel.ServiceHost

 

        Return New ServiceHost(serviceType, baseAddresses(0))

 

    End Function

 

End Class

Listing 9: Custom Service Host Factory

To add this code right click the App_Code folder in the web site project and select the Add New Item menu option. Then from the Add New Item dialog select the Class template and name it CustomService.vb. Finally cut and paste the code from Listing 9 into CustomService.vb.

The code is rather simple. The class CustomHostFactory inherits from ServiceHostFactory and overrides the CreateServiceHost function. The implementation creates an instance of a ServiceHost class and chooses the first base address from the collection of addresses.

Next the PersonService.svc file must be changed so that the service is created using this custom service host factory. Listing 10 shows this modified PersonService.svc file. For further information please visit the following blog post.

 

<%@ ServiceHost Language="VB" Debug="true" Factory="CustomHostFactory"

Service="PersonService" CodeBehind="~/App_Code/PersonService.vb" %>

Listing 10: Adding Custom Service Host Factory to PersonService.svc

 

Deploying the WCF Service and Silverlight Application to a Web Server

WCF Service:

Copy the following files to the virtual directory where the service is to be hosted:

  • App_Code/CustomService.vb
  • App_Code/IPersonService.vb
  • App_Code/Person.vb
  • App_Code/PersonService
  • PersonService.svc
  • web.config (modify the DNS value and set it to the domain where the service is to hosted)

Silverlight Application:

Add the Silverlight control to whatever page you desire. If you need to change the location of the WCF Service then you can rename the XAP extension to ZIP, unzip the contents, modify the endpoint in the ServicesReferences.ClientConfig file, re-zip the file and rename the extension back to XAP. 

Guess the movie

See that clock on the wall? In five minutes you are not going to believe what I've told you.

Currently rated 3.5 by 6 people

  • Currently 3.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: Silverlight | WCF
Posted by CynotWhyNot on Friday, August 15, 2008 6:29 AM
Permalink | Comments (83) | Post RSSRSS comment feed

Related posts

Comments

cynotwhynot.com

Thursday, August 28, 2008 1:08 PM

pingback

Pingback from cynotwhynot.com

Calling a WCF Service from Silverlight 2.0: Part One

amin.mahpour.com

Monday, September 22, 2008 6:08 AM

pingback

Pingback from amin.mahpour.com

Amin Mahpour » Blog Archive » Silverlight post collections

Charles ca

Friday, October 17, 2008 6:12 PM

Charles

This is a great article! I'm working on something similar in C# and have created a service that references data from a few different classes / databases. I'd like to run a few of my calls asynchronously, but need to make one other call first. How can I check the status of a Silverlight call, or wait until it has returned data before firing off my other ones?

Ahmad Masykur id

Wednesday, November 05, 2008 12:22 AM

Ahmad Masykur

Thanks for the sharing. This blog post is useful for me.

answerspluto.com

Monday, July 13, 2009 10:09 PM

pingback

Pingback from answerspluto.com

list of urls - 5 « Answers Pluto

aion kina us

Wednesday, September 16, 2009 3:06 PM

aion kina

I bookmarked your post will read this latter


Regards

Bindia

aion kina us

Wednesday, September 16, 2009 3:06 PM

aion kina

I bookmarked your post will read this latter


Regards

Arvin

aion gold us

Wednesday, September 16, 2009 4:42 PM

aion gold

I loved the way you exlained things. Much better many here


Regards

Venu

aion gold us

Wednesday, September 16, 2009 4:43 PM

aion gold

When is the next post comming on this topic.


Regards

Marks

Medical Alarm us

Monday, November 16, 2009 3:07 AM

Medical Alarm

Well this is very interesting indeed.Would love to read a little more of this. Great post. Thanks for the heads-up�This blog was very informative and knowledgeable



Regards
Natl

electronic medical record software us

Monday, November 16, 2009 3:25 AM

electronic medical record software

This is really nice post.


Regards
Hickman



discount designer bag US

Tuesday, December 01, 2009 9:47 PM

discount designer bag

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

watch friends us

Wednesday, December 09, 2009 6:18 AM

watch friends

Hi webmaster, commenters and everybody else !!! The blog was absolutely fantastic! Lots of great information and inspiration, both of which we all need!b Keep 'em coming... you all do such a great job at such Concepts... can't tell you how much I, for one appreciate all you do!



Regards and respect
Ferguson





condo in austin us

Wednesday, December 16, 2009 6:10 AM

condo in austin

This seems like the most comprehensive blog on this niche

Regards
Lawson


winner sneaker US

Thursday, December 24, 2009 3:52 PM

winner sneaker

You have a point. Very insightful. A nice different perspective

discount designer handbags US

Wednesday, December 30, 2009 6:55 AM

discount designer handbags

If you need to buy discount gucci bags, you can just type bagsvendor.com in you browser address line and find out the gucci bags on big sale in discounted price. The information below is only introducing the discount news about gucci bags and gucci handbags. A woman leads the world accounting her gucci bag. But then we must also remember that there is a well discount news that has to see. It is a common complaint that women having their share is not large enough to hold all your belongings necessary, such as discount gucci bags, designer bags. This gucci bags you can find in bagsvendor.com is that the person is unable to organize things properly. Each discount bag has a clear purpose and objects you choose to take the bag must be compatible with the purposes for which it is purchased in your mind. We can meet the wide range of needs that are part of the common things for a trip on a beautiful handbag, bags or purses. Thus, while the discounted gucci bags needs, here are some points that may be useful to organize the contents of the discount gucci bag. Even it is a discounted price gucci bags, but it has high quality. The quality of materials used with the gucci bag is leather, suede or cotton. These materials can be sure that they are not less than 100% authentic and of excellent quality discount bags. Accessories and decorative items from the discount gucci bag, such as hinges, chains, rings and belt buckles are higher that other bags. Some designers in the Gucci company will even give as a repair or replacement free of charge in a period of time to ensure that their discount handbags are offered in a different league than the shares that you can find at any mall or online store. Designer Gucci bags can be changed to discounted gucci bags. This is a big news about handbags on sale. Brands are just called by many famous fashion people, and can be done with any discounted news. Just find more in bagsvendor.com

air jordan US

Friday, January 01, 2010 2:51 AM

air jordan

In winnersneaker, these Nike Air Jordan shoes were associated with sport, fashion and basketball. The Nike Air Jordan sneakers were a way to hide some of the smaller sizes, or raise an important NBA star to even higher levels to the count. Nike Air Jordan shoes, but also less fashionable of Air Jordan history. Which were commonly used by high-ranking customers in NBA during the 19th century and were used in the 20th century to let the putrid mud in the streets, all you know is that you can find many discounted Air Jordan shoes in winnersneaker.com. Existing Air Jordan retro sneakers in the United States and Europe retails do not feel in fashion until the new Air Jordan shoes come in the street. At first the Air Jordan 1 shoes important wearing for young sport men, but once reigned basketball, Jordan shoes became the must-have fashion accessory for young people in the basketball playground. These Air Jordan original shoes were all to make a statement vividly. Air Jordans like Air Jordan 23 and Air Jordan 6 wore basketball shoes kiss in the context of his people larger than life. Wish you find a suitable Air Jordan shoes in winnersneaker.com.

lose weight us

Friday, February 19, 2010 11:24 AM

lose weight

The secret of a leader lies in the tests he has faced over the whole course of his life and the habit of action he develops in meeting those tests.

alta white us

Friday, February 19, 2010 11:25 AM

alta white

The only way to have a friend is to be one.

designer bags US

Sunday, March 07, 2010 4:03 PM

designer bags

What a great info, thank you for sharing. this will help me so much in my learning.

discount handbags US

Monday, March 08, 2010 10:53 PM

discount handbags

Yeah, you are right, I agree with you.

discount bag US

Tuesday, March 09, 2010 2:33 PM

discount bag

Hey, guy, your blog is nice. It can bring me many useful information.

kobe shoes US

Wednesday, March 10, 2010 9:43 PM

kobe shoes

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

wholesale shoes from china US

Wednesday, March 10, 2010 11:27 PM

wholesale shoes from china

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

designer handbags US

Thursday, March 11, 2010 2:47 AM

designer handbags

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

basketball sheos US

Thursday, March 11, 2010 6:46 AM

basketball sheos

Thanks for your article.

worldwide shoes china US

Friday, March 12, 2010 12:04 AM

worldwide shoes china

There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game.

cheap shoes wholesale US

Friday, March 12, 2010 2:50 PM

cheap shoes wholesale

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

air jordan US

Sunday, March 14, 2010 3:23 AM

air jordan

I find your blog in google. And I will be back next time, thanks.

wholesale shoes china US

Sunday, March 14, 2010 3:24 AM

wholesale shoes china

Easily, the post is really the greatest on this laudable topic. I concur with your conclusions and will thirstily look forward to your future updates. Saying thanks will not just be sufficient, for the fantasti c lucidity in your writing. I will instantly grab your rss feed to stay privy of any updates. Solid work and much success in your business enterprize!

discount designer handbag US

Sunday, March 14, 2010 4:03 AM

discount designer handbag

Amazing article. Bookmarked it already. Best regards, Ken.

nba stars sneakers US

Sunday, March 14, 2010 4:48 AM

nba stars sneakers

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

air jordan sneakers US

Sunday, March 14, 2010 4:48 AM

air jordan sneakers

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

discount designer bags US

Sunday, March 14, 2010 4:51 AM

discount designer bags

Your blog seems interesting.Regards,Kevin.

Lebron shoes US

Sunday, March 14, 2010 6:18 AM

Lebron shoes

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

nike air max US

Sunday, March 14, 2010 8:04 AM

nike air max

Amazing article. Bookmarked it already. Best regards, Ken.

air max sneaker US

Monday, March 15, 2010 12:53 AM

air max sneaker

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

james shoes sale US

Monday, March 15, 2010 5:57 PM

james shoes sale

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

discount designer handbags sale US

Thursday, March 25, 2010 5:33 AM

discount designer handbags sale

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

air max 90 US

Thursday, March 25, 2010 7:33 AM

air max 90

Funny, I actually had this on my mind a few days ago and now I come across your blog.

james shoes sale US

Thursday, March 25, 2010 10:50 AM

james shoes sale

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

Winnersneaker.com US

Thursday, March 25, 2010 4:31 PM

Winnersneaker.com

Hey, guy, your blog is nice. It can bring me many useful information.

chris shoes US

Thursday, March 25, 2010 6:24 PM

chris shoes

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

air force 1s US

Friday, March 26, 2010 6:52 AM

air force 1s

Nice content, I trust this is a nice blog. Wish to see fresh content next time.

lebron james shoes US

Friday, March 26, 2010 10:12 AM

lebron james shoes

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

shoes china US

Saturday, March 27, 2010 9:02 AM

shoes china

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

china shoes US

Saturday, March 27, 2010 5:17 PM

china shoes

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

lebron james shoes US

Saturday, March 27, 2010 6:00 PM

lebron james shoes

Funny, I actually had this on my mind a few days ago and now I come across your blog.

designer handbags sale US

Sunday, March 28, 2010 7:11 AM

designer handbags sale

Your blog is perfect, and I like this article. I find the information I need. I think I can find more useful information here, thanks.

nike air yeezy US

Sunday, March 28, 2010 7:53 AM

nike air yeezy

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

nike air max US

Sunday, March 28, 2010 8:57 AM

nike air max

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

nba shoes sale US

Sunday, March 28, 2010 5:50 PM

nba shoes sale

Amazing article. Bookmarked it already. Best regards, Ken.

nike air max shoes US

Tuesday, March 30, 2010 6:11 PM

nike air max shoes

Amazing article. Bookmarked it already. Best regards, Ken.

air jordan sale US

Wednesday, March 31, 2010 7:15 AM

air jordan sale

What a great info, thank you for sharing. this will help me so much in my learning.

nike dunk US

Wednesday, March 31, 2010 8:30 AM

nike dunk

I find your blog in google. And I will be back next time, thanks.

winnersneaker US

Saturday, April 03, 2010 7:54 AM

winnersneaker

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

nba shoes sale US

Saturday, April 03, 2010 11:32 AM

nba shoes sale

Your blog is perfect, and I like this article. I find the information I need. I think I can find more useful information here, thanks.

discount handbags sale US

Saturday, April 03, 2010 4:28 PM

discount handbags sale

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

nike air force 1 US

Saturday, April 03, 2010 5:51 PM

nike air force 1

Yeah, you are right, I agree with you.

lebron james shoes US

Monday, April 05, 2010 6:24 PM

lebron james shoes

What a great info, thank you for sharing. this will help me so much in my learning.

kobe shoes sale US

Wednesday, April 07, 2010 4:27 PM

kobe shoes sale

While this subject can be very touchy for most people, my opinion is that there has to be a middle or common ground that we all can find. I do appreciate that youve added relevant and intelligent commentary here though. Thank you!

discount designer bags US

Friday, April 09, 2010 5:20 AM

discount designer bags

Your blog seems interesting.Regards,Kevin.

air jordan sneakers US

Friday, April 09, 2010 6:11 AM

air jordan sneakers

Funny, I actually had this on my mind a few days ago and now I come across your blog.

discount designer bag US

Saturday, April 10, 2010 5:49 PM

discount designer bag

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

nike shox shoes US

Sunday, April 11, 2010 5:04 PM

nike shox shoes

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

wholesale shoes sale US

Monday, April 12, 2010 5:58 PM

wholesale shoes sale

Hey, guy, your blog is nice. It can bring me many useful information.

air max shoes US

Monday, April 12, 2010 6:01 PM

air max shoes

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

air max 90 US

Wednesday, April 14, 2010 2:17 PM

air max 90

Yeah, you are right, I agree with you.

air jordan US

Saturday, April 17, 2010 4:51 PM

air jordan

Yeah, you are right, I agree with you.

wholesale shoes from china US

Tuesday, April 20, 2010 6:49 PM

wholesale shoes from china

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

china shoes US

Wednesday, April 28, 2010 5:56 PM

china shoes

What a great info, thank you for sharing. this will help me so much in my learning.

kobe sneakers US

Wednesday, April 28, 2010 7:02 PM

kobe sneakers

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

256.tgrconversions.com

Thursday, May 20, 2010 1:10 PM

pingback

Pingback from 256.tgrconversions.com

Acura Rsx Dash Kit Grain, Aftermarket Acura Rsx Suspension Kits

play games online now us

Monday, May 24, 2010 6:10 PM

play games online now

You can put a text link in your links section, saying something like, would you like your link here? How about a ton of one way links? Rss submission can boost your pagerank in no time.

air yeezy US

Friday, May 28, 2010 10:40 PM

air yeezy

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

Cordie Candle us

Tuesday, July 06, 2010 4:00 AM

Cordie Candle

thanks for your shareing, nice artical. www.easyforbuy.com

discount fendi US

Wednesday, July 14, 2010 12:34 PM

discount fendi

Comfortabl y, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

air 97 US

Sunday, August 01, 2010 5:36 AM

air 97

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

2010 jeans US

Wednesday, August 25, 2010 1:03 AM

2010 jeans

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

chanel brand bags US

Wednesday, August 25, 2010 1:06 AM

chanel brand bags

Comfortably, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

designer sandals US

Wednesday, August 25, 2010 12:17 PM

designer sandals

Your blog seems interesting.Regards,Kevin.

supra US

Sunday, August 29, 2010 10:08 PM

supra

Your blog is perfect, and I like this article. I find the information I need. I think I can find more useful information here, thanks.

gucci bags US

Friday, September 03, 2010 12:11 AM

gucci bags

Your blog is perfect, and I like this article. I find the information I need. I think I can find more useful information here, thanks.

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

Saturday, September 04, 2010 2:16 AM