Add to My Yahoo! | Google Reader or Homepage | Add to Windows Live | Add to Windows Live Alerts

Wictor Wilén

Microsoft Certified Master (MCM) - SharePoint 2010 | Microsoft Most Valuable Professional (MVP) - SharePoint Server MVP | Author

Custom code with SharePoint Online and Windows Azure

When I first heard about SharePoint Online at the PDC 2008 I was a bit disappointed that you could not use custom code but had to rely on the built-in functionality and the things you could do with SharePoint Designer (which is quite powerful anyway, especially with jQuery).

To read more about SharePoint online, head over to Tobias Zimmergrens blog.

But with some clever techniques you can take advantage of the Windows Azure Hosted Services and create your custom code. I will show you how to create some custom code, which normally is done by SharePoint event receivers or timer jobs, using a Worker Role in Windows Azure.

The post is quite lengthy but I have skipped some of the code snippets to make it easier to read. You will find downloads of the C# code at the end of this post.

Scenario

This sample assumes that we have a Document Library in SharePoint Online containing Word 2007 documents for Proposals. The library is called Proposals. We want to make sure that our Proposals has all comments removed before we send it away to our clients. This comment removal procedure will be initiated by a workflow.

 

The Document Library

Action column The Proposals Document Library is a standard SharePoint Document Library with versioning enabled. First we add a new column to the library called Action. This column will contain the status of the comment removal procedure. It has the type Choice and three possible values; RemoveComments, Processing and Done.

 

The workflow

Using SharePoint Designer we create a new workflow, called Prepare Proposal. The workflow has three stages. The workflow is initiated manually

  1. SPD Workflow designerSet the Action column to the RemoveComments value
  2. Wait for Action column to get the value Done
  3. Send e-mail the the author

Pretty simple workflow but all using the out-of-the-box SharePoint Designer activities.

So far everything is basic SharePoint Online “development”, but now we head on over to the custom coding parts.

 

Create the Hosted Service Worker Role

Using Visual Studio 2008 and the Windows Azure SDK we can create a new project of the type Worker Cloud Service. This cloud service will contain all our code for removing the comments from our Word documents.

Cloud Service templates

When the project is created, actually a solution with two projects, we add two references to our Worker Role project; WindowsBase.dll and DocumentFormat.OpenXml.dll (from Open XML SDK 1.0). The Open XML reference must also have the Copy Local property set to true, so that the assembly is deployed with the hosted service App Package.

Note: Version 2 of Open XML SDK can not be used since it does not have the AllowPartiallyTrustedCallers attribute, which is required for all referenced assemblies in Windows Azure.

 

Add a service reference

The worker role will use the SharePoint Online web services to read and update data so we need to add a Service Reference to our SharePoint online site and the Lists.asmx web service. When this is done an App.config file is created, just delete it - we have to set our bindings and endpoints in the code so it is fully trusted.

In your worker role Start method you create code as follows:

  1: BasicHttpBinding binding = new BasicHttpBinding();
  2: binding.Security.Mode = BasicHttpSecurityMode.Transport;
  3: binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
  4: binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
  5: binding.Security.Transport.Realm = WorkerRole.Realm;
  6: binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

WorkerRole.Realm contains a string with your SharePoint Online Realm with a value something like this: “XXXXXmicrosoftonlinecom-1.sharepoint.microsoftonline.com”.

 

Let’s code!

The worker role will poll the Proposals library for new documents which has the RemoveComments value in the Action column. This is done with the GetListItems method and a query selecting only those documents.

  1: XElement query = new XElement("Query",
  2:     new XElement("Where",
  3:         new XElement("Eq",
  4:             new XElement("FieldRef",
  5:                 new XAttribute("Name", "Action")
  6:                 ),
  7:             new XElement("Value",
  8:                 new XAttribute("Type", "Choice"),
  9:                 "RemoveComments"))));
 10: 
 11: XElement queryOptions = new XElement("queryOptions");
 12: 
 13: var itemsXml = client.GetListItems("Proposals", string.Empty, query.GetXmlElement(), null, string.Empty, queryOptions.GetXmlElement(), string.Empty);
 14: 
 15: XNamespace s = "http://schemas.microsoft.com/sharepoint/soap/";
 16: XNamespace rs = "urn:schemas-microsoft-com:rowset";
 17: XNamespace z = "#RowsetSchema";
 18: 
 19: var docs = itemsXml.
 20:     GetXElement().
 21:     Descendants(z + "row").
 22:     Select(x => new {
 23:         Title = (string)x.Attribute("ows_LinkFilename"),
 24:         Id = (string)x.Attribute("ows_ID"),
 25:         Url = WorkerRole.Url + "/Proposals/" + (string)x.Attribute("ows_LinkFilename")
 26:     });
 27: 

Now we have all our proposals in the docs variable and we can iterate over it.

 

  1: foreach (var doc in docs) {
  2:     RoleManager.WriteToLog("Information", "Processing: " + doc.Title);
  3:     setStatusOnDocument(client, doc.Id, "Processing");
  4: 
  5:     WebRequest request = HttpWebRequest.Create(doc.Url);
  6:     request.Credentials = new NetworkCredential(WorkerRole.Username, WorkerRole.Password);
  7: 
  8:     MemoryStream mems = new MemoryStream();
  9: 
 10:     using (WebResponse response = request.GetResponse()) {
 11:         using (Stream responseStream = response.GetResponseStream()) {
 12:             byte[] buffer = new byte[8192];
 13:             int offset = 0;
 14:             int count;
 15:             do {
 16:                 count = responseStream.Read(buffer, 0, 8192);
 17:                 offset += count;
 18:                 mems.Write(buffer, 0, count);
 19:             } while (count != 0);
 20:             using (WordprocessingDocument wpDoc = WordprocessingDocument.Open(mems, true)) {
 21:                 RemoveComments(wpDoc);
 22:             }
 23:             using (WebClient wc = new WebClient()) {
 24:                 wc.Credentials = new NetworkCredential(WorkerRole.Username, WorkerRole.Password);
 25:                 wc.UploadData(doc.Url, "PUT", mems.ToArray());
 26:             }
 27:         }
 28:     }
 29:     setStatusOnDocument(client, doc.Id, "Done");
 30:     RoleManager.WriteToLog("Information", "Comments removed from: " + doc.Title);
 31: }
 32: 

 

First of all we have a method which updates the Action column of the item to Processing to indicate to the users that we are currently processing this document. Then we read the document into a stream and pass it into a WordprocessingDocument object. On that object we do the RemoveComments method which removes all comments in the Word 2007 document.

Note: Have a look at Eric Whites blog for some nifty operations on your Open Xml documents, such as the remove comments function.

When all comments are removed we upload the file back to SharePoint and set the status to Done, and we are all set.

As you can see I use three different techniques to read from the SharePoint Online site; the SharePoint web services, request-response and a simple WebClient. Isn’t coding fun!

 

Test

One of Windows Azures beauties is that you can test it on your local machine using the Azure Development Fabric. Just hit F5 in Visual Studio.

Development Fabric

This allows you to debug and fine tune your code and see how it scales out.

 

Deploy to Windows Azure Staging environment

Hosted Service When you are sure that there are no bugs just choose Publish in Visual Studio and it will open up a web browser which directs you to the Azure Services Developer Portal, there you can create a new Hosted Service Project or choose an existing one to use for this Proposals service.

To deploy this solution we have to upload two files; the  App Package containing all your code and references and the Configuration Settings file, both automatically created by Visual Studio.

Deploying

When this is done you have to wait a few minutes so Windows Azure can allocate resources for you and prepare the environment. Once this is done you are ready to test your service in the cloud.

In staging

Just hit the Run button and after a minute or so the Proposals Service is running - in the cloud!

Deploy to Production

For us used to the SharePoint environment and the mess it is to get from development to staging to production environment it’s so much fun to just hit Deploy in Windows Azure to move the Staging service to Production.

Production

As you can see from the image above this solution is now in production and started with one worker role.

Run the workflow

Now we can test our complete solution by uploading a document containing some comments. Then initiate the Prepare Proposals Workflow.

Prepare Proposal

The document will be updated with a new value in the Action column.

In Progress

After a few seconds the document is updated by the cloud worker role we created, the workflow completes, there are no more comments in the document and the author should have received an e-mail with information that the workflow is done.

 Done

Summary

This was a short demonstration on what you can do with the standard functionalities of Microsoft's cloud offerings such as SharePoint Online and Windows Azure. The scenario was quite simple but using the same techniques you can elevate your SharePoint Online experience and functionality a lot.

Using Windows Azure is one possibility to host your online custom code, hosting it on on-premise servers is another option and it works just as fine.

Note: I have not made this sample so it can scale out nor does it handle any exceptions. Take it what its for.

If you would like to look at the code you can find it here.

 

Happy coding!

Comments and trackbacks

#  Crazy by Andreas
Screenshot from websnpr You are one crazy developer!
#  SharePoint Link Love 21-Feb-2009 by Trackback
Screenshot from websnpr Understanding SharePoint: List Forms « SharePoint Internals - Hristo Pavlov’s Blog Custom code with SharePoint
#  Wonderful Wictor by Tom Resing
Screenshot from websnpr This is the first Azure plus SharePoint Online piece I've seen anywhere! Way to go.
#  Thanks by Wictor
Screenshot from websnpr Thanks everyone! SharePoint Online can be quite powerful with cloud-only services. Got some more stuff to come...
#  Error with SOAP with example by Bobb
Screenshot from websnpr Anyone gtet this to run? I have a site on microsoft sharepoint online. When I run I get a soap error which I pass the query?
#  Re: SOAP error by Wictor
Screenshot from websnpr What kind of error do you get? and where in your code?
#  Update to the Custom code with SharePoint Online and Windows Azure, due to bug in SharePoint Online by Trackback
Screenshot from websnpr A few weeks back I wrote a post on how to mix Windows Azure and SharePoint Online called Custom code with SharePoint Online and Windows Azure. Since then both Windows Azure and SharePoint online have ...
#  Update to the Custom code with SharePoint Online and Windows Azure, due to bug in SharePoint Online by Trackback
Screenshot from websnpr A few weeks back I wrote a post on how to mix Windows Azure and SharePoint Online called Custom code
#  SoapServerException by Zeno
Screenshot from websnpr Hi! Great article, really interesting! I am having trouble running this on my SharePoint Online site.. When I call GetListItems I get a SoapServerException: Type 'System.ServiceModel.Channels.ReceivedFault' in assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxx' is not marked as serializable. Any idea how to fix this?
#  Re: SoapServerException by Wictor
Screenshot from websnpr Hi Zeno, could you post the complete exception including the stack trace. Have you tried using a local (on premise) instance of SharePoint?
#  Same in java by Dokterdok
Screenshot from websnpr Thank you for this very interesting article. I have done a similar application in java on our on-premises server, that gets and updates lists items on SharePoint Online. It works great, but working with raw XML instead of objects definitely was the trickiest part.
#  Web developer by Web developer
Screenshot from websnpr Quite inspiring, I'm new with azure, I liked the article it was so well writen Keep up the good work
#  @Web developer by Wictor
Screenshot from websnpr Thank you, check out my other sample on SharePoint Records Center in the cloud. Gives you some more info
#  Cool stuff by orange county
Screenshot from websnpr I have never seen the blog so exclusive and with such a great content. I think it will earn thousands for you in the future.
#  Great tutorial by ppc chicago
Screenshot from websnpr This is a very good tutorial especially for newbies like me in Sharepoint. You make coding seem really easy Wictor. Cheers and more power!
#  Re: Great tutorial by Wictor
Screenshot from websnpr Thanks. If coding is fun then it gets easy, as simple as that!
#  SharePoint by scraps para orkut
Screenshot from websnpr I do not think Blue has the capacity even to allow SharePoint Services to be installed on the platform, my guess is that over time you will be able to do that, but right now the service does not allow sufficient access to the guts of the system operation that requires the installation of SharePoint. If desired, put the question on Azure forums to see if that is the case or not.
#  Nice..http://sea.themlsonline.com by Seattle Home
Screenshot from websnpr Thank you for sharing it with us... Nice.. I'll try that.. :-)
#  Great tutorial by MAK
Screenshot from websnpr Thanks. If coding is fun then it gets easy, as simple as that!
#  said by inisip
Screenshot from websnpr The article is quite interesting and it gave me very reliable and useful information. I like to read such valuable articles as it increase my knowledge of iniSip
#  Fantastic Article by http://www.squidoo.com/dead-space-2-hacks
Screenshot from websnpr I liked your approach, keep on the great work!
#  SharePoint by cawo
Screenshot from websnpr Could you please let me know whether we can get a trial version of SharePoint Onlne dedicated version? We have show our customer that we can use BDC in SharePoint Online but that is possible only in dedicated version. So before investigating in licence we have to show a proof of concept to the customer. Thus is it possible that Microsoft can provide us a trial environment as of similar to dedicated version of SharePoint Online?
#  Great Work by Riflescope10
Screenshot from websnpr I like it. Thanks for the information. Great work
#  windows azure by cheap limo services
Screenshot from websnpr With the release of the extra-small VMs, Windows Azure is becoming a very interesting hosting provider for ScrewTurn to provide both a cheap, yet super reliable hosting. My company is currently using the file storage for STW, and I really like it as it keep all information in one place without much hassle.
#  good by Aliciajackson
Screenshot from websnpr thinking about the music ... wish i could have a cool word for this track. >.< ibcbet
#  Happy valentine's day by AliciaMarge
Screenshot from websnpr Into my world of darkness and silence, you brought light and music. When you lit my candle, I began to see and understand the taste and texture of love. For the first time. sbobet
#  Good info and tips by Jumble Sales
Screenshot from websnpr Thanks for the hard read it revealed a lot of tips.
#  i come back here again by AliciaMarge
Screenshot from websnpr Each day your smile fills my heart with a joy like no other. Oh but to have you in my life is truly a blessing! แทงบอล
#  Comment by Ubuntu News
Screenshot from websnpr Lol... "You are one crazy developer!" Free Remote Access Software
#  Love the Codes by Quentin Jaubert
Screenshot from websnpr I've had hard times in studying the different functions of sharepoint also and it would be a big impact for me to read this code. It has been a great instructional post and i really thank you for sharing the codes. I will be working on it after understanding the codes you gave above. -- Lyndsey
#  Azure rocks by wentylatory
Screenshot from websnpr nice to read about these tips.
#  nice topic by holiday palace
Screenshot from websnpr You are fantastic developer!!
#  Nice Post by dubai property
Screenshot from websnpr This post really helps a lot to the developers
#  good topic by ฟังเพลงออนไลน์
Screenshot from websnpr Everyday I wake up and smile to myself Knowing you are waiting for me, Knowing you can't wait to see me. How would I go on if you were not there to hold me up, To bless me with your love and light? How I am glad you have found me My life is now complete... I am home.
#  finanziamenti a protestati by finanziamenti a protestati
Screenshot from websnpr I think most people would do the same when they are headed with the situation. finanziamenti a protestati
#  Jumble Sales by Jumble Sales
Screenshot from websnpr Nice info and good blog thanks for a great read. I am about to bookmark this in my social network as my readers will like to see it too. Cheers.
#  Cycling Events by Cycling Events
Screenshot from websnpr Good Post. The article is fairly interesting and it gave me extremely dependable and useful details. I wish to study such valuable content articles as it boost my knowledge for Cycling Events
#  radca prawny kraków by radca prawny kraków
Screenshot from websnpr Amazing post. Congratulations to an author.
#  narzędzia ogrodnicze by narzędzia ogrodnicze
Screenshot from websnpr I have read article and i found it very useful.
#  adwokat kraków by adwokat kraków
Screenshot from websnpr Amazing post. Congratulations to an author
#  wholesale by wholesale
Screenshot from websnpr Many props to you for your skills.
#  best deal by best deal
Screenshot from websnpr ok thanks for clearing that up.
#  Groupon clone by Groupon clone
Screenshot from websnpr Good work with clear
#  Thanks by great essays
Screenshot from websnpr Nice information, valuable and excellent design, as share good stuff with good ideas and concepts.
#  led by żarówki led
Screenshot from websnpr thamks !!!
#  Pizza Oradea by Pizza Oradea
Screenshot from websnpr Thanks for back :)
#  Marmot jackets | Marmot clothing and equipment for winter 2011 by marmot jackets
Screenshot from websnpr This is a very good tutorial especially for newbies like me in Sharepoint. You make coding seem really easy Wictor. Cheers and more power!
#  custom code by goodman rheem
Screenshot from websnpr Now thats rather some high tech info there.
#  good mode by hair color ideas
Screenshot from websnpr this article very usefull for me this caused by 1.it complete information 2.the author know what the readers need 3.its very easy understanding thank you,,keep posting,,,:) if you want know about hair color ideas please visit my website
#  Lombricultura by Lombricultura
Screenshot from websnpr Ofrecemos curso hidroponía, curso setas, curso heliciultura, curso lombricultura, producción de setas, capacitación constante, cursos de hidroponia, cursos de setas, cursos de helicicultura, cursos de lombricultura en la ciudad de méxico, distrito federal
#  nice post by free penis pills
Screenshot from websnpr thanks for sharing this. i might use some of your technique in the future.
#  Great post by PCI DSS Hosting
Screenshot from websnpr his article very usefull for me this caused by 1.it complete information 2.the author know what the readers need 3.its very easy understanding thank you,,keep posting,,, Cheap PCI Compliant Hosting
#  hi by cnc spindle repair
Screenshot from websnpr keep up the fantastic work , I read few posts on this internet site and I conceive that your web site is really interesting and has got sets of superb info
#  windows by rheem goodman wholesale
Screenshot from websnpr Im thinking this is getting complicated but its interesting.
#  code by air conditioning tampa
Screenshot from websnpr Thats not easy to try to learn that code.
#  code by air conditioning tampa
Screenshot from websnpr Thats not easy to try to learn that code.
#  Thanks by alex
Screenshot from websnpr It was a pleasure to stop here.Verry informative article. Regards Belkin
#  Holi greetings by piterson
Screenshot from websnpr Send free Holi greetings to your buddies
#  goog by spindle repair
Screenshot from websnpr his blog article is nice because blog give meaningful information and very useful tips have to this blog thanks for give your info.
#  weight loss systems by Little bytes
Screenshot from websnpr As there are several methods available in the market regarding weight loss, and every method claims a potential weight loss program. But every one is different so which method is good for you? In order to know that all you have to do is surf our website.
#  Nice by cyberquoting.com
Screenshot from websnpr Well, I am having trouble running this on my SharePoint Online site, anyways thanks for this one also.
#  Great by flash-template-designonline.com
Screenshot from websnpr I think When you lit your candle, It began to see and understand the taste and texture of love:) Anyways Love your post, thanks.
#  thank you by live stream
Screenshot from websnpr Thank you for this very interesting article. I have done a similar application in java on our on-premises server, that gets and updates lists items on SharePoint Online. It works great, but working with raw XML instead of objects definitely was the trickiest part.
#  really by streaming
Screenshot from websnpr This post really helps a lot to the developers
#  Great by School games
Screenshot from websnpr Good info for a newbie like me
#  Awesome by online flight simulation games
Screenshot from websnpr Wow, You make coding seem really easy victor,Cheers and more power! thanks
#  żarówki led by żaówki led
Screenshot from websnpr Send free żarowki led
#  outdoor grills by outdoor grills
Screenshot from websnpr This is a wonderful individual. I enjoyed the set lot. I papers symbolisation this help. Thanks for congress this chenopodiaceae activity.
#  FREE 3D Games by FREE 3D GAMES
Screenshot from websnpr Thanks for sharing this information, i found it very valuable
#  online divorce lawyer by online divorce lawyer
Screenshot from websnpr I am joyful to conclude this accumulation rattling reclaimable for me, as it contains lot of info. I always advance to show the grade knowledge and this occurrence I recovered in you author. Thanks for intercourse
#  צימרים במרכז by צימרים במרכז
Screenshot from websnpr his blog article is nice because blog give meaningful information and very useful tips have to this blog thanks for give your info.
#  Jordanriki by webwisemedia
Screenshot from websnpr Nice to be visiting your blog again, it has been months for me. I need this article to complete my assignment in college. Thanks.
#  Jordanriki by webwisemedia
Screenshot from websnpr Nice to be visiting your blog again, it has been months for me. I need this article to complete my assignment in college. Thanks.
#  game by flash game
Screenshot from websnpr here you can play free flash game
#  top game by top game
Screenshot from websnpr game for your kids
#  ruf by mediation,
Screenshot from websnpr You are fantastic developer!
#  Online microsoft sharepoint by Vance and Hines exhaust
Screenshot from websnpr Anyone gtet this to run? I have a site on microsoft sharepoint online. When I run I get a soap error which I pass the query?
#  such great... by asksubli
Screenshot from websnpr ohh it's really works for me.. thanks..
#  Great Post by Kerala tour
Screenshot from websnpr Great work,it helps me a lot while coding.
#  its by Slap Chop
Screenshot from websnpr It’s pretty worth enough for me. Personally, if all site owners and bloggers made good content as you did, the web will be a lot more useful than ever before.
#  Great! by penny auctions
Screenshot from websnpr I just came across your blog and reading your beautiful words. I thought I would leave my first comment but I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
#  ivisitorinsurance by Ellen
Screenshot from websnpr I thought it was going to be some boring old post, but it really compensated for my time. I will post a link to this page on my blog.I am sure my visitors will find that very useful.
#  Margaret Coates insurance by Margaret Coates insurance
Screenshot from websnpr As there are several methods available in the market regarding weight loss, and every method claims a potential weight loss program. But every one is different so which method is good for you? In order to know that all you have to do is surf our website.
#  Great Post by nagrania lektorskie
Screenshot from websnpr Nice to see this website. Thank you :)
#  Hotel Paigton by peterdontremonte
The method was so great. You can easily customize you codes. Their are program that is hard to custumize but with this method we can now fixed it on our own.
#  Writing a Book by Online Creative Writing
Screenshot from websnpr Hi, I just wanted to say this is the best website if you have passion for writing. It is platform for your creative writing online/short story writing/writing a poem, share your writing with other writers get thier ides and publish your own book. I found this quite useful.
#  ספא בתל אביב by ספא בתל אביב
Screenshot from websnpr It’s pretty worth enough for me. Personally, if all site owners and bloggers made good content as you did, the web will be a lot more useful than ever before.
#  Locksmith Atlanta GA by Locksmith Atlanta GA
Screenshot from websnpr Fantastic task ! Your site has provided me most of the guidance I wanted . Locksmith Atlanta GA
#  halogeny by halogeny
Screenshot from websnpr I just came across your blog and reading your beautiful words
#  SEO by Rubel
Screenshot from websnpr Hi, I fair wantedadequatey this is the paramountmount website if you holdopassithe majorityro copyfilllatform pro your puttive copyvery oneeoccasionrt story putingconsider itifurtherg a limerickrick, share your copyous with other writers stepp thier ides and advertisese your own put your name down foryour name down for. I found this quite of use.
#  Ihre Webseite by irregular bowel movements
Screenshot from websnpr Ihre Webseite ist wohl definitiv einer der besten. Complete Aussehen des Blogs ist wohl großartig.
#  Great website by Marisa
Screenshot from websnpr Great website and perfekt content here like it very much
#  Nice Code by Lets Rock Elmo
Screenshot from websnpr Coding can be so difficult but I like how you approach this problem.
#  comment by charlie
Screenshot from websnpr Nice to see this website. Thank you !
#  hello by options trading for dummies
Screenshot from websnpr I am really interested in what you wrote here. This looks absolutely perfect. All these tinny details are made with lot of background knowledge.
#  thanks by Acai Berry Scam
Screenshot from websnpr I have invested my time in reading a wonderful post like this
#  nice by dan
Screenshot from websnpr Great content
#  great tools by Ranjan
Screenshot from websnpr Yes it is simple but energetic.
#  The latest version name? by network building team
Screenshot from websnpr Windows Azure has also launched a newer version probably called 1.8. Exactly I don't know. Do anyone knows about it?
#  Mlm broker list by mlm broker list members
Screenshot from websnpr What the xml dsk coding then is for?
#  deadbeat by deadbeat revolution
Screenshot from websnpr Thanks I am about to bookmark this in my social network as my readers will like to see it too.
#  Thanks by Acai Berry Scam
Screenshot from websnpr That was pretty good information. Wonderful to read your post, You rock it up and keep rocking.
#  auto power blogs 2.0 by auto power blogs 2.0
Screenshot from websnpr OHHHH just amazing post
#  Superbly written article by Tweens Clothing
Screenshot from websnpr Superbly written article, if only all website owners offered the same quality information as you, the internet would be a much better place.
#  internet marketing by internet marketing
Screenshot from websnpr Well I am about to bookmark this in my social network as my readers will like to see it too.Thanks
#  flight simulator online by flight simulator online
Screenshot from websnpr Sharepoint I honestly think the most undervalued piece of business software
#  Nice by Nauka Angielskiego W Anglii
Screenshot from websnpr Well somehow I got to read lots of articles on your blog. It’s amazing how interesting it is for me to visit you very often.
#  Helpful by buy cuisinart toaster
Screenshot from websnpr I haven't tried this new window azure. This post explained clearly how to use the window.buy cuisinart toaster
#  Zinsrechner Kredit by mahmoud atef
Screenshot from websnpr Thank you for you aritcle,It is useful for me.And I want to introduce gucci outlet to you,I think it is useful for you!
#  Haftpflichtversicherung vergleich by Haftpflichtversicherung vergleich
Screenshot from websnpr Hello folks! I am pondering if an individual can enable me out!
#  Great Post by button maker machine
Screenshot from websnpr I would leave my first comment but I don't know what to say except that I have enjoyed reading, thanks.
#  MyRelease Downloads by MyRelease
Screenshot from websnpr Great thanks
#  md used cars by md used cars
Screenshot from websnpr Well Actually never visit the site because I read a lot of other blogs feed through Google Reader. If I find something interesting, I starr it and that’s it. I visited today Guy Blog to see how the layout was hanging.
#  One Click llc by checks
Screenshot from websnpr Thanks so much for keeping the internet classy for a change. Youve got style, class, bravado.
#  hello by Web Designer
Screenshot from websnpr Thanks for the FANTASTIC post! This information is reallygood and thanks a ton for sharing it :-) I m looking forward deperately for the next post of yours..
#  Whats up by termite control brisbane
Screenshot from websnpr Thank you so much for providing individuals with an exceptionally wonderful possibility to read from this blog. It is usually so kind and also full of a good time for me personally and my office friends to visit the blog on the least three times every week to see the latest issues you have. And indeed, I’m certainly satisfied with all the remarkable things you serve. Certain 2 facts on this page are unequivocally the best we have all had.
#  how to get rid of house ants by how to get rid of house ants
Screenshot from websnpr I guess every bodies forgotten C-Murder? This shit’s gonna stick man, same parish that locked C-Miller up for life… Say bye bye to Boosie ya’ll… how to get rid of house ants
#  the charges WILL NOT STIC by Social Media Marketing Suite
Screenshot from websnpr Let me be the first to say, the charges WILL NOT STICK! Remember that shit when it comes time. Nigga got kids @ home why the fuck yall want him locked for life? Cheering in shit, ol crab ass niggas
#  Twin Mattress Set by Twin Mattress Set
Screenshot from websnpr Enjoyable thread and a fantastic way of writing. Thanks for the share and video. Hail to comedians and party attendants.
#  Zinsrechner Kredit by Zinsrechner Kredit
Screenshot from websnpr Will there be anymore data you can give on this subject matter ? Zinsrechner Kredit
#  Krankenkasse Preisvergleich by Krankenkasse Preisvergleich
Screenshot from websnpr Haha am I actually the first comment to this great article?!? Krankenkasse Preisvergleich
#  thanks by nspire
Screenshot from websnpr its nice great
#  thanks.. by צימרים בצפון
Screenshot from websnpr If I find something interesting, I starr it and that’s it. I visited today Guy Blog to see how the layout was hanging
#  I like the valuable information by Motorcycle Frames
Screenshot from websnpr I like the valuable information you provide in your articles. I’ll bookmark your weblog and check again here frequently. I am quite sure I will learn many new stuff right here ! Best of luck.
#  Bed Bugs New York by Bed Bugs New York
Screenshot from websnpr I like the services that amazingly surprised me that this kind of work should be done in the proper way and also thanks for the information you shared!
#  Website Audit Consulting by Website Audit Consulting
Screenshot from websnpr I read and watch the video which includes astonishing stuff. The Microsoft Silverlight is really awesome creation for web based application and databases
#  thanks by HCG Diet CBS News
Screenshot from websnpr You can share some of your article, I'm like you write something, really very good! I will continue to focus on. Never done in the article comments, this is my first network comments, appreciate you sharing. Very good article
#  Fishing Lodges Alaska by Fishing Lodges Alaska
Screenshot from websnpr Right here I’m with my morning coffee and an incredible informational article that has taught me one thing. It’s accurate that we discover anything new everyday. I enjoyed this article. Your views are comparable to mine. Fishing Lodges Alaska
#  Plumbers Hemel Hempstead by Plumbers Hemel Hempstead
Screenshot from websnpr Involved time to study each of the comments, however genuinely appreciated this article. The idea turned out to be Very helpful in my opinion and I am certain to every one of the commenters below! It’s always wonderful when you are able not just learn, but additionally entertained! Plumbers Hemel Hempstead
#  Comfortable Boys Shoes by Comfortable Boys Shoes
Screenshot from websnpr Thanks for writing this. I really feel as though I know so much more about this than I did before. Your blog really brought some things to light that I never would have thought about before reading it. You should continue this, Im sure most people would agree youve got a gift. Comfortable Baby Shoes | Comfortable Boys Shoes
#  Italian restaurants Jersey by Italian restaurants Jersey
Screenshot from websnpr Howdy, Personally i would just like to express that i Greatly Appreciated-through reading this blog article. Thank you for Adding this excellent content. Actually you write very beautifully. Keep up the amazing work. Alaska Fishing Lodges Italian restaurants Jersey
#  electrician brighton by electrician brighton
Screenshot from websnpr Well, I am so excited that I have found this your post because I have been searching for some information about it almost three hours. You helped me a lot indeed and reading this your article I have found many new and useful information about this subject. wind and waterproof jackets. electrician brighton
#  thanks by HCG Diet Scam
Screenshot from websnpr Thanks for sharing this, you run a wonderful blog filled with good posts. I will visit again, keep updating your blogs. I like it. HCG Diet Scam
#  Dodge Fender by Dodge Fender Flares
Screenshot from websnpr Great post, what you said is really helpful to me. I can not Agree With You Anymore. I Have Been talking with my friend about, he though it is really interesting as well. Keep up your good work With, I would come back to you.
#  thanks by erotic massage london
Screenshot from websnpr Im impressed, I must say. Very rarely do I come across a site thats both informative and entertaining, and let me tell you, youve hit the nail on the head. Your site is important; the issue is something that not enough people are
#  buckhead bar by buckhead bar mitzvah locations
Screenshot from websnpr Great post, what you said is really helpful to me. I can not Agree With You Anymore. I Have Been talking with my friend about, he though it is really interesting as well. Keep up your good work With, I would come back to you.
#  Lindsay Phillips by Lindsay Phillips Switchflops
Screenshot from websnpr This is very extra ordinary web blog.The postings in this blog are quite interesting and unique. Please add some more new posts in this blog. I am the frequent visitor to this blog.
#  Econ Power by Econ Power Programmer
Screenshot from websnpr This is very extra ordinary web blog.The postings in this blog are quite interesting and unique. Please add some more new posts in this blog. I am the frequent visitor to this blog.
#  Consultoria de empresas by Consultoria de empresas
Screenshot from websnpr Thanks for an insightful post. These tips are really helpful. Again thanks for sharing your knowledge with us.Keep up the good work. http://www.directivoslowcost.com/ Consultoria de empresas
#  HVAC Alexandria VA by HVAC Alexandria VA
Screenshot from websnpr So can I customize my windows PC through this?
#  Experience with sharepoint by crossfit diet
Screenshot from websnpr personally I've always thought that sharepoint is hugely underated. I've used it in two different roles and it's never let me down.
#  Gutter Repair Fairfax VA by Gutter Repair Fairfax VA
Screenshot from websnpr I was happy with the codes. I finally found it for I was looking for weeks on this topic. Thanks.
#  Plumber Virginia Beach VA by Plumber Virginia Beach VA
Screenshot from websnpr I definitely enjoyed every little bit of it. I have you bookmarked to check out new stuff you post.
#  Carpet Cleaning Richmond VA by Carpet Cleaning Richmond VA
Screenshot from websnpr This process is interesting. The post is also very elucidating.
#  Carpet Cleaning Rockville MD by Carpet Cleaning Rockville MD
Screenshot from websnpr Thanks for this very educational article. In fact some ideas here was used in building my design in Java.
#  Carpet Cleaning Tampa FL by Carpet Cleaning Tampa FL
Screenshot from websnpr Programming was never easy to me until I found these codes here that helped me construct a program.
#  Painting Fairfax VA by Painting Fairfax VA
Screenshot from websnpr I hope this is much easier like the bash scripting. C++ is really amazing and I plan to make more applications using this.
#  read manga by read manga
Screenshot from websnpr I like the way how the writer has thrown light on this topic.
#  gamesgogogo by flash game
Screenshot from websnpr Keep up your good work With, I would come back to you.
#  thanks by paddington massage London
Screenshot from websnpr Interesting articles are published here. By reading it I acquired great deal of knowledge on various subject. Thank you for sharing with us.
#  home trends furniture by ramonzu
Screenshot from websnpr I have read your article, it's very nice content. And I would say thanks for your content....
#  complicated by kurzurlaub
Screenshot from websnpr I didn't know this was so complicated when we started with SharePoint, so thx for the help
#  by
Screenshot from websnpr
#  Thanks by John
Screenshot from websnpr I just came across your blog and reading your beautiful words. I thought I would leave my first comment but I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
#  Thank You by Mensagens Para Facebook
Screenshot from websnpr I hope this is much easier like the bash scripting. C++ is really amazing and I plan to make more applications using this.
#  Lipotrim by Lipotrim
Screenshot from websnpr Im impressed, I must say. Very rarely do I come across a site thats both informative and entertaining, and let me tell you, youve hit the nail on the head. Your site is important; the issue is something that not enough people are talking intelligently about. Im really happy that I stumbled across this in my search for something relating to this issue.
#  GooD BLOG by Custom Essays UK
Screenshot from websnpr Nowadays, finding a high quality post is really difficult. I'd like also to thank my friend for giving me the url of your blog. Hope you appreciate my short comment though.
#  home security Essex by home security Essex
Screenshot from websnpr Thanks if only all website owners offered the same quality information as you, the internet would be a much
#  earthing mat by earthing mat
Screenshot from websnpr It has been a great instructional post and i really thank you for sharing the codes. I will be working on it after understanding the codes
#  stump grinder for sale by stump grinder for sale
Screenshot from websnpr Thanks I’m certainly satisfied with all the remarkable things you serve. Certain 2 facts on this page
#  perth bathroom renovations by perth bathroom renovations
Screenshot from websnpr It has been a great instructional post and i really thank you for sharing the codes. I will be working on it after understanding the codes
#  PC repair brighton by PC repair brighton
Screenshot from websnpr Thanks always thought that sharepoint is hugely underated. I've used it in two different roles
#  rent a party bus by rent a party bus
Screenshot from websnpr Thanks fairly interesting and it gave me extremely dependable and useful details. I wish to study such valuable content articles as it boost
#  mumbai properties by mumbai properties
Screenshot from websnpr Personally, if all site owners and bloggers made good content as you did, the web will be a lot more
#  resale flats in Thane by resale flats in Thane
Screenshot from websnpr Thanks my guess is that over time you will be able to do that, but right now the service does not allow sufficient access to the guts of the system operation that requires the installation resale flats in Thane
#  home theater furniture by home theater furniture
Screenshot from websnpr Thanks possible only in dedicated version. So before investigating in licence we have to show a proof of concept to the customer
#  window cleaners by window cleaners
Screenshot from websnpr Thanks much easier like the bash scripting. C++ is really amazing and I plan to make more applications using this.
#  Power Jobs by Power Jobs
Screenshot from websnpr Thanks good blog thanks for a great read. I am about to bookmark this in my social network as my readers will like to see it
#  detroit divorce lawyer by detroit divorce lawyer
Screenshot from websnpr Thanks methods available in the market regarding weight loss, and every method claims a potential weight loss program. But every one is different so which method
#  dating in ireland by dating in ireland
Screenshot from websnpr Thanks instructional post and i really thank you for sharing the codes. I will be working on it after understanding the codes
#  thanks by Colo Thin
Screenshot from websnpr Wonderful posts you have on your blog and I have bookmarked you and will visit yours often.
#  thanks by Xenadrine Reviews
Screenshot from websnpr Im impressed, I must say. Very rarely do I come across a site thats both informative and entertaining, and let me tell you, youve hit the nail on the head. Your site is important; the issue is something that not enough people are talking intelligently about. Im really happy that I stumbled across this in my search for something relating to this issue. Xenadrine Reviews
#  ddfsd by google
Screenshot from websnpr Im impressed, I must say. Artykuły do przedruku
#  Hydroxycut Results by Hydroxycut Results
Screenshot from websnpr I will be sharing this info on my facebook page with my friend and relatives. Thanks.
#  spain by cheapspaincity
Thanks for useful info. I will come back soon to read more on your blog. Cheap holidays to Spain
Make a comment on this post:
Subject:  

Your name:  
Your Url:  
Note: submissions may have to be approved before being visible, so don't submit your comment multiple times.