Using Node.js in an ASP.NET MVC application with iisnode

Node.js is an event-driven I/O server-side JavaScript environment based on the open-source V8 Javascript engine. It's really easy to run it on Windows now, and if you run it under iisnode, it's actually running under a standard IIS Handler, which means you can integrate it directly into ASP.NET applications.

Node event-driven model is really interesting. There's been a lot of discussion on it lately; it's neither a cancer nor the cure for cancer, but it makes it easier to handle scaling in the small. While you can handle asynchrony in most web frameworks, it's a fundamental part of Node. There's plenty of information out there on what Node is and how it's used, so I'm going to skip over that and reference a few good introductory posts:

Some background: Herding Code podcasts, early experiments

While Node has been mentioned enough on the Herding Code podcast enough that listeners have told it's been incorporated into the (unofficial) Herding Code drinking game, we've only had two official shows dedicated to Node so far.

Our first Node show (Herding Code 102, Jan 2011) was with Tim Caswell, who runs the How To Node community blog site. I really appreciated Tim's overview, spanning from the basics of Node up through some more advanced uses. If you'd like an introduction to Node, I'd recommend listening to our interview with Tim - the portion of the show where he explained why Node is useful was clear enough that it got picked up by Read Write Web in a post titled Wait, What's Node Good for Again?

Listen: Herding Code 102: Tim Caswell on Node.js

In preparation for that interview, I followed some of Tim's tutorials and wrote my first Node code. In order to do that, I spun up an Ubuntu VM, because until recently Node didn't run very well on Windows. Since then I'd poked at it from time to time, but since it didn't really fit with my day-to-day development stack it was mostly an academic exercise.

The Windows port and libuv

That started to change this past June, when Ryan Dahl announced that Microsoft was partnering with Joyent to port Node to run natively on Windows. In Ryan's post, he mentioned that Bert Belder would be one of the developers working on that port, and earlier this month I posted our second Node show interviewing Bert. Bert talked about a lot of behind-the-scenes details about the port including:

libuv

Node previously ran on top of libev, which is Unix-only. That's now changed to use the new libuv platform library.

libuv‘s purpose is to abstract platform-dependent code in Node into one place where it can be tested for correctness and performance before bindings to V8 are added. Since Node is totally non-blocking, libuv turns out to be a rather useful library itself: a BSD-licensed, minimal, high-performance, cross-platform networking library.

It's nice to see that this is paying off already - from the number of cross-platform applications listed in Ryan's post to examples like this Leveraging Node’ libuv in Windows Azure example on MSDN.

I/O Completion Ports

Windows included support for simultaneous, asynchronous I/O with Input / Output Completion Ports (IOCP) way back in Windows NT 3.5 (circa 1994), so part of the work in getting Node running on Windows required adding IOCP support to libuv.

Cygwin

There was a previous version of Node that ran on Cygwin, for certain values of "ran." I really appreciated Bert's response when asked whether they were able to use Cygwin in this port: it was exactly the opposite of what they were hoping to accomplish. Cygwin uses a compatibility layer to allow Unix applications run on Windows, which isn't ideal for performance. In contrast, this Node effort is focused on leveraging the native platform as much as possible.

Listen: Herding Code 122: Bert Belder on porting node.js to Windows

Running Node on Windows with iisnode

Node is just a single file executable. After installing Node, here's what my install folder looks like:

2011-10-21 13h43_23

The Node executable includes a server, so to have Node listen on a port you just call createServer and tell it what port to listen on:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337);
console.log('Server running at http://127.0.0.1:1337/');

That's great for a simple case, but it's likely you'll want to have Node run under a host process, which handles things like auto-start, recovery, logging, etc. In the Unix world (from what I've read) this is often done using monit and upstart, fronted by nginx. In Windows, you can run Node under IIS using iisnode.

Tomasz Janczuk (author of iisnode) summarizes some of the benefits of hosting Node with iisnode:

  • Process management. The iisnode module takes care of lifetime management of node.exe processes making it simple to improve overall reliability. You don’t have to implement infrastructure to start, stop, and monitor the processes.
  • Scalability on multi-core servers. Since node.exe is a single threaded process, it only scales to one CPU core. The iisnode module allows creation of multiple node.exe processes per application and load balances the HTTP traffic between them, therefore enabling full utilization of a server’s CPU capacity without requiring additional infrastructure code from an application developer.
  • Auto-update. The iisnode module ensures that whenever the node.js application is updated (i.e. the script file has changed), the node.exe processes are recycled. Ongoing requests are allowed to gracefully finish execution using the old version of the application, while all new requests are dispatched to the new version of the app.
  • Access to logs over HTTP. The iisnode module provides access the output of the node.exe process (e.g. generated by console.log calls) via HTTP. This facility is key in helping you debug node.js applications deployed to remote servers.
  • Side by side with other content types. The iisnode module integrates with IIS in a way that allows a single web site to contain a variety of content types. For example, a single site can contain a node.js application, static HTML and JavaScript files, PHP applications, and ASP.NET applications. This enables choosing the best tools for the job at hand as well progressive migration of existing applications.
  • Minimal changes to node.js application code. The iisnode module enables hosting of existing HTTP node.js applications with very minimal changes. Typically all that is required is to change the listed address of the HTTP server to one provided by the iisnode module via the process.env.PORT environment variable.
  • Integrated management experience. The issnode module is fully integrated with IIS configuration system and uses the same tools and mechanism as other IIS components for configuration and maintenance.

WebMatrix templates for Node.js

While completely optional, there are also some handy WebMatrix templates which make it incredibly easy to kick the tires with Node running under iisnode. These templates are really small and simple, and don't do anything secret and magical (which is a good thing) other than give you some working code and a preconfigured web.config that maps the iisnode handler for you. Here's the contents of Empty Node project:

2011-10-21 14h40_01

As I said, this is a simple template to get you started, and I like that. There's a more involved Node.js Express template which includes some common modules like the Jade template engine, but the point I want to stress is that they're not fiddling with your registry or some secret config file or anything. They're a convenient way to quickly see some pre-configured Node.js code that Works On Your Machine(tm).

Installing iisnode and the Node.js WebMatrix templates

Scott Hanselman's done a couple of in-depth blog posts about getting started with Node on Windows using iisnode and some new WebMatrix templates:

If you'd just like to get started quickly, I recommend walking through the second post. In my case, this took just a few minutes total (as I already had WebMatrix installed). Grahame Scott-Douglas typed up some great install notes:

    1. WebMatrix Install: It took a looooong time to install, about 30 minutes. I was running quite a few things on my machine at the time, including VS2010 and SQL Mgmt Studio, but it still seemed like a heckuva long time, so be patient.
    2. node.js for Windows Install: If you save to the default downloads folder in IE9 you’ll get the “This program is not commonly downloaded and could harm your computer” message. Click on “Actions” > “More actions” and “Run anyway”. Or you can open the folder in Windows explorer and double-click the file. Once you get that far the rest is easy. It installs to “C:\Program Files\nodejs” Add it to your path so you can play with the REPL and can run .js scripts. Once it’s in your path, just type “node” at the command prompt and there you have a JavaScript REPL! Or type “node myfile.js” and run JavaScript directly on Windows. Nice!
    3. iisnode for iis7 express (x86) Install: If you don’t have Microsoft Visual C++ 2010 Redistributable Package (x86) installed then the iisnode installer will tell you that you need it. Just click my link here and get it. It installs easily and then the iisnode install is a piece of cake. (FYI: You’ll have the same “This program is not commonly … etc.” message if you try to run after downloading in IE9 and that’ll happen on the next two also.)
    4. iisnode for iis7 (x86) Install: For my messing about I didn’t really need to install it but I wanted to anyway. There were no issues.
    5. iisnode for iis7 (x64) Install: I didn’t install this, ’cause I’m using a 32 bit machine for this messing about, but if you are installing the x64 version then I’m guessing you’ll need the C++ 2010 redistributable for x64.
    6. node.js templates for WebMatrix: Easy install. Thanks to Steve Sanderson (the genius behind knockout.js) for the templates.

With that complete, you can fire up WebMatrix and you'll see two new template options:

2011-10-20 11h51_15

What's in the Node.js Express Site template

The Node.js Express Site includes some useful modules:

  • connect - a middleware system for Node
  • express - a node web framework which provides things like routing, view infrastructure, content negotiation, etc.
  • jade - a view template engine (conceptually similar to ASP.NET MVC view engines like Razor, but syntactically more similar to Haml)
  • mime - a utility module for MIME-type lookups
  • qs - standard querystring parser

Note: you can find more modules listed on the Node wiki, and there's a good discussion of how these pieces fit together on StackOverflow.

Express uses Sinatra-style routing, so the controller-ish code is in routes.js:

module.exports = function(app) {

    app.get('/', function (req, res) {
        res.render('index', { 
            message: 'Welcome to my site!' 
        });
    });
    
    app.get('/about', function (req, res) {
        res.render('about');
    });

}

Views using the Jade template engine

You'll see that a request to the root of the site (matching the pattern "/") will return the index view, passing it a JSON model containing a message that says "Welcome to my site!" Looking at the index template (/views/index.jade.txt), you'll see that Jade is extremely terse:

- locals.pageTitle = "Home page"

p= message

And that uses a layout (/views/layout.jade.txt) which is also pretty simple:

!!! html
html
    head
        if locals.pageTitle
            title= pageTitle
        link(href="/css/site.css", rel="stylesheet", type="text/css")
    body
        div.header
            h1 My Node.js Site
            nav
                a(href='/') Home
                a(href='/about') About
        != body

Hitting Run, you'll see that WebMatrix has spun up site in IIS Express and we've got a simple page.

2011-10-21 17h24_06

Side note: I'm not going to go into detail, but Jade's syntax is pretty neat. It brings in the semantic focus of Haml (available in ASP.NET as NHaml), but with some nice improvements (e.g. there's no need to prefix tags with %), and it's cool to have one language (Javascript) for both server and client side code. Example:

- locals.pageTitle = "Home page"

p= message

//Server-side logic in Javascript
- if (message.length)
  ul
    - each word in message.split(" ")
      li= word

//Client-side Javascript
script
    alert("The message is: #{message}")
 

As shown in the comments, the first bit of script runs Javascript code on the server, and the second bit of script runs Javascript code on the client. That's awesome.

2011-10-21 19h16_58

Back to that iisnode is an IIS Handler thing

Okay, so Node is of course interesting and useful on its own - the above sample shows an application with routing, a nice view engine, etc. If you want to handle the hosting yourself, knock yourself out. If you're using Windows, you've got IIS available, and iisnode can host the Node process for you.

I really like new toys that play well with existing technologies, and one cool advantage of iisnode is that you can use it to integrate Node directly into an existing ASP.NET application. That all works because iisnode is an HttpHandler, which has been supported in .NET since .NET 1.1. That means that you can seamlessly route ASP.NET requests to ASP.NET and Node requests to Node.exe (running under iisnode) using the standard mechanisms the ASP.NET and IIS have supported for a very long time.

A simple iisnode web.config example

If you look the web.config in the Node.js Express Site, you can see how the iisnode handler is configured:

<configuration>
    <system.webServer>

        <handlers>
            <!-- indicates that the app.js file is a node.js application to be handled by the iisnode module -->
            <add name="iisnode" path="app.js" verb="*" modules="iisnode" />
        </handlers>
    
	<!-- Rewrite rulex excerpted for brevity --> 
        
	<!-- You can control how Node is hosted within IIS using the following options -->
        <!--
        <iisnode      
            nodeProcessCommandLine="%systemdrive%\node\node.exe"
            maxProcessCountPerApplication="4"
            maxConcurrentRequestsPerProcess="1024"
            maxPendingRequestsPerApplication="1024"
            maxNamedPipeConnectionRetry="3"
            namedPipeConnectionRetryDelay="2000"      
            asyncCompletionThreadCount="4"
            initialRequestBufferSize="4096"
            maxRequestBufferSize="65536"
            uncFileChangesPollingInterval="5000"
            gracefulShutdownTimeout="60000"
            loggingEnabled="true"
            logDirectoryNameSuffix="logs"
            maxLogFileSizeInKB="128"
            appendToExistingLog="false"
        />
        -->
    
    </system.webServer>
</configuration>

Note that there's only one required setting, which enables the iisnode handler and points it at app.js. The sample template includes an example section (commented out) which shows additional configuration options.

Playing nicely with existing Javascript files

Since we don't want to interfere with our client-side .js files, we need to tell the handler how to distinguish between client-side and server-side .js files. Tomasz Janczuk, developer of iisnode, has posted a lot of information about how configuring iisnode using web.config, including a few ways to handle that:

  • Point the handler at a specific file like the sample above, which tells iisnode only to handle requests for app.js
  • Use another file extension, like .njs, for server-side .js files. In that case, you'd use path="*.njs"
  • Use a <location> element to specify that iisnode should handle all .js files in a specific directory

Note: Remember that due to the web.config hierarchy and inheritance, so you can make system-wide settings that relate to iisnode, at the app level, etc.

Simple example: Including a Node endpoint in an existing ASP.NET MVC Application

With the above in mind, it's pretty simple include some Node goodness in an existing ASP.NET MVC application. Here's how:

Ensure the project is using the IIS Express server (rather than the ASP.NET Development Server, a.k.a. Cassini)

In order to take advantage of iisnode, you'll need to switch your project's server to IIS Express if you haven't already.

IIS Express is a lightweight, self-contained version of IIS optimized for developers - it's included with WebMatrix and Visual Studio 2010 SP1, or you can install it individually using Web Platform Installer. It gives you most of the benefits of running in the full IIS environment, but runs as an application under user permissions rather than a full system-level server. We interviewed Vaidy Gopalakrishnan about IIS Express on Herding Code 89 if you'd like to know more.

Listen: Herding Code 89: Vaidy Gopalakrishnan on IIS Developer Express

Node: You can (of course) develop your project against the full IIS server and take advantage of iisnode. In most cases, though iisnode is a better choice for development.

Switching your project to use IIS Express is incredibly simple: right-click the project and select "Use IIS Express..." then confirm the resulting dialog.

2011-10-25 16h22_12

 

Configure the iisnode handler in web.config

I listed a few options for incorporating node into an application above. In this case, I've decided to add a Node directory to the project and use the <location> element to target it. To do that, I included the following directly under the <configuration> node:

<location path="Node">
  <system.webServer>
    <handlers>
      <add name="iisnode" path="*.js" verb="*" modules="iisnode" />
    </handlers>
  </system.webServer>
</location>

Next, I added a Javascript file to that Node directory (right-click the folder, Add New Item, JScript File (yes, JScript is a silly name)). I played with some different, more complex examples, but in the end I decided to keep it simple and just return HTML (with apologies to GLaDOS):

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.write('<html><head><link href="/Content/Site.css" rel="stylesheet" /></head><body>');
    res.write('<h1>Are you still there?</h1>');
    res.write('<p>');
        res.write('We are pleased that you made it through the final challenge where we pretended we were going to murder you. We are very very happy for your success. ');
        res.write('We are throwing a party in honor of your tremendous success. Place the device on the ground, then lie on your stomach with your arms at your sides. ');
        res.write('A party associate will arrive shortly to collect you for your party. Make no further attempt to leave the testing area. ');
    res.write('</p>');
    res.write('<p>');
        res.write("Proceed to test chamber " + process.env.PORT);
    res.write('</p>');
    res.end('</body></html>');
}).listen(process.env.PORT); 

Note that near the end we return process.env.PORT, which will return the port that Node is listening on. Want to guess which one? You'll never guess...

2011-10-26 10h13_41

Did you guess it? Sorry, it was a trick question - iisnode is apparently communicating with Node over a named pipe rather than a port. Neat.

Note 1: This is an incredibly simple example, and it doesn't show off what iisnode is really built for. Some more compelling, really world examples of integrating into an ASP.NET site might include running a backend service (socket I/O, chat, XMPP), providing a service to handle Ajax requests, or otherwise taking advantage of Node's asynchronous, evented model. If I were to do anything more complex, I'd want to take advantage of the rich Node module ecosystem rather than writing everything from scratch. I decided not to do that here because I want to focus on the getting started scenario. If time permits, I'd love to do a follow-up that's more advanced.

Note 2: While this is mostly a completely standalone page that's oblivious to the surrounding ASP.NET MVC site, it doesn't need to stay that way. I did reference the site's stylesheet, and there's no reason I couldn't be calling into the database, any server-side services, etc.

Development Environment support and Logging

There's no server-side debugging support for Node in Visual Studio or WebMatrix (yet - here's hoping they add it). There are some development environments available that do have that, including:

However, IIS does provide failed request tracing and logging, both of which are helpful for simple debugging. I'll break the code in my index.js sample above by requiring a (missing) cake module on first line:

var cake = require('cake');

When I run this, I'll see an HTTP 500 error message page from IIS which tells me where to find my failed request tracing logs. In this case, failed request tracing isn't going to give as much info as the logs, but let's take a look.

2011-10-26 10h45_53

That directory contains a bunch of XML files with the request tracing logs. Opening the latest shows that I have a file not found error.

2011-10-26 10h56_13

Failed request diagnostics are really helpful for a lot of more complex scenarios, but in this case I've got a simple code error, and the Node logs will be a lot more helpful. Logging was automatically enabled by iisnode - to disable or configure logging, see the commented-out <iisnode> element in the first web.config sample. The default location for the index.js logs is in a /Node/iisnode.js.logs directory. There's one log file in it - 0.txt - and it tells me what went wrong:

node.js:203
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'cake'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (C:\Users\Jon\Documents\Jon-Share\Projects\NodeMusicStore\MvcMusicStore\MvcMusicStore\Node\index.js:1:74)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.<anonymous> (module.js:470:10)

Wrapping Up

This is just scratching the surface here, and the example's trivial. As I mentioned earlier, I think the real power of Node is in taking advantage of its event-driven, asynchronous model, and I'm interested to see how smart people like you will take advantage of the fact that you can now get it up and running - inside your ASP.NET applications, even, if you want - in just a few minutes.

48 Comments

  • Great write-up!

    Is there any sort of npm for windows ? Not sure how to pull down the packages

    Thanks again!

  • Steve, just put everything inside a node_modules folder in your app.

    Will try to get the express +mongodb running with this.

  • Steve, you should go work at AppHarbor and integrate tons more 3rd party services with .NET

  • Nick - Thanks, corrected to neither / nor.

  • Awesome. Thank you.

  • @Tomasz - This is a nice option for two reasons (1) even in a Linux server environment, you're probably going to need to do some work to ensure monitoring, uptime, logging, etc. (as I mentioned in the article). (2) If you're working with an existing ASP.NET environment or application, this is a much simpler approach to using Node than spinning up a new server.

  • it was the most anticipating article from .net community.

  • Jon, thanks a lot! Extremely useful writeup.

  • thanks for sharing this! :D

  • So how would you establish a 2 way communication between the Node server and the ASP.NET site. For example, if you wanted to trigger an event on Node when somebody logs in, and trigger an event on the ASP.NET site when somebody sends something to the Node server?

    Does there have to be a database or a webservice inbetween or can direct communication happen?

  • When I do Asp.Net I am either MVC3 or MVC4 and have adopted the fluentFilters approach when gating who gets to see what Area, Controller, etc.

    What approach would you use here if I wanted to use ASP.NET to still do my logons and then gate access to different NODE folders based upon roles.

    I know this is a Noob question, but I am a little tired ;)

  • I liked as much as you will obtain performed right here. The comic strip is attractive, your authored subject matter stylish. however, you command get got an impatience over that you would like be handing over the following. ill surely come more before again since exactly the same just about a lot regularly inside of case you protect this hike.

  • I have come across that nowadays, more and more people will be attracted to cameras and the discipline of picture taking. However, like a photographer, you need to first commit so much time period deciding which model of video camera to buy along with moving store to store just so you could potentially buy the most affordable camera of the trademark you have decided to pick. But it doesn't end just there. You also have to consider whether you can purchase a digital video camera extended warranty. Thx for the good tips I acquired from your site.

  • Can I just say what a relief to find somebody who truly is aware of what theyre talking about on the internet. You undoubtedly know the right way to carry an issue to gentle and make it important. More folks must read this and perceive this aspect of the story. I cant believe youre no more popular because you definitely have the gift.

  • The next time I learn a blog, I hope that it doesnt disappoint me as much as this one. I mean, I know it was my choice to learn, but I actually thought youd have something attention-grabbing to say. All I hear is a bunch of whining about one thing that you would fix in case you werent too busy on the lookout for attention.

  • I really like what you guys tend to be up too. Such clever work and reporting! Keep up the superb works guys I've added you guys to my own blogroll.

  • A powerful share, I simply given this onto a colleague who was doing a bit evaluation on this. And he in actual fact bought me breakfast as a result of I found it for him.. smile. So let me reword that: Thnx for the treat! However yeah Thnkx for spending the time to discuss this, I really feel strongly about it and love studying more on this topic. If potential, as you grow to be experience, would you thoughts updating your weblog with extra details? It's extremely helpful for me. Big thumb up for this weblog submit!

  • Hi, Neat post. There's a problem with your site in internet explorer, would check this… IE still is the market leader and a good portion of people will miss your great writing because of this problem.

  • I have mastered some new elements from your web page about computer systems. Another thing I have always considered is that computer systems have become a product that each residence must have for many people reasons. They offer convenient ways to organize households, pay bills, shop, study, hear music and even watch tv series. An innovative technique to complete most of these tasks has been a notebook computer. These desktops are portable ones, small, strong and convenient.

  • This web page is known as a stroll-by means of for all the information you needed about this and didn’t know who to ask. Glimpse here, and you’ll positively uncover it.

  • Wow, amazing blog structure! How long have you ever been blogging for? you make blogging glance easy. The overall look of your web site is magnificent, as smartly as the content material!

  • Thanks , I have recently been searching for info about this topic for a while and yours is the best I've discovered so far. However, what in regards to the bottom line? Are you sure in regards to the source?

  • I would like to express my appreciation to you for rescuing me from this type of incident. After browsing throughout the search engines and obtaining thoughts which are not powerful, I thought my entire life was gone. Existing devoid of the solutions to the issues you have sorted out by means of this post is a crucial case, and the kind that would have adversely affected my entire career if I had not come across the website. Your personal skills and kindness in handling every item was helpful. I'm not sure what I would've done if I had not discovered such a point like this. I am able to at this point look ahead to my future. Thanks a lot very much for this specialized and sensible help. I won't be reluctant to refer your web blog to any person who wants and needs assistance about this subject.

  • Thanks for any other informative web site. The place else could I get that kind of info written in such a perfect approach?
    I have a project that I am just now operating on, and
    I have been at the glance out for such info.

  • One other issue is that if you are in a situation where you would not have a cosigner then you may really need to try to make use of all of your federal funding options. You could find many funds and other scholarship grants that will ensure that you get funds that can help with education expenses. Thanks alot : ) for the post.

  • Hello! I've been following your blog for a while now and finally got the courage to go ahead and give you a shout out from New Caney Tx! Just wanted to mention keep up the fantastic work!

  • My family members every time say that I am killing my time here at web, except I know I am getting familiarity every day by
    reading such good content.

  • Spot on with this write-up, I truly think this website needs rather more consideration. I’ll probably be once more to learn way more, thanks for that info.

  • We're a gaggle of volunteers and opening a brand new scheme in our community. Your site provided us with useful info to work on. You have performed a formidable job and our whole neighborhood might be thankful to you.

  • Thanks for the post. My partner and i have always seen that the majority of people are eager to lose weight when they wish to appear slim as well as attractive. However, they do not continually realize that there are many benefits to losing weight additionally. Doctors insist that overweight people are afflicted with a variety of ailments that can be instantly attributed to their particular excess weight. Fortunately that people who are overweight along with suffering from different diseases are able to reduce the severity of their illnesses by way of losing weight. You'll be able to see a steady but noted improvement in health as soon as even a bit of a amount of weight reduction is achieved.

  • It’s laborious to search out educated individuals on this topic, but you sound like you understand what you’re speaking about! Thanks

  • Thanks for this wonderful article. One more thing to mention is that most digital cameras can come equipped with a new zoom lens that allows more or less of the scene for being included through 'zooming' in and out. These changes in the aim length tend to be reflected inside viewfinder and on big display screen right on the back of this camera.

  • Kindly also visit my website =).

  • excellent points altogether, you simply gained a brand new reader.

  • Lucky me I found your site by accident, and I'm shocked why this accident didn't came about in advance!

  • I've been browsing online greater than 3 hours lately, but I by no means discovered any interesting article like yours.

  • Simply find the program that suits your allowance and needs and
    after that use your bank credit card to buy the idea.

  • What's up to every one, because I am truly keen of reading this web site's post to be updated regularly.

    It carries nice material.

  • What's up to every one, for the reason that I am in fact eager of reading this webpage's post to be
    updated regularly. It includes nice material.

  • Hey there! I could have sworn I've been to this blog before but after browsing through some of the post I realized it's new to me.
    Nonetheless, I'm definitely glad I found it and I'll be book-marking and checking back frequently!

  • 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 several emails with the same comment. Is there any way you can remove people from
    that service? Many thanks!

  • What's up colleagues, its great paragraph concerning teachingand completely explained, keep it up all the time.

  • My coder is trying to persuade me to move to .
    net from PHP. I have always disliked the idea because of the expenses.
    But he's tryiong none the less. I've been
    using Movable-type on numerous websites for about a year and am
    nervous about switching to another platform.
    I have heard great things about blogengine.net. Is there
    a way I can import all my wordpress content into it?
    Any kind of help would be greatly appreciated!

  • Hey there would you mind letting me know which web host you're working with? I've loaded your blog in 3 completely different internet browsers and I must say this blog
    loads a lot quicker then most. Can you recommend a good internet hosting provider at a honest price?

    Kudos, I appreciate it!

  • Giving his eyewear timeless appeal, these Aviator sunglasses by Ray-ban are classic piece that will keep little eyes protected from harmful sunrays. Featuring high optical precision, impact resistant lenses which will stand up to the trials that young children may put them through.

  • You will also get to understand about the particular hotels which offer plantation tour
    specials.

  • tittle of san quentin quailvest-pocket shaverpredilectionestimateautocraticapportion in

  • Enjoy a area of natural charm treatments and unwinding Fijian massage.

Comments have been disabled for this content.