<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Jon Galloway</title><link>https://weblogs.asp.net:443/jongalloway/</link><description></description><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle/><itunes:category text="Technology"><itunes:category text="Tech News"/></itunes:category><item><title>A New Year's Resolution That Actually Worked: 2 Years of Daily Exercise</title><link>https://weblogs.asp.net:443/jongalloway/a-new-year-s-resolution-that-actually-worked-2-years-of-daily-exercise</link><description>&lt;p&gt;&lt;img src="https://w2nxbg.dm.files.1drv.com/y4mvd6G94DdTBVbUzRoqINo7FzA9RdXOFwI8vti_JD1lLw5klF3xHr4YRQTCYdgmpN6uz4DH6kjre4vcifzLJiHCbraAzlXyT7KCzXczoGidr3d5wH5K-p8wccuOUzkeU4_gcr_GnIciHN1KX2qgdBCDZMcXDUwKlGMLse3cjUO4pFcJ5bZY9JtpmV35mmCSd8Y?width=1400&amp;amp;height=1668&amp;amp;cropmode=none" alt="2 years of exercise - before and after" width="400" style="float: right;" /&gt;Hey! It&amp;rsquo;s been a few years since I last blogged here! Let&amp;rsquo;s get this blog thing back in action, starting with something non-technical that I&amp;rsquo;ve had a few requests for &amp;ndash; my story of two years of daily exercise.&lt;/p&gt;
&lt;p&gt;Happy New Year! Today&amp;rsquo;s a day where half the world contemplates starting some new year&amp;rsquo;s resolutions and the other half of the world tells them that new year&amp;rsquo;s resolutions are stupid and nobody sticks with them. They&amp;rsquo;re mostly right, but let me share my experience with a new year&amp;rsquo;s resolution I&amp;rsquo;ve actually stuck with for two years now.&lt;/p&gt;
&lt;p&gt;Two years ago, I had realized that my loose plan of kind-of-eating-healthy and trying-to-jog-once-a-week-or-so wasn&amp;rsquo;t working. Each year, I&amp;rsquo;d make an effort to drop some weight at the beginning of the year, I&amp;rsquo;d lose a bit, and then by the end of the year I&amp;rsquo;d put even more back on. My blood pressure was going up, I was getting winded taking out the trash (in my defense, I have a steep driveway!), and in general things were not headed in the right direction. So I made a New Year&amp;rsquo;s Resolution on January 1, 2018, to commit to 90 days straight of consistent exercise.&lt;/p&gt;
&lt;h2&gt;TLDR;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s been 2 years now and I haven&amp;rsquo;t missed a day, despite travelling 160 of those days (Russia, Turkey, Serbia, Bulgaria, UK, Norway, Australia, etc.)&lt;/li&gt;
&lt;li&gt;I dropped 30 pounds in the first 6 months and have kept it off&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m down from a size 38 waist to 34&lt;/li&gt;
&lt;li&gt;I turned 49 this past year haven&amp;rsquo;t felt this healthy since I was in my 20&amp;rsquo;s, just out of military school&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m not a fitness expert, but if you&amp;rsquo;re starting on a New Year&amp;rsquo;s exercise resolution, I can give some advice that&amp;rsquo;s worked really well for me, and might work well for you&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Top Recommendations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Commit to daily activity for a period of time. For example, I committed to 90 consecutive days.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t commit to a goal (drop 20 pounds) or a vague target (try to get to the gym 2 or 3 times a week).&lt;/li&gt;
&lt;li&gt;Some kind of accountability / support group really helps.&lt;/li&gt;
&lt;li&gt;If you don&amp;rsquo;t know where to start, I recommend P90X3 as a good, balanced fitness routine.&lt;/li&gt;
&lt;li&gt;In my experience, it&amp;rsquo;s easier to stick with if you don&amp;rsquo;t have to devote an hour or more of going somewhere like a gym.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beachbodyondemand.com/"&gt;Beachbody On Demand&lt;/a&gt;&amp;nbsp;is like a Netflix of workout programs &amp;ndash; it costs $39/quarter or $100/ year. (note: I'm a fan, but not an affiliate or anything - I don't get anything for recommending them)&lt;/li&gt;
&lt;li&gt;Gamify fitness with gadgets (Fitbit, Apple Watch, Garmin, etc.). Many employers will pay for them as part of their fitness programs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Season Opener&lt;/h2&gt;
&lt;p&gt;I ran cross country in high school and have always been a jogger. I&amp;rsquo;m not a fast runner, but regular jogging and generally eating low carb mostly worked for me. But as I hit my late 40&amp;rsquo;s, that formula had stopped working. Each year I made an effort at the start of the year to drop some weight, had a bit of success, but couldn&amp;rsquo;t keep with it and ended the year worse than I started it. I was also noticing that my flexibility was getting worse, I was getting winded playing with my kids or doing simple tasks, and was starting to feel old. Not cool.&lt;/p&gt;
&lt;p&gt;I figured it was time for a bigger change with some real commitment. After looking into some different programs, P90X3 caught my eye. I partly liked it because the style appealed to me &amp;ndash; it wasn&amp;rsquo;t some gym rat, hyper aerobics mega jam, it was just some real looking people doing some 30 minute workouts. And when I looked into it more, there were some great success stories, like this &lt;a href="https://www.youtube.com/watch?v=sZ_3ZxqGTHc"&gt;guy Ed who had lost almost 70 pounds&lt;/a&gt;. And I loved the idea of a 30 minute daily commitment, because it felt like something I could stay with long-term. I knew the pitfalls that had derailed me in the past, and 30 minutes daily exercise that worked at home or in a hotel room sounded just right for me.&lt;/p&gt;
&lt;h2&gt;The First 90 Days&lt;/h2&gt;
&lt;p&gt;My employer (Microsoft) has a pretty cool program called StayFit that offers reimbursement for fitness expenses. Check it out, your employer might have a program like that, or might consider starting one. I found that P90X3 was available through Beachbody On Demand for $99/year, and I got a subscription.&lt;/p&gt;
&lt;p&gt;Side note 1: The name Beachbody On Demand rang the cheeseball alarm for me, but I persevered and am happy I did. Beachbody On Demand is basically a Netflix of exercise programs. You get access to a ton of great exercise programs, and it&amp;rsquo;s all super tasteful and fitness focused.&lt;/p&gt;
&lt;p&gt;Side note 2: P90X3 sounds like a black ops spy program. Here&amp;rsquo;s the deal: Tony Horton started off with this program called Power 90, a 90 day workout program. Then he came out with an update called P90X (for Power 90 Extreme) in 2005. After that, there was P90X2 (2009), which improved on P90X and brought more intense workouts. All of the above workouts were more in the 60-75 minute range. Then P90X3 came out in 2014, probably competing with other shorter workout programs, and each workout is exactly 30 minutes long. So P90X3 is Power 90 version 3. Oh, and Tony Horton was 55 when P90X3 was filmed!&lt;/p&gt;
&lt;p&gt;So I committed to 90 days of daily exercise and cutting out carbs+sugar+alcohol. I dropped most of the 30 pounds I&amp;rsquo;d hoped to lose, but more importantly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I learned this was not just a &amp;ldquo;sweat off those pounds&amp;rdquo; thing. There as comprehensive health focus on balance, flexibility, strength, agility, as well as cardio. I realized that by just focusing on jogging, I was missing out on a lot. More on that later.&lt;/li&gt;
&lt;li&gt;They made me do yoga, I fell over a lot, my wife said I was laughing harder than she&amp;rsquo;d ever heard me laugh, and eventually my balance and flexibility got a lot better.&lt;/li&gt;
&lt;li&gt;I started feeling different throughout the day. When I had to run to catch a flight, I actually like it! I was disappointed when I hit the gate, I wanted to run more. When I was playing with my 11yo daughter at the beach and she wanted to race, I was a little shocked when I shot out way ahead of her and had to pretend to fall over to let her win. So I learned that being in better shape has effects all day, every day &amp;ndash; not just when I&amp;rsquo;m officially exercising.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;90 Days And Beyond&lt;/h2&gt;
&lt;p&gt;So I hit 90 days, lost the weight, and felt great. Here was the challenge: What to do next? Give myself a high five and drop the exercise until the weight crept back on? That didn&amp;rsquo;t sound right. Plus, I&amp;rsquo;d realized something &amp;ndash; the 30 minutes of exercise was actually something I looked forward to every day! I felt great levelling up on the workouts, and feeling of accomplishment I had when I finished the daily workout was often the highlight of that day. So I kept at it &amp;ndash; another 90 days, through the end of the year, etc. And so I&amp;rsquo;ve hit 2 years now because stopping isn&amp;rsquo;t appealing at all. And if for some reason I have to miss a day, I think I&amp;rsquo;ll probably start right back up the next day and try to beat this record.&lt;/p&gt;
&lt;p&gt;After finishing 90 days of P90X3, I decided that it was amazing, but I couldn&amp;rsquo;t handle the repetition and hearing the same jokes again for another 90 days. Fortunately, Beachbody On Demand had a bunch of other programs. Here are some I&amp;rsquo;ve liked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.beachbodyondemand.com/programs/core-de-force/overview"&gt;Core De Force&lt;/a&gt;: Kickboxing + Ab shaping workouts. These are a ton of fun, and are all in the 30-45 minute range. I loved the P90X3 MMX workout, so I was really happy to find a whole program that focused on mixed martial arts. Joel and Jericho are a lot of fun, too.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beachbodyondemand.com/programs/liift4/overview"&gt;LIIFT4&lt;/a&gt;: After finishing Core De Force, I tried out Joel (from CDF)&amp;rsquo;s newer program, LIIFT4. It&amp;rsquo;s a mix of weight lifting and HIIT (high intensity interval training) plus an ab workout at the end. I hadn&amp;rsquo;t done a directed weight lifting program like this before, and I really liked it. I&amp;rsquo;ve repeated this program 3 times over the past 2 years, and it&amp;rsquo;s fun to progress each time. This is an 8 week program, and it was great to work though the full program as Joel pushes the cast and viewers to up their weights every week. I hadn&amp;rsquo;t lifted weights for years, and never with any real direction. I dig this one.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beachbodyondemand.com/programs/21-day-fix-extreme-real-time/overview"&gt;21 Day Fix Extreme&lt;/a&gt;: Autumn Calabrese totally sneaks up on you &amp;ndash; she seems low key, but at the end of a 30 minute workout I&amp;rsquo;m stumbling and gasping for breath and she seems completely unfazed. They&amp;rsquo;ve recently reshot this in a realtime format, so instead of just 7 routines that you repeat over and over, there are 21 separate recording.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.beachbodyondemand.com/programs/insanity-max30/overview"&gt;Insanity Max:30&lt;/a&gt;: When I first tried this, the choreographed aerobics style bugged me. I gave it another shot later, and liked it a lot more. Shaun T pushes you really hard &amp;ndash; the entire 30 minutes felt like I was at my maximum intensity. But, I also started to hit some knee pain, and had to back off a bit (ominous foreshadowing music in the background).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generally for all the programs, I&amp;rsquo;ve worked through the program a few times, then incorporated them into my grab bag for periods when I&amp;rsquo;m not following a specific program.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve started with one other program lately that&amp;rsquo;s not on Beachbody on Demand &amp;ndash; &lt;a href="https://amzn.to/37pzVl5"&gt;Tony Horton&amp;rsquo;s The Next Level&lt;/a&gt;. It&amp;rsquo;s actually &lt;a href="https://dysfunctionalparrot.com/health-and-fitness/idiots-guide-to-getting-tony-hortons-the-next-level/"&gt;a little hard to find&lt;/a&gt;, although it&amp;rsquo;s now available through Amazon Prime Video if you&amp;rsquo;re in the US and also get an additional subscription $6.99/month subscription to this Gaiam TV thing. I really like these routines, and the format includes three levels of intensity for each exercise, which is a nice idea, especially if you&amp;rsquo;d like to do this with a friend, family member, etc. The one tradeoff is that they&amp;rsquo;re all an hour long, and I&amp;rsquo;ve really been spoiled with the 30 minute workouts. I&amp;rsquo;ve been working them in a few days a week lately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exercise Equipment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Core De Force and Insanity Max 30 can be done with no extra equipment.&lt;/p&gt;
&lt;p&gt;P90X3 and 21 Day Fix Extreme can be done with just a resistance band set, although for some of the routines it&amp;rsquo;s better to have some dumbells.&lt;/p&gt;
&lt;p&gt;LIIFT is a weight lifting focused, so I got two adjustable weight dumbells (20-50 pounds each in 10 pound increments) that are okay. I&amp;rsquo;m planning to get some better ones with smaller increments and more range for this year.&lt;/p&gt;
&lt;p&gt;I also used an exercise watch to help motivate myself. I went through a few Fitbit Iconic watches &amp;ndash; I really loved the watch, but they kept breaking (black screen of death). This year I upgraded to a Garmin Forerunner 945. Both the Fitbit and Garmin watches have great battery life &amp;ndash; over a week. I&amp;rsquo;m not an iPhone person, so I didn&amp;rsquo;t look at Apple watches, but I hear good things about them outside of the battery life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protip&lt;/strong&gt;: Many employers have fitness stipends. I mentioned Microsoft&amp;rsquo;s StayFit program earlier, and it&amp;rsquo;s paid for my fitness watches, weights, running shoes, my Beachbody on Demand subscription, etc. It doesn&amp;rsquo;t hurt to ask if you&amp;rsquo;re not sure. Gym memberships are expensive, so fitness equipment that lasts for years is a pretty good investment by comparison.&lt;/p&gt;
&lt;h2&gt;Exercise While Travelling&lt;/h2&gt;
&lt;p&gt;Beachbody On Demand includes online video streaming, so it works great on my laptop on hotel Wi-Fi. They&amp;rsquo;ve also got a mobile app, so I&amp;rsquo;ve got a few videos downloaded on my phone for offline use just in case.&lt;/p&gt;
&lt;p&gt;Travelling is often really tough on schedules, including really early flights, long flights, and red eye flights that make daily workouts challenging. So here are some things that work for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always do a workout before leaving on a trip, just in case, so I don&amp;rsquo;t miss the day if there&amp;rsquo;s a travel delay.&lt;/li&gt;
&lt;li&gt;Do a yoga workout before and after travel &amp;ndash; it works out the travel kinks really well!&lt;/li&gt;
&lt;li&gt;Have some hotel room favorite workouts planned &amp;ndash; fortunately, most of P90X3 works surprisingly well in a hotel room, without any weights or equipment (especially MMX, Yoga, Isometrics, Dynamix, CVX, and Accelerator). Also the entire Core De Force lineup is great for travel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting Stronger&lt;/h2&gt;
&lt;p&gt;One really fun part of getting in better shape was seeing how it formed a virtuous cycle. As I felt stronger, I could work out harder. As my cardiovascular system improved, I could push longer. As a long time runner, it was fun to see my course times starting to get a lot faster, despite de-emphasizing running, because I had a lot more strength and cardiovascular base. Even things I&amp;rsquo;d written off as just &amp;ldquo;not my thing&amp;rdquo; like yoga got easier, since the strength, balance, and flexibility I&amp;rsquo;d picked up in other routines made it possible for me to push a little further every time.&lt;/p&gt;
&lt;h2&gt;Time Management&lt;/h2&gt;
&lt;p&gt;Committing to a 30 minute workout every day has also had an unexpected positive impact on my time management and daily planning. It&amp;rsquo;s forced me to think about my day in more detail the day before &amp;ndash; not just for travel, but there&amp;rsquo;s other stuff like you can&amp;rsquo;t really do a hard cardio workout right after a big meal.&lt;/p&gt;
&lt;p&gt;As a remote employee, I struggle with taking time for myself. It&amp;rsquo;s easy to get sucked into working all the time, and feeling guilty if I&amp;rsquo;m not. But I can always take 30 minutes for myself, and often it gives me a burst of energy to be more productive at work.&lt;/p&gt;
&lt;h2&gt;Dealing with Injury&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s important to watch out for injuries that could derail the daily workout thing.&lt;/p&gt;
&lt;p&gt;As both my endurance and strength increased, I started pushing harder, and started having to deal with some minor injuries. The first was a pulled calf muscle from a switch roundhouse kick in summer 2018, and this year I started getting runners knee when I tried to work in daily treadmill intervals combined with too much HIIT training. In both cases, the answer was to pay attention to notice it early, then change my exercise focus to heal &amp;ndash; more yoga and stretching, upper body focus with weight lifting, cut back on running for a while.&lt;/p&gt;
&lt;p&gt;I started exercising barefoot when I did the Core De Force MMA routines, then started exercising barefoot for all the programs. It&amp;rsquo;s worked great, and cut down on knee pain. Recently, I&amp;rsquo;ve had a few people recommend Vibram Five Fingers shoes for running, so I&amp;rsquo;ve got a pair on order.&lt;/p&gt;
&lt;h2&gt;Diet and Weight Loss&lt;/h2&gt;
&lt;p&gt;Early on, I mentioned that weight loss was an important reason for starting on this, yet I haven&amp;rsquo;t mentioned diet until now. That&amp;rsquo;s because, in the past, I&amp;rsquo;d focused on diet and dropped a few pounds, then put them back on when I couldn&amp;rsquo;t keep to the rigid diet (due to travel, family events, whatever). So for this fitness regimen, I&amp;rsquo;ve really focused on the exercise side. Here&amp;rsquo;s how I generally try to eat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mostly keto: meat, healthy fats, vegetables&lt;/li&gt;
&lt;li&gt;No sugar (including alcohol)&lt;/li&gt;
&lt;li&gt;No non-vegetable carbs (bread, flours, grains, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After keeping the 25-30 pounds off for 2 years, I&amp;rsquo;ve learned more about what I can get away with and how to balance things a bit. I love good food, and always have local food when I travel. I avoid processed carbs and sugars, but have some from time to time. I generally avoid alcohol, both due to the dietary impact and the difficulty in exercising hard the day after drinking, but I make allowances for special occasions (e.g. the entire month of December).&lt;/p&gt;
&lt;h2&gt;The Social Network&lt;/h2&gt;
&lt;p&gt;There are a few social network things I&amp;rsquo;ve found to help keep me motivated.&lt;/p&gt;
&lt;p&gt;Strava is a social fitness network. It works with workout trackers to upload runs, bike rides, and other workouts and shares your stats with your friends. I mostly started using it when I moved from Fitbit to Garmin as a way to track my workouts that was vendor agnostic, but it&amp;rsquo;s fun to get and give kudos to friends and get the feeling that you&amp;rsquo;re surrounded by workout friends. That&amp;rsquo;s especially nice as a remote worker. I think I&amp;rsquo;m mostly using it wrong, since most of my friends are sharing cool bike rides and half marathons and stuff while I&amp;rsquo;m just checking in every day with a 30-45 minute stationary cardio workout, but they haven&amp;rsquo;t unfriended me yet.&lt;/p&gt;
&lt;p&gt;Fun fact: One of my friends on Strava is Tim Heuer, and he&amp;rsquo;s always sharing cool bike rides. Back when I was kind of new to P90X3, I was googling for some info and came across a blog post he wrote back in 2014: &lt;a href="https://timheuer.com/blog/how-i-lost-40-pounds-in-two-easy-steps-weight-loss-p90x/"&gt;I lost 55lbs using these two amazing simple steps - you can too!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also joined some Facebook groups from other P90X and LIIFT folks. Again, it&amp;rsquo;s good to have the feeling that you&amp;rsquo;re surrounded by people who are working out regularly to keep encouraged. Fun side effect: I&amp;rsquo;ve started following other Facebook groups that make me happy, including a home coffee roaster group and a sous vide cooking group, and unfollowing (not unfriending, just unfollowing) real life friends that mostly use Facebook to argue. Now my Facebook feed is wonderful!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve used Twitter a bit, but try to do it pretty sparingly because I don&amp;rsquo;t want to be annoying. I&amp;rsquo;ve been checking in a few times a year, for two main reasons. First, I wanted to publicly commit to put some extra pressure on myself to stay with it. Second, I wanted to share what&amp;rsquo;s worked for me to encourage other people and start conversations if they had questions. And with that &amp;ndash; feel free to ping me on Twitter at &lt;a href="https://twitter.com/jongalloway"&gt;@jongalloway&lt;/a&gt; if you&amp;rsquo;ve got questions!&lt;/p&gt;</description><pubDate>Wed, 01 Jan 2020 22:56:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/a-new-year-s-resolution-that-actually-worked-2-years-of-daily-exercise</guid></item><item><title>How to Talk Yourself out of your New Year’s Blogging Resolution… One Day At A Time</title><link>https://weblogs.asp.net:443/jongalloway/how-to-talk-yourself-out-of-your-new-year-s-blogging-resolution-one-day-at-a-time</link><description>&lt;p&gt;It&amp;rsquo;s a new year! Even though years are an arbitrary construct and all that, you feel reinvigorated! Alive! Ready to take on the world! And you&amp;rsquo;ve read all those posts and tweets and instatumblrs about blogging! They&amp;rsquo;re pretty compelling, really, and you&amp;rsquo;re in a suggestible state of mind. You&amp;rsquo;re thinking about taking the plunge.&lt;/p&gt;
&lt;p&gt;Frankly, you lack the tools and experience to talk yourself out of this one. Perhaps I can be of assistance. I&amp;rsquo;ve got years of real world practice in talking myself out of blogging, and I&amp;rsquo;m here to share that knowledge with you.&lt;/p&gt;
&lt;h2&gt;Procrastination Is Key&lt;/h2&gt;
&lt;p&gt;Spoiler alert: It all comes down to putting off to tomorrow what you could do today. But for good reasons! Always good reasons. That&amp;rsquo;s how you can sell it to yourself&amp;hellip; it&amp;rsquo;s all for a good cause, really!&lt;/p&gt;
&lt;h2&gt;Other People Have Blogged, Are Blogging, Or Will Blog This Anyway&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s only room for a limited amount of information in the universe. Some scientific estimates [&lt;a href="https://arxiv.org/pdf/quant-ph/0110141v1.pdf"&gt;pdf&lt;/a&gt;] cap us at figures as low as 10&lt;sup&gt;90&lt;/sup&gt; bits! So we certainly don&amp;rsquo;t want any duplication whatsoever. Ergo, vis a vis, concordantly, if it&amp;rsquo;s at all possible that someone else might have blogged this kind of thing at some point, probably better not to muddy the waters or whatever.&lt;/p&gt;
&lt;h2&gt;Other, More Informed Experts Should Take This One&lt;/h2&gt;
&lt;p&gt;Okay, maybe nobody&amp;rsquo;s bloggerated this one up just yet, but this is all very technical and should really be handled by certified experts. We&amp;rsquo;re sharing technical information here, it had better be just right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Experience Bonus:&lt;/strong&gt; The more actual experience you have, the more you know that you don&amp;rsquo;t know. You also, if you&amp;rsquo;re lucky, get to come into contact with really quite actually brilliant people who know thing. Now, if you&amp;rsquo;re lucky, eventually you&amp;rsquo;ll know people who are, collectively, smarter than you at every possible subject area and you can just sit and watch them talk about all the things. If you&amp;rsquo;re really lucky, you&amp;rsquo;ll get to meet, online or even in person, &lt;em&gt;the&lt;/em&gt; worldwide expert of a few things. How could you presume to blog on &lt;em&gt;their&lt;/em&gt; topic?&lt;/p&gt;
&lt;h2&gt;Needs More Playtesting&lt;/h2&gt;
&lt;p&gt;Okay, you&amp;rsquo;ve actually found a cool thing and nobody&amp;rsquo;s talking about it yet. But remember that cool utility you were excited about a few years ago? Are you still excited about it now? Moved on, right? How about that super interesting technique of injecting dependencies directly into your spleen using pure ASM? It destroyed your spleen and you&amp;rsquo;re on spleen replacement pills now, aren&amp;rsquo;t you, smart guy? The truth is that absolutely anything interesting you know probably needs a little more testing before you recommend it. At least another week or two (wash rinse repeat).&lt;/p&gt;
&lt;h2&gt;Professionalize This&lt;/h2&gt;
&lt;p&gt;Look, if you&amp;rsquo;re going to write a blog post these days it&amp;rsquo;s got to follow best practices. Are your code samples &lt;em&gt;above reproach&lt;/em&gt;? Are you sure??? Have you read the twitters and the hacker news comments lately? I don&amp;rsquo;t care if you&amp;rsquo;re writing &amp;ldquo;Introduction to Lego Mindstorms For Toddlers&amp;rdquo;, it had better include unit tests in a pure functional language, today&amp;rsquo;s top front end framework, and a lot of scary stuff you can&amp;rsquo;t remember right now but you know is vitally important! And have you considered scalability? What about security??? You know security is important, right? Don&amp;rsquo;t you? What is wrong with you??? Probably better sit this one out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Experience Bonus:&lt;/strong&gt; If you&amp;rsquo;ve happened to write any books, articles, official documentation or official announcement blog post, you&amp;rsquo;ve got a head start here. You&amp;rsquo;ve had editors review and critique your work. You&amp;rsquo;ve seen how the code and text you were so proud of on the first draft had obvious errors that editors and/or commenters immediately discovered. This draft is probably wrong, buddy. Better give it a day and come back to proof it again.&lt;/p&gt;
&lt;h2&gt;Those Tweets Tho&lt;/h2&gt;
&lt;p&gt;Look, here&amp;rsquo;s a loophole! Writing a blog post is hard work, and a lot of it&amp;rsquo;s really just filler, right? You can probably get the point across in a single tweet.&lt;/p&gt;
&lt;p&gt;1/ Or, if not one tweet&amp;hellip;&lt;/p&gt;
&lt;h2&gt;I&amp;rsquo;ll Blog It When It Ships&lt;/h2&gt;
&lt;p&gt;Whoa! You just wrote some cool code, it all works, and this is definitely worth sharing!&lt;/p&gt;
&lt;p&gt;Slow down, tiger. Let&amp;rsquo;s wait until this thing actually gets through QA, user testing, and deployment. There have to be some bugs, right? Let&amp;rsquo;s wait and blog the real deal. Plus, we&amp;rsquo;re really quite busy now! After we ship, there will be time for low priority things like blogging and smelling the flowers. Wait until we ship, then things will totally calm down and we&amp;rsquo;ll do all the things we want to do now but don&amp;rsquo;t have time for.&lt;/p&gt;
&lt;p&gt;This works great for cool demonstrations you write up for a tech presentation, too! You&amp;rsquo;re way too busy preparing for the presentation right now, and that&amp;rsquo;s really it would be irresponsible to take time away to blog it up right now, but right after the conference, obviously, there will be abundant time!&lt;/p&gt;
&lt;p&gt;And also, some of this stuff might even be kind of secret until the ship date! Loose lips and all that, old boy.&lt;/p&gt;
&lt;p&gt;The beauty of this excuse, as you know deep in your heart, is that as soon as magical ship day hits, something else will come up, and you&amp;rsquo;ll never actually get that magical blogging down day.&lt;/p&gt;
&lt;h2&gt;Magnificent&amp;nbsp; Debut [or] Don&amp;rsquo;t Call It A Comeback&lt;/h2&gt;
&lt;p&gt;Okay, logic has failed and you still want to blog. There&amp;rsquo;s hope for you yet.&lt;/p&gt;
&lt;p&gt;Fine, you&amp;rsquo;ll write some blogerisms, but it can&amp;rsquo;t be just anything! You have to come out swinging! Billions of people are watching, you can&amp;rsquo;t enter the fray with some random gibberish! The first one (or, in the restart scenario, the first &lt;em&gt;new&lt;/em&gt; one) needs to be plus one insightful! Don&amp;rsquo;t ship it &amp;lsquo;til it&amp;rsquo;s ready! Iterate until the urge passes.&lt;/p&gt;
&lt;p&gt;And to do this right, you really should have a full code sample. Or, better yet, a repo. Well, probably what you really want is an open source project, right?&lt;/p&gt;
&lt;h2&gt;Off Topic!&lt;/h2&gt;
&lt;p&gt;Sure, sometimes you just want to write about some new random thing that&amp;rsquo;s not strictly in the topic area you normally write about. Let&amp;rsquo;s just keep that to yourself, then, shall we?&lt;/p&gt;
&lt;h2&gt;Market Timing&lt;/h2&gt;
&lt;p&gt;Hmm. None of the above defenses have helped, and you&amp;rsquo;re actually about to write a technical blog post. Fine, fine, you should totally go ahead with this&amp;hellip; but&amp;hellip; well, I don&amp;rsquo;t want to be a jerk, but you know it&amp;rsquo;s Monday, right? Nobody reads blogs on Monday. They&amp;rsquo;re all just coming back to work. Tuesday&amp;rsquo;s maybe okay, but you might want to wait until Wednesday.&lt;/p&gt;
&lt;p&gt;Hey, it&amp;rsquo;s Wednesday, but things are actually pretty busy with work and stuff. Maybe this afternoon&amp;hellip; Oh, hey, I know today was busy and all, but you totally don&amp;rsquo;t want to post in the late afternoon! Do you even know about time zones? People in Europe are sleeping now and you&amp;rsquo;re about to post? Wait until tomorrow.&lt;/p&gt;
&lt;p&gt;Um, good morning. It&amp;rsquo;s Thursday morning. Dumb time to post. You really want to wait until earlier in the week for maximum hits and all that.&lt;/p&gt;
&lt;p&gt;Hello. Happy Friday / Saturday / Sunday. Have a great day, but don&amp;rsquo;t even think about posting today! Nobody&amp;rsquo;s going to read it now!&lt;/p&gt;
&lt;p&gt;Oh, and this works really well with blog posts about a software or product release! If you can&amp;rsquo;t post it on the day of the release, game over man.&lt;/p&gt;
&lt;h2&gt;Okay, Not Really&lt;/h2&gt;
&lt;p&gt;None of these are really good reasons. I&amp;rsquo;ll give my rebuttals, but I&amp;rsquo;m of course interested in yours in the comments or on Friendster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Other People Have Blogged, Are Blogging, Or Will Blog This Anyway&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://johnnycoder.com/blog/2008/06/18/unoriginal-thoughts-bears-repeating/"&gt;Unoriginal Thoughts Bear Repeating&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Usually every blog has a new / different / updated take.&lt;/li&gt;
&lt;li&gt;Your blog is &lt;strong&gt;your&lt;/strong&gt; personal record. You can review your previous notes, it&amp;rsquo;ll be there even if other blogs go away, etc.&lt;/li&gt;
&lt;li&gt;10&lt;sup&gt;90&lt;/sup&gt; bits is actually quite a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Other, More Informed Experts Should Take This One
&lt;ul&gt;
&lt;li&gt;One of the best ways to learn more is to risk being accidentally stupid on the internet. Do your research, ask an expert to review if really necessary,&amp;nbsp;add a disclaimer that you're not an expert, but share what you &lt;em&gt;think&lt;/em&gt; you know.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Needs More Playtesting&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;I actually think there&amp;rsquo;s a healthy balance here. I think &amp;ldquo;Hey, look at this thing I just found and might install or not&amp;rdquo; probably goes in a Tweet, but maybe set a reminder to get back to it in a week to blog your fresh experiences?&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s always the edit button. If you try something for a while and it doesn&amp;rsquo;t work out or you find something better, update your post to explain why.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Professionalize This&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;I think the best way to handle this is separating the decide and do decisions as much as possible, then time boxing. Is this post topic worthwhile? How many hours of investment is it worth? Great, I&amp;rsquo;ll give myself 2 hours, then out it goes.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Those Tweets Tho&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Not sure here. I think the kinds of conversations I have on Twitter are great for exploring a topic, but when a conversation generates some interesting response, it&amp;rsquo;s time to put it on the //toblog list.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m just now checking my top tweets on favstar.fm and &lt;a href="https://analytics.twitter.com/"&gt;Twitter Analytics&lt;/a&gt;, and there are probably a few other ways to dig up past interesting conversations if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;I&amp;rsquo;ll Blog It When It Ships&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;One thing that&amp;rsquo;s worked for me here is to start writing the blog post up in rough form as I go, so it&amp;rsquo;s quick and easy to post immediately afterwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Off Topic!&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;I think this is really a judgement call. I know personally that I&amp;rsquo;m rarely offended by the occasional &amp;ldquo;here&amp;rsquo;s a neat thing&amp;rdquo; post from likeminded nerds. In fact, I usually like them. Sure, if you go overboard it&amp;rsquo;s too much, but give yourself some leeway.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Magnificent&amp;nbsp; Debut [or] Don&amp;rsquo;t Call It A Comeback&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s important to remember that a blog is a &amp;ldquo;web log&amp;rdquo;. It&amp;rsquo;s not a big deal. &lt;br /&gt;&lt;img width="195" height="212" src="http://i.imgur.com/gZfPEFU.jpg" /&gt;&lt;/li&gt;
&lt;li&gt;I think it&amp;rsquo;s easier to break the ice &amp;ndash; again, really just with myself &amp;ndash; with a non-technical post. Hmm, like this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;Thoughts? What excuses did I miss? Have I helped talk you out of and / or back into blogging?&lt;/p&gt;</description><pubDate>Tue, 03 Jan 2017 08:25:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/how-to-talk-yourself-out-of-your-new-year-s-blogging-resolution-one-day-at-a-time</guid><category>blogging</category></item><item><title>Two free video courses: Intro to ASP.NET MVC and Responsive UI with Bootstrap</title><link>https://weblogs.asp.net:443/jongalloway/two-free-video-courses-intro-to-asp-net-mvc-and-responsive-ui-with-bootstrap</link><description>&lt;p&gt;I'm really excited to announce that two of my latest courses on Microsoft Virtual Academy are now live! Both are recordings of live courses Christopher Harrison and I lead in the beautiful Channel 9 studios, and include downloads of all slides, code and live chat logs.&lt;/p&gt;

&lt;p&gt;These are live events with two instructors and an active chat, and we pushed the demo code to GitHub throughout the event so attendees could get their hands on it immediately. One really nice benefit of this format (compared to most other video training) is that we were able to watch for common questions and answer them live. It's also hugely motivating to hear from viewers around the world, many who are staying up late at night. Nothing starts the morning off like "Hello from Bangladesh! Hi from Brazil!" Hellos from Holland, Poland, Bulgaria... even New Jersey!&lt;/p&gt;

&lt;p class="alert alert-info"&gt;&lt;strong&gt;Hey!&lt;/strong&gt; These two courses are part of our new Web Wednesdays series on MVA. Be sure to join us for the next session: &lt;a href="http://aka.ms/AspNet-SignalR"&gt;Lighting Up Real-Time Web Communications with SignalR&lt;/a&gt; with Brady Gaster and me on September 24!&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://c2.staticflickr.com/6/5568/15179845646_c202c6b118_h.jpg"&gt;&lt;/p&gt;

&lt;p&gt;Quick links for the impatient:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc"&gt;Introduction to ASP.NET MVC&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.microsoftvirtualacademy.com/training-courses/building-responsive-ui-with-bootstrap"&gt;Building Responsive UI with Bootstrap&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: These courses are on Microsoft Virtual Academy, which requires you to log in with a (free) Microsoft Account. No cost or obligations, and the account bookmarks where you're at across multiple courses which is pretty helpful.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Introduction to ASP.NET MVC&lt;/h2&gt;

&lt;p&gt;Christopher and I put on &lt;a href="http://www.microsoftvirtualacademy.com/training-courses/developing-asp-net-mvc-4-web-applications-jump-start"&gt;Developing ASP.NET MVC 4 Web Applications Jump Start&lt;/a&gt; last year, built from the ASP.NET MVC certification course materials. Since the course materials are usually covered in a week long class, we had to move pretty quick to cover everything. We've heard from a lot of happy viewers that really liked it (many of whom have written to tell us it was a big part of their successful certification test prep). You can read more about my thoughts on that course &lt;a href="http://weblogs.asp.net/jongalloway/free-6-hour-online-course-developing-asp-net-mvc-4-web-applications-jump-start"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, we also were aware that it was a little fast for some developers who were completely new to the space, e.g. developers who were new to web development or front-end web developers who weren't familiar with C# or Visual Studio. And in the meantime, Christopher had joined Microsoft as a fulltime member of the MVA team (woo hoo!). When Christopher contacted me to strategize about some ideas for courses, we decided it was time for an&amp;nbsp; MVC course that spoke to absolute beginners.&lt;/p&gt;

&lt;p&gt;This course is broken into the following modules:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Basics of MVC and the Moving Parts &lt;/li&gt;

  &lt;li&gt;Creating and Configuring Models &lt;/li&gt;

  &lt;li&gt;The Power of Visual Studio &lt;/li&gt;

  &lt;li&gt;Deep Dive into Controllers &lt;/li&gt;

  &lt;li&gt;Deep Dive into Views &lt;/li&gt;

  &lt;li&gt;Introduction to Bootstrap &lt;/li&gt;

  &lt;li&gt;Introduction to Authentication in MVC​ &lt;/li&gt;

  &lt;li&gt;Supplement Your Knowledge &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul&gt;
&lt;/ul&gt;

&lt;p class="alert alert-info"&gt;View the course here: &lt;a href="http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc"&gt;Introduction to ASP.NET MVC&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Building Responsive UI with Bootstrap&lt;/h2&gt;

&lt;p&gt;Boostrap is a front-end framework that makes it easy to build nice looking sites that respond well to different display sizes using CSS media queries. That means your sites automatically adapt to look nice on desktop, laptop, tablets and phones without any hacky code (on server or client) to try to guess if the user probably wants a "mobile" view of the site (what does that even mean now that we've got giant phones, tiny tablets, and convertibles like the Surface?). &lt;/p&gt;

&lt;p&gt;All the ASP.NET project in Visual Studio 2013 (Web Forms and MVC) are built with Bootstrap. It's automatically in every new ASP.NET application.&lt;/p&gt;

&lt;p&gt;That's a good start, but I felt like all of the presentations and training I'd seen using on Bootstrap with ASP.NET had been pretty simple: "Hey, check it out, we have Bootstrap now, responsive design is great, here's a new theme, yay! Done!" That's definitely about all I'd covered in my presentations. &lt;/p&gt;

&lt;p&gt;Sure, Bootstrap is neat, but there are some challenges: The grid system can be a little complex, especially if you want your content to lay out differently at different sizes. Do I really have to memorize all those Bootstrap class names (especially fun for complex components or layouts)? How do I keep my site from looking like every other Bootstrap site out there? And my personal pet peeve: how do I take advantage of Bootstrap without turning my HTML into a horrible mess of &amp;lt;div class="col-lg-6 col-md-4 col-sm-3"&amp;gt; Bootstrap classes that seem to want to take over?&lt;/p&gt;

&lt;p&gt;That's what this class is about. Christopher and I cover the basics pretty quickly, then go deep with things like responsive page design, making Visual Studio pick up some of the hard work, and taking advantage of Less to get the HTML under control. Here's the outline:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Introduction to Bootstrap &lt;/li&gt;

  &lt;li&gt;Bootstrap Components &lt;/li&gt;

  &lt;li&gt;Page Design &lt;/li&gt;

  &lt;li&gt;Visual Studio and ASP.NET Integration &lt;/li&gt;

  &lt;li&gt;JavaScript Functions &lt;/li&gt;

  &lt;li&gt;Using Bootstrap with LESS &lt;/li&gt;

  &lt;li&gt;Bootstrap in the Real World &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;/ul&gt;&lt;p class="alert alert-info"&gt;View the course here: &lt;a href="http://www.microsoftvirtualacademy.com/training-courses/building-responsive-ui-with-bootstrap"&gt;Building Responsive UI with Bootstrap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm really happy with this course - I think we really nailed it, and judging from the live response it sounds like they thought so, too. I'll do a follow-up blog post digging into the Bootstrap / Less stuff, it's pretty slick.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://c4.staticflickr.com/4/3913/15202400432_531097d0f8_b.jpg"&gt;&lt;/p&gt;

&lt;h2&gt;We'll Do It Live!&lt;/h2&gt;

&lt;p&gt;As I mentioned earlier, having two trainers gives us the opportunity to do a lot of things live. We both take turns participating in the attendee chat and giving answers to common questions as they come up. We also work against a live repository on GitHub (using the built-in Visual Studio support), pushing the demo code as soon as each session's completed. If you're able to catch a live event in the future, please do!&lt;/p&gt;</description><pubDate>Wed, 10 Sep 2014 23:22:32 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/two-free-video-courses-intro-to-asp-net-mvc-and-responsive-ui-with-bootstrap</guid></item><item><title>Web Camp in Los Angeles with Scott Hunter - July 9</title><link>https://weblogs.asp.net:443/jongalloway/web-camp-in-los-angeles-with-scott-hunter-july-9</link><description>&lt;p&gt;&lt;img style="width: 100%;" src="https://mseventsww.microsoft.com/BannerImages/127c7dbf-2a1d-4f06-a024-661e0cb31138.jpg"&gt;&lt;/p&gt;&lt;p&gt;Web devs in southern California, we've got a great Web Camp event coming up next week in Los Angeles on July 9. We're wrapping up the Summer Web Camps tour I &lt;a href="https://weblogs.asp.net/jongalloway/upcoming-web-camps-summer-2014"&gt;announced a bit ago&lt;/a&gt; with a blowout! This is a free, one day event and we've got space available in the fancy new Microsoft Playa Vista office.&lt;/p&gt;&lt;p&gt;&lt;a class="btn btn-success" href="https://msevents.microsoft.com/cui/EventDetail.aspx?culture=en-US&amp;amp;EventID=1032590304"&gt;Register here &lt;span class="glyphicon glyphicon-circle-arrow-right"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We're privileged to have &lt;/strong&gt;&lt;a href="https://twitter.com/coolcsh"&gt;&lt;strong&gt;Scott Hunter&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; as one of the speakers for this event. Scott's a group program manager at Microsoft for Azure and Tools, including ASP.NET , MVC, Web API, Web Pages, SignalR, Entity Framework, Web Tooling, NuGet and Azure Cache/SDK's.&lt;/strong&gt; You may have seen Scott's presentations with Scott Hanselman at TechEd and Build over the years. He's got a great perspective for the challenges web developers are solving today in ASP.NET as well as where ASP.NET is going in the future.&lt;/p&gt;

&lt;p&gt;We've also got presentations from local heroes &lt;a href="https://twitter.com/danielegan"&gt;Daniel Egan&lt;/a&gt; and &lt;a href="https://twitter.com/adamTuliper"&gt;Adam Tuliper&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;If you're an ASP.NET developer in southern California, you don't want to miss this &lt;strong&gt;free&lt;/strong&gt; event. In addition to a full day of solid web dev content, this is a great chance to ask questions directly to the head of the ASP.NET PM team.&lt;/p&gt;&lt;p&gt;Here's the agenda for what we'll be covering:&lt;/p&gt;


&lt;table class="table table-striped table-bordered table-hover"&gt;
   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;th&gt;
            Session
         &lt;/th&gt;
         &lt;th&gt;
            Speaker
         &lt;/th&gt;
         &lt;th&gt;
            Start
         &lt;/th&gt;
         &lt;th&gt;
            End
         &lt;/th&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Keynote
         &lt;/td&gt;
         &lt;td&gt;
            Scott Hunter
         &lt;/td&gt;
         &lt;td&gt;
            8:30
         &lt;/td&gt;
         &lt;td&gt;
            9:30
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Introduction to ASP.NET and Visual Studio 2013 Web Tooling
         &lt;/td&gt;
         &lt;td&gt;
            Jon Galloway
         &lt;/td&gt;
         &lt;td&gt;
            9:30
         &lt;/td&gt;
         &lt;td&gt;
            10:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Building Web Applications using the latest ASP.NET technologies
         &lt;/td&gt;
         &lt;td&gt;Adam Tuliper&lt;/td&gt;
         &lt;td&gt;
            10:15
         &lt;/td&gt;
         &lt;td&gt;
            11:00
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Break
         &lt;/td&gt;
         &lt;td&gt;&lt;/td&gt;
         &lt;td&gt;
            11:00
         &lt;/td&gt;
         &lt;td&gt;
            11:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Building web front ends for both desktop and mobile using the latest web standards
         &lt;/td&gt;
         &lt;td&gt;
            Jon Galloway
         &lt;/td&gt;
         &lt;td&gt;
            11:15
         &lt;/td&gt;
         &lt;td&gt;
            12:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Lunch
         &lt;/td&gt;
         &lt;td&gt;&lt;/td&gt;
         &lt;td&gt;
            12:15
         &lt;/td&gt;
         &lt;td&gt;
            1:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            API Services for both web and devices
         &lt;/td&gt;
         &lt;td&gt;
            Daniel Egan
         &lt;/td&gt;
         &lt;td&gt;
            1:15
         &lt;/td&gt;
         &lt;td&gt;
            2:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Running, improving and maintaining a site in the real world
         &lt;/td&gt;
         &lt;td&gt;
            Jon Galloway
         &lt;/td&gt;
         &lt;td&gt;
            2:15
         &lt;/td&gt;
         &lt;td&gt;
            3:15
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Break
         &lt;/td&gt;
         &lt;td&gt;&lt;/td&gt;
         &lt;td&gt;
            3:15
         &lt;/td&gt;
         &lt;td&gt;
            3:30
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Real-time Communications with SignalR
         &lt;/td&gt;
         &lt;td&gt;
            Jon Galloway
         &lt;/td&gt;
         &lt;td&gt;
            3:30
         &lt;/td&gt;
         &lt;td&gt;
            4:30
         &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;
            Wrap Up
         &lt;/td&gt;
         &lt;td&gt;
            Scott Hunter
         &lt;/td&gt;
         &lt;td&gt;
            4:30
         &lt;/td&gt;
         &lt;td&gt;
            5:00
         &lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;</description><pubDate>Tue, 01 Jul 2014 20:30:22 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/web-camp-in-los-angeles-with-scott-hunter-july-9</guid></item><item><title>Scripting .NET project migration to Automatic NuGet Package Restore</title><link>https://weblogs.asp.net:443/jongalloway/scripting-net-project-migration-to-automatic-nuget-package-restore</link><description>&lt;h2&gt;Background on NuGet Package Restore and Automatic Package Restore&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages"&gt;NuGet Package Restore&lt;/a&gt; allows you to reference NuGet packages in your project without shipping them with your source code or committing them to source control. The general idea is that the packages are restored - that is, downloaded and installed - into your project when it is build. This offers a number of benefits, including better interaction with source control and smaller code distributions.&lt;/p&gt;
&lt;p&gt;NuGet Package Restore was originally implemented using an MSBuild task, so whenever you ran a build in Visual Studio the build step would handle the package restore before continuing with the next steps in the build process. This worked, but had a few downsides. For one, it required MSBuild to work, which conflicts with cross-platform development, build servers, etc. Another issue is that it required a separate .nuget directory be added to your Visual Studio solution, including a copy of NuGet.exe and a targets file.&lt;/p&gt;&lt;p&gt;&lt;a title="NuGet MSBuild directory" href="http://www.flickr.com/photos/36836555@N00/14275675599/"&gt;&lt;img alt="NuGet MSBuild directory" src="http://farm4.static.flickr.com/3881/14275675599_1cc70a79a0_b.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Migrating Automatic Package Restore&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://docs.nuget.org/docs/reference/package-restore#Automatic_Package_Restore_in_Visual_Studio"&gt;NuGet 2.7 (and later) added support for Automatic NuGet Package Restore without requiring MSBuild&lt;/a&gt;. For new projects, this all just automatically works. However, if you had an older project for which you'd manually configured NuGet Package Restore, there is &lt;a href="http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore#If_you_are_not_using_TFS"&gt;a manual process to be followed&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;ol&gt;
&lt;li&gt;Remove the .nuget folder from your solution. Make sure the folder itself is also removed from the solution workspace. 
&lt;li&gt;Edit each project file (e.g., .csproj, .vbproj) in the solution and remove any references to the NuGet.targets file. To do so, search for Nuget.targets and remove the entire &amp;lt;Import Project&amp;gt; line where it is referenced. &lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;
&lt;p&gt;This is really easy - it just takes seconds to do on one project. However, if you've got a lot of projects, it's painful busywork. I was making some updates on the &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36393"&gt;Web Camps Training Kit&lt;/a&gt; which has a lot of projects (several demos and hands on labs, each with begin and end state solutions). I wanted a recursive script that dug through all the subfolders and fixed up my projects for me automatically. I asked around on Twitter and heard about &lt;a href="http://geekswithblogs.net/terje/archive/2014/06/11/converting-projects-to-use-automatic-nuget-restore.aspx"&gt;IFix, from Terje Sandstrom&lt;/a&gt;. It's a nice solution that handles this problem, but I wanted a recursive script, and if I was going to automate IFix with a recursive script I might as well just write a script that handled everything.&lt;/p&gt;
&lt;h2&gt;Enough Talk, Show Me The Script&lt;/h2&gt;
&lt;p class="alert alert-warning"&gt;&lt;strong&gt;Warning!&lt;/strong&gt; This script edits all projects and deletes all .nuget and packages directories recursively for the specified path. That means if you ran it from C:\ it would modify every project on your C drive. Obviously, be careful about the current directory and make sure your affected projects are under source control.&lt;/p&gt;
&lt;p&gt;&lt;script src="https://gist.github.com/jongalloway/969ca4d2c351c5a37949.js"&gt;&lt;/script&gt;&lt;/p&gt;&lt;noscript&gt;&lt;pre class="brush: ps; auto-links: false;"&gt;#this automates the steps found here: http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore
#yes, you could code golf this to about 6 characters if you wanted to

$find= @'
&amp;lt;Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /&amp;gt;
'@

foreach ($f in Get-ChildItem -Recurse -Path ".\" -Filter *.csproj | sort-object)
{
    $text = Get-Content $f.FullName -Raw
    $text.Replace($find, "") | set-content $f.FullName
}

Get-ChildItem .\ -include .nuget,packages -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }&lt;/pre&gt;&lt;/noscript&gt;
&lt;p&gt;Here's what it does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Recursively search for .csproj files in a path 
&lt;li&gt;Remove the MSBuild target for NuGet package restore 
&lt;li&gt;Recurse through the directory structure, removing .nuget and packages directories &lt;/li&gt;&lt;/ol&gt;
&lt;h2&gt;A few admissions / excuses&lt;/h2&gt;
&lt;p&gt;Yes, it could be more terse. Get-ChildItem could be gci, Set-Content could be sc, all the switches could use the single letter equivalents. I used to be embarrassed posting verbose PowerShell, but I've decided that this is a lot easier to read and there's no real point to minifying PowerShell.&lt;/p&gt;
&lt;p&gt;Yes, this is just doing a simple string replace. I looked at doing things the XML way (XPath or DOM manipulations) or using regular expressions, but decided that I want this to be completely explicit. I don't want to match any lines unless they're exactly matching what was written by Visual Studio when I enabled package restore. Because of that, I only want an exact string match. I think that this is a little faster since it's just a string replace, but I didn't test that and don't really care if it isn't.&lt;/p&gt;
&lt;p&gt;Yes, this leaves a blank line in the .csproj file. That makes no difference in the way Visual Studio handles it and it was easier than worrying about it.&lt;/p&gt;
&lt;p&gt;Yes, that $find declaration is weird. The string I'm searching for (&amp;lt;Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /&amp;gt;) contains a lot of characters that need to be escaped in PowerShell, and even more if doing a Regex replace in PowerShell (which I tested a bit). So instead I used a &lt;a href="http://technet.microsoft.com/en-us/library/ee692792.aspx"&gt;here-string&lt;/a&gt;, which is kind of like a &lt;a href="http://msdn.microsoft.com/en-us/library/aa691090.aspx"&gt;C# verbatim string literal&lt;/a&gt; (e.g. @&lt;a href="file://\\server\share\file.txt"&gt;\\server\share\file.txt&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;For more information on why you should migrate away from MSBuild based Automatic Package Restore, see these posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.xavierdecoster.com/migrate-away-from-msbuild-based-nuget-package-restore"&gt;Migrate away from MSBuild-based NuGet package restore&lt;/a&gt; (Xavier Decoster)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html"&gt;The right way to restore NuGet packages&lt;/a&gt; (David Ebbo)&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Thu, 19 Jun 2014 23:53:40 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/scripting-net-project-migration-to-automatic-nuget-package-restore</guid><category>NuGet</category></item><item><title>MVA: Introduction to ASP.NET MVC - Free Live Training - June 23</title><link>https://weblogs.asp.net:443/jongalloway/mva-introduction-to-asp-net-mvc-free-live-training-june-23</link><description>&lt;p class="well well-lg"&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; The course (including videos, slides, and links to the code) are published here: &lt;a title="http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc" href="http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc"&gt;http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc&lt;/a&gt;&lt;/p&gt;
&lt;p class="well well-lg"&gt;&lt;a href="http://www.microsoftvirtualacademy.com/liveevents/introduction-to-asp-net-mvc"&gt;Join Christopher Harrison and me for a fun, free online training event at Microsoft Virtual Academy on June 23, 2014!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Are you a &lt;strong&gt;front-end coder who wants to learn&lt;/strong&gt; how to &lt;strong&gt;build data-driven, server-side web applications&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Maybe you know some &lt;strong&gt;Web Forms&lt;/strong&gt; and want to &lt;strong&gt;make the jump to ASP.NET MVC&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;This exciting new course &lt;strong&gt;focuses on the basics&lt;/strong&gt; of this popular framework for building scalable, standards-based web applications using well-established design patterns, so you can &lt;strong&gt;ramp up quickly&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="hidden-xs" style="height: 300px; display: block;"&gt;
&lt;div&gt;&lt;a href="http://www.microsoftvirtualacademy.com/liveevents/introduction-to-asp-net-mvc"&gt; &lt;img alt="Introduction to ASP.NET MVC" src="http://mvapublicstorage.microsoft.com/banners/MVA-ASP-intro-1hero.jpg" /&gt; &lt;/a&gt;&lt;/div&gt;
&lt;div id="splash-text" style="width: 340px; color: white; padding-left: 15px; margin-top: -135px;"&gt;
&lt;div style="text-align: left; line-height: 25px; font-size: 20px;"&gt;Introduction to ASP.NET MVC&lt;/div&gt;
&lt;div style="top: 0px; width: 320px; font-size: 14px; margin-top: 10px; position: relative;"&gt;Live event on June 23, 2014&lt;/div&gt;
&lt;div style="top: 20px; width: 320px; font-size: 14px; margin-top: 0px; position: relative;"&gt;&lt;a style="color: white;" href="http://www.microsoftvirtualacademy.com/liveevents/introduction-to-asp-net-mvc"&gt; &lt;strong&gt;Register Now!&lt;/strong&gt; &lt;img style="top: 3px; position: relative;" alt="" src="http://mvastorage.microsoft.com/public/css/images/cta-button.png" /&gt; &lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Free! Live! Learn ASP.NET MVC!&lt;/h2&gt;
&lt;p&gt;Chr&lt;a href="https://twitter.com/geektrainer"&gt;Christopher Harrison&lt;/a&gt; and I had tons of fun doing a previous MVA event last September: &lt;a href="http://www.microsoftvirtualacademy.com/training-courses/developing-asp-net-mvc-4-web-applications-jump-start#fbid=F4KOaVqyxYX"&gt;Developing ASP.NET MVC 4 Web Applications Jump Start&lt;/a&gt;. That one's available online, and I'm told it's one of the most popular courses on Microsoft Virtual Academy.&lt;/p&gt;
&lt;p&gt;We based the previous MVC Jump Start on the the official Microsoft &lt;a href="http://www.microsoft.com/learning/en-us/exam-70-486.aspx"&gt;Exam 70-486&lt;/a&gt;, which is part of the &lt;a href="http://www.microsoft.com/learning/en-us/mcsd-web-apps-certification.aspx"&gt;MCSD: Web Applications&lt;/a&gt; certification. We did what we could to make it approachable for beginners, but cramming an entire week long course in ASP.NET MVC into a single day meant it moved pretty quickly.&lt;/p&gt;
&lt;p&gt;So Christopher and I both agreed that it's be great to have a more introductory level class that moves a little slower and is easier for beginners to follow. Here's what we'll be covering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basics of MVC and the Moving Parts&lt;/li&gt;
&lt;li&gt;Creating and Configuring Models&lt;/li&gt;
&lt;li&gt;The Power of Visual Studio&lt;/li&gt;
&lt;li&gt;Deep Dive into Controllers&lt;/li&gt;
&lt;li&gt;Deep Dive into Views&lt;/li&gt;
&lt;li&gt;Introduction to Bootstrap&lt;/li&gt;
&lt;li&gt;Introduction to Authentication in MVC​&lt;/li&gt;
&lt;li&gt;Supplement Your Knowledge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We'll be taking live questions, and there will be online chat support as well. If you've been wanting to learn ASP.NET MVC, this is a great opportunity!&lt;/p&gt;
&lt;p&gt;And don't let your boss tell you that you can't miss a day of work for this. Remind them that this is free, and you'll be saving them tons of money with your new web dev super powers.&lt;/p&gt;</description><pubDate>Fri, 13 Jun 2014 20:23:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/mva-introduction-to-asp-net-mvc-free-live-training-june-23</guid></item><item><title>New Book: Pro Windows 8.1 Development with XAML and C#</title><link>https://weblogs.asp.net:443/jongalloway/new-book-pro-windows-8-1-development-with-xaml-and-c</link><description>&lt;a href="http://www.apress.com/9781430240471"&gt;&lt;img style="float: right;" src="http://www.apress.com/media/catalog/product/cache/9/image/9df78eab33525d08d6e5fb8d27136e95/A/9/A9781430240471-3d_1.png"&gt;&lt;/a&gt; 
&lt;p&gt;Between releases of my other book (&lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-5.productCd-1118794753.html"&gt;Professional ASP.NET MVC&lt;/a&gt;, next release due out soon!) &lt;a href="http://jesseliberty.com/2014/06/03/pro-windows-8-1-development-wxaml-and-c/"&gt;Jesse Liberty&lt;/a&gt; somehow talked me into collaborating with him on writing a book on Windows 8.1 development. Actually, it wasn't a hard sell, because I've &lt;a href="http://www.bing.com/search?q=xaml+site%3Aweblogs.asp.net%2Fjongalloway"&gt;done a good amount of XAML dev&lt;/a&gt;, love C#, and Windows 8 / 8.1 development is a lot of fun. We co-wrote the table of contents, I wrote code samples and very rough drafts (sometimes just bullet points), and Jesse turned it into prose. That worked pretty well, but was a little too slow - especially once my work on Professional ASP.NET MVC 5 ramped up. Fortunately, &lt;a href="https://twitter.com/skimedic"&gt;Phil Japiske&lt;/a&gt; agreed to join us and finish the book off. Phil really nailed it - he polished off the remaining chapters, reviewed and greatly improved the existing chapters, and made sure everything was up to date for Windows 8.1.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.apress.com/9781430240471"&gt;Pro Windows 8.1 Development with XAML and C#&lt;/a&gt; is focused on teaching you how to use your C# skills to build Windows Store applications. It teaches you the necessary XAML skills, the controls, the application model, and takes you from File / New to publishing an application to the Windows Store.&lt;/p&gt;
&lt;p&gt;Here's the table of contents:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Getting Started 
&lt;li&gt;Building Your First Windows 8 App 
&lt;li&gt;Themes, Panels, and Controls 
&lt;li&gt;Binding 
&lt;li&gt;Views 
&lt;li&gt;Local Data 
&lt;li&gt;Remote Data and Services 
&lt;li&gt;Search and Share Contracts 
&lt;li&gt;Notifications 
&lt;li&gt;Application Life Cycle 
&lt;li&gt;Making Money 
&lt;li&gt;Publishing Your App &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;I'm especially happy with my contributions to the local and remote data chapters. Any non-trivial application needs to tackle these concerns, and it's important to get right. I went through a few iterations on the pattern for data access and settled on a Task based repository pattern that worked pretty well. For the remote data, I showed how to set up Web API services both as JSON/XML endpoints and leveraging OData.&lt;/p&gt;
&lt;p&gt;I also wrote a lot of the Notifications chapter, since the primary example demonstrates using Azure Mobile Services to send client notifications.&lt;/p&gt;&lt;p&gt;The book is a little over 300 pages, so it hopefully strikes a pretty good balance on the thorough vs. longwinded scale. I hope you like it!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Today (Friday June 13, 2014) there's a 40% discount code on the Apress site: FRDY13.&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Fri, 13 Jun 2014 16:06:36 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/new-book-pro-windows-8-1-development-with-xaml-and-c</guid><category>Book</category><category>XAML</category></item><item><title>weblogs.asp.net Now Running On Orchard and Azure Web Sites</title><link>https://weblogs.asp.net:443/jongalloway/weblogs-asp-net-now-running-on-orchard-and-azure-web-sites</link><description>&lt;p&gt;I'm incredibly happy to announce that my blog - and all 750 other blogs running under weblogs.asp.net - are now powered by Orchard and Azure Web Sites! That's 750 blogs, all hosted in 4 Azure Web Sites all running on only one large virtual machine.&lt;/p&gt; &lt;h2&gt;A bit of nostalgia&lt;/h2&gt; &lt;p style="float: right; padding-left: 10px"&gt;&lt;a title="Olde Tyme Blogge" href="https://web.archive.org/web/20031018232745///weblogs.asp.net/jgalloway/posts/7498.aspx"&gt;&lt;img border="0" alt="Olde Tyme Blogge" src="//farm6.static.flickr.com/5077/14205986930_ed4cc80451.jpg"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I've been blogging on weblogs.asp.net since May 2003 - over eleven years. Back then it was called &lt;a href="https://web.archive.org/web/20030208002715///dotnetweblogs.com/"&gt;dotnetweblogs&lt;/a&gt; and ran on an open source blogging platform called .Text. Over the years, it got moved through varivous versions of Community Server, and had been stuck on an old, customized version of Community Server for almost seven years. It was hard to take myself seriously when blogging about web standards when my blog was being forced to quirks mode in IE due to an ancient HTML header.&lt;/p&gt; &lt;p&gt;I'd exported my BlogML several times and thought about moving, but I really didn't want to. I'd been part of the weblogs.asp.net community for a long time - for a while I subscribed to every single RSS feed and read each of them daily - and I'm a pretty big ASP.NET fan, too. I resorted to cramming a bunch of JavaScript into the "News and Announcements" HTML field on the left. It pulled in jQuery from a CDN and did all kinds of terrible things to insert widgets and hide elements I didn't want and make the page jump around for a few seconds while loading. Kind of like most news websites these days, so maybe I was ahead of my time.&lt;/p&gt; &lt;p&gt;I'd campaigned internally a few times to get the blog platform updated, but understood it was a big job to update several hundred weblogs - with history, and without downtime. Fortunately &lt;a href="//weblogs.asp.net/scottgu"&gt;there's another very high profile blogger on the weblogs.asp.net platform&lt;/a&gt;; that may have had something to do with getting the update to happen. :-)&lt;/p&gt; &lt;p&gt;So I was extremely happy to hear that there was finally an effort underway to make the move!&lt;/p&gt; &lt;p&gt;&lt;em&gt;Disclaimer: I did not do any of the dev work for this migration. In fact, I was one of the top whiny customers - my blog was one of the test cases for the migration, and I gave &lt;a href="https://twitter.com/sebastienros"&gt;Sebastien Ros&lt;/a&gt; and the Neudesic dev team (&lt;a href="https://www.linkedin.com/in/pfuerte"&gt;Peter Fuerte&lt;/a&gt;, Samir Patel, &lt;/em&gt;&lt;em&gt;&lt;a href="https://www.linkedin.com/in/zachall"&gt;Zac Hall&lt;/a&gt;, &lt;/em&gt;&lt;em&gt;and &lt;a href="https://twitter.com/terrimorton"&gt;Terri Morton&lt;/a&gt;)&lt;/em&gt;&lt;em&gt; tons of feedback and piles of feature requests.&lt;/em&gt; &lt;h2&gt;Hosting Details&lt;/h2&gt; &lt;p&gt;Orchard is hosted as &lt;b&gt;Azure Websites&lt;/b&gt; on a single basic large instance using using 4 websites on a single instance to scale out the memory limit on 32 bits.&lt;/p&gt; &lt;p&gt;We use &lt;strong&gt;4 Azure SQL Database&lt;/strong&gt; instances, Business edition set to 10GB. Each azure website points to a SQL Azure database, and each database contains around 200 blog using table prefixes.&lt;/p&gt; &lt;p&gt;Each website points to an &lt;b&gt;Azure Cache Service&lt;/b&gt; for output caching&lt;/p&gt; &lt;p&gt;All blogs point to the same &lt;b&gt;blob storage &lt;/b&gt;account&lt;/p&gt; &lt;p&gt;An A&lt;b&gt;zure Queue&lt;/b&gt; is used to synchronize the main portal and the blogs&lt;/p&gt; &lt;p&gt;One ARR proxy in an &lt;b&gt;Azure VM&lt;/b&gt; is used to route the requests to the Azure websites. We set it up this way because we already had this VM set up to do the proxy work for the rest of *.asp.net.&lt;/p&gt; &lt;p&gt;Here's a general diagram (stolen with permission from Sebastien's talk at the Orchard Harvest conference this week):&lt;/p&gt; &lt;p&gt;&lt;a title="weblogs.asp.net infrastructure" href="//www.flickr.com/photos/36836555@N00/14393514942/"&gt;&lt;img border="0" alt="weblogs.asp.net infrastructure" src="//farm4.static.flickr.com/3903/14393514942_95c546e130_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Performance Statistics&lt;/h2&gt; &lt;p&gt;Here are our monthly estimated statistics for weblogs.asp.net:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Bandwidth out – 17 terrabytes  &lt;li&gt;Page Views – 1.3 million  &lt;li&gt;Unique Visitors – 750,000  &lt;li&gt;Visits – 1.1 million &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Here's the thing: Azure Web Sites is fast and efficient. I was already convinced of that, having run a lot of sites on it over the past few years. But &lt;strong&gt;Orchard is crazy efficient&lt;/strong&gt;, too. I did not know that. I recently saw Sebastien give a presentation on Orchard, and it blew my mind. If you had heard or read that Orchard is slow, bloated or inefficient, you owe it to yourself to look again. I've been shocked by how fast and efficient the current release of Orchard is.&lt;/p&gt; &lt;p&gt;The Orchard output cache module includes pretty moderate caching but delivers pretty extreme CPU performance benefits, as shown in the CPU charts from the production site below. Notice we're hovering around 20% CPU most of the time:&lt;/p&gt; &lt;p&gt;&lt;a title="weblogs.asp.net output caching" href="//www.flickr.com/photos/36836555@N00/14415042433/"&gt;&lt;img border="0" alt="weblogs.asp.net output caching" src="//farm4.static.flickr.com/3911/14415042433_bf8ff11349_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Hosting Cost Summary&lt;/h2&gt; &lt;p&gt;It's incredibly cheap to host all 750 weblogs on Azure Web Sites, SQL Database, Storage and Cache. Here's a per-month cost estimate (keep the above stats in mind when you read these):&lt;/p&gt; &lt;table class="table table-striped table-condensed table-hover"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Item &lt;/td&gt; &lt;td&gt;Usage to Date &lt;/td&gt; &lt;td&gt;Cost to Date &lt;/td&gt; &lt;td&gt;Estimated Cost Per Month &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Data Transfer OUT (GB) - Zone 1&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;1428.41 (GB)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;170.81&lt;/p&gt;&lt;/td&gt; &lt;td&gt;196.43 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Data Transfer IN (GB) - Zone 1&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;1.21 (GB)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.00&lt;/p&gt;&lt;/td&gt; &lt;td&gt;0.00 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Database Units (in 10s) - Business Edition&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.54 DB Units (10s)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;53.88&lt;/p&gt;&lt;/td&gt; &lt;td&gt;61.96 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Storage Transactions (in 10,000s) - Data Management&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;323.84 (10,000s)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.16&lt;/p&gt;&lt;/td&gt; &lt;td&gt;0.18 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Basic (128 MB) - Cache&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;2.52 (128 MB)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;31.52&lt;/p&gt;&lt;/td&gt; &lt;td&gt;50.00 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Data Transfer (GB) - Zone 1&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.08 (GB)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.01&lt;/p&gt;&lt;/td&gt; &lt;td&gt;0.01 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Standard IO - Block Blob (GB) - Geo Redundant&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;1.92 (GB)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;0.09&lt;/p&gt;&lt;/td&gt; &lt;td&gt;0.10 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Large Basic Web Sites Hours - Web Sites&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;609.00 (hours)&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;187.20&lt;/p&gt;&lt;/td&gt; &lt;td&gt;215.28 &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Grand Total &lt;/td&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt; &lt;p&gt;443.67&lt;/p&gt;&lt;/td&gt; &lt;td&gt;523.47 &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;This works out to under about 70 cents per blog per month, which is pretty impressive.&lt;/p&gt; &lt;h2&gt;What was changed in Orchard to support multi-blog&lt;/h2&gt; &lt;p&gt;Nothing!&lt;/p&gt; &lt;p&gt;&lt;a href="//docs.orchardproject.net/Documentation/Setting-up-a-multi-tenant-orchard-site"&gt;Multi-tenancy is a native capability of Orchard CMS&lt;/a&gt;. It is the primary reason we chose Orchard as the platform. So that's neat.&lt;/p&gt; &lt;p&gt;We're using 4 websites on a single Azure instance to scale out the memory limit on 32 bits, and any optimizations that were made to Orchard itself for this project were rolled back into the core platform (for v.1.8.1.0 and later).&lt;/p&gt; &lt;h2&gt;Migrating 750 weblogs (with more than 75k posts and 250k comments)&lt;/h2&gt; &lt;p&gt;weblogs.asp.net supported &lt;a href="//en.wikipedia.org/wiki/BlogML"&gt;BlogML&lt;/a&gt; export and import. BlogML is an open format for Blog content, and it includes everything you'd need to migrate eleven years of blogging - including posts, comments and tags. It's not a slam dunk, though. Years ago, I tried to export my blog and the requests kept timing out because the export (including comment spam) was something like 5 or 6 MB. A year ago I was sick with a flu so I decided to do some blog spam analysis; &lt;a href="https://twitter.com/terrimorton"&gt;Terri&lt;/a&gt; and team incorporated the results into their spam filters which cut the spam levels quite significantly. Still, lots of data.&lt;/p&gt; &lt;p&gt;On the Orchard side, they took advantage of &lt;a href="//docs.orchardproject.net/Documentation/Making-a-Web-Site-Recipe"&gt;custom Orchard recipes&lt;/a&gt; to handle the import. Recipes are great - they include everything you'd need to initialize a new site, including blogs, users, etc. And they can be based off a template, so you can create multiple (say, 750) recipes from one template. Slick.&lt;/p&gt; &lt;p&gt;At a high level (because I didn't write the code), Sebastien and friends tackled the problem like this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Export all sites to BlogML  &lt;li&gt;Convert the BlogML to custom Orchard recipes to create the new blogs including:  &lt;ul&gt; &lt;li&gt;Posts  &lt;li&gt;Comments  &lt;li&gt;Users  &lt;li&gt;New passwords &lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Generate custom commands to automate the recipe processing &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Automation was important, because they reran this migration several times.&lt;/p&gt; &lt;p&gt;One other neat thing about the import: they used the VM Berserker technique (my name, I hope it sticks). You may have read about this approach before on Troy Hunt's post titled &lt;a href="//www.troyhunt.com/2013/12/working-with-154-million-records-on.html"&gt;Working with 154 million records on Azure Table Storage – the story of “Have I been pwned?”&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The VM Berserker technique takes advantages of one of the most unappreciated values of cloud computing: the ability to develop cheaply, scale way up for a short time, and then turn off. This lets you do big things for less than the cost of a cup of coffee. Scaling up is nice. Scaling up and then back down is even nicer. So for this migration, they tested things out on a VM, then scaled it up to handle the migration, then turned it off (to stop paying). Done. Oh, and by running in an Azure VM they were running the processing in the same datacenter as the data, so it was really fast.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;This is the kind of thing that tells me that cloud computing is the future. Sure, it's great to spin up sites and VM's and worker roles and stuff in the cloud. It's great that I can amp them up when I want. But often lost in the discussion is the power of being able to scale hard for an hour or two, then shut down. The cost-per-awesome on that transaction hasn't sunk in with most developers yet.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Sebastien announced at the Orchard Harvest conference this week that the tools that were written to migrate the content from the old system to Orchard (running Orchard recipes against BlogML export files) will be released publicly very soon.&lt;/p&gt; &lt;h2&gt;New Blog Goodness&lt;/h2&gt; &lt;p&gt;So much good stuff!!!&lt;/p&gt; &lt;h3&gt;New Bootstrap blog theme&lt;/h3&gt; &lt;p&gt;This is probably my favorite.&amp;nbsp; In the past I'd written a few custom or inline styles, but now the system's running on a great framework. Bootstrap's tons of fun. There are individual styles and components that make things look better, so I can throw in a Bootstrap table style or grid whenever it's useful.&lt;/p&gt; &lt;p&gt;&lt;button class="btn btn-default"&gt;&lt;span class="glyphicon glyphicon-star"&gt;&lt;/span&gt;This is a button with a star on it.&lt;/button&gt;&lt;/p&gt; &lt;p&gt;Plus, it's easy to drop in a new theme from time to time. I &lt;a href="//bootswatch.com/"&gt;grabbed one off Bootswatch&lt;/a&gt; to get started, but am looking forward to tinkering with it.&lt;/p&gt; &lt;h3&gt;Mobile friendly display&lt;/h3&gt; &lt;p&gt;Since Bootstrap 3 is a mobile first framework, it always looks good on smaller displays. Posts automatically scale down for mobile devices using media queries.&lt;/p&gt; &lt;h3&gt;More Authoring Options&lt;/h3&gt; &lt;p&gt;I've always been a fan of Live Writer, and that's still supported. And there's HTML support, which is good. But Orchard also introduces Markdown editing support, which I'm told will cause my pants to shrink and my beard to grow out. So that's something.&lt;/p&gt; &lt;h3&gt;Widgets!&lt;/h3&gt; &lt;p style="float: right; padding-bottom: 10px; padding-top: 10px; padding-left: 10px; padding-right: 10px"&gt;&lt;a title="Orchard Widget Zones" href="//www.flickr.com/photos/36836555@N00/14371595856/"&gt;&lt;img border="0" alt="Orchard Widget Zones" src="//farm4.static.flickr.com/3856/14371595856_2f32e0f822.jpg"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I'd been sneakily creating widgets for years by injecting HTML and JavaScript, but now there's real support. Orchard has some nice widgets, and you can drop them into 19 different zones, as shown on the right.&lt;/p&gt; &lt;p&gt;As I was beta testing, I asked Sebastien if we could move the comments from the content to an after content module so I could insert custom HTML widgets above the comments, and he set that up.&amp;nbsp; So far, the widgets have been incredibly flexible. No complaints at all there.&lt;/p&gt; &lt;h3&gt;Spam Control&lt;/h3&gt; &lt;p&gt;As I mentioned earlier, the spam was a bit out of hand before. Orchard adds &lt;a href="//en.wikipedia.org/wiki/ReCAPTCHA"&gt;ReCAPTCHA&lt;/a&gt; support. No messing around now, I can barely pass it.&lt;/p&gt; &lt;h3&gt;Social Media Tag support&lt;/h3&gt; &lt;p&gt;Orchard automatically includes support for all the fancy og:tags that are so hot these days. &lt;a href="//www.sebastienros.com/adding-social-meta-tags-in-orchard"&gt;Sebastien wrote a post with more information&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Custom Script Support&lt;/h3&gt; &lt;p&gt;I have already admitted to jamming script tags in HTML areas on the previous site. The new site includes the ability to add custom scripts for analytics, syntax highlighting, etc. It's supported, and I can include them in the header or footer as appropriate.&lt;/p&gt; &lt;p&gt;Site Nav Integration&lt;/p&gt; &lt;p&gt;Now new pages can be integrated into the site navigation. Cool.&lt;/p&gt; &lt;h2&gt;More Goodness!&lt;/h2&gt; &lt;p&gt;There's a lot more! If you're running a blog that's hosted on weblogs.asp.net, see the updated support &lt;a href="//www.asp.net/community/support/weblogs"&gt;here&lt;/a&gt;. If you'd like to learn more about Orchard - or contribute, as it's an open source project - check out the &lt;a href="//orchardproject.net/"&gt;Orchard Project&lt;/a&gt;. I'll be posting more about some things I've learned in customizing my blog a bit, including the code formatting. &lt;/p&gt;</description><pubDate>Wed, 11 Jun 2014 01:21:58 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/weblogs-asp-net-now-running-on-orchard-and-azure-web-sites</guid></item><item><title>A 30 Minute Look At ASP.NET vNext</title><link>https://weblogs.asp.net:443/jongalloway/a-30-minute-look-at-asp-net-vnext</link><description>&lt;p&gt;This week at TechEd, the ASP.NET team announced some pretty exciting updates on the way for ASP.NET.&lt;/p&gt;  &lt;h2&gt;Top Links&lt;/h2&gt;  &lt;h3&gt;Blog Posts&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/webdev/archive/2014/05/13/asp-net-vnext-the-future-of-net-on-the-server.aspx"&gt;ASP.NET vNext: the future of .NET on the Server&lt;/a&gt; (.NET Web Development and Tools Blog) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx"&gt;Introducing ASP.NET vNext&lt;/a&gt; (Scott Hanselman) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://davidfowl.com/asp-net-vnext/"&gt;ASP.NET vNext&lt;/a&gt; (David Fowler) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/dotnet/archive/2014/05/12/the-next-generation-of-net-asp-net-vnext.aspx"&gt;The Next Generation of .NET – ASP.NET vNext&lt;/a&gt; (.NET Team Blog) &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014?t=microsoft-asp.net#fbid="&gt;ASP.NET team session videos from TechEd&lt;/a&gt;&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B385#fbid="&gt;INTRODUCING: The Future of .NET on the Server&lt;/a&gt; (Scott Hunter and Scott Hanselman) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/C9-09"&gt;Channel 9 Live: ASP.NET Developer Q&amp;amp;A&lt;/a&gt;&amp;#160; (Scott Hunter and Scott Hanselman) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B411#fbid="&gt;DEEP DIVE: The Future of .NET on the Server&lt;/a&gt; (David Fowler and Scott Hanselman) &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;a href="http://www.asp.net/vnext"&gt;ASP.NET site content&lt;/a&gt;&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.asp.net/vnext/overview/aspnet-vnext/overview"&gt;Getting Started with ASP.NET vNext&lt;/a&gt; (Mike Wasson) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.asp.net/vnext/overview/aspnet-vnext/walkthrough-mvc-music-store"&gt;MVC Music Store Sample Application for ASP.NET vNext&lt;/a&gt; (Cephas Lin) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.asp.net/vnext/overview/aspnet-vnext/walkthrough-bugtracker"&gt;BugTracker Sample Application for ASP.NET vNext&lt;/a&gt; (Erik Reitan) &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Getting Involved&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://forums.asp.net/1255.aspx/1?ASP+NET+vNext"&gt;ASP.NET vNext Discussion Forum&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://jabbr.net/#/rooms/AspNetvNext"&gt;ASP.NET vNext chat on JabbR&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://github.com/aspnet/Home"&gt;ASP.NET vNext Home repository on GitHub&lt;/a&gt; - The place to get started with the code &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;What Is It?&lt;/h2&gt;  &lt;p&gt;In case you haven't read up on it, I'll just quote from the ASP.NET site:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The next version of ASP.NET (“ASP.NET vNext”) has been re-designed from the ground up. The goal is to create a lean and composable .NET stack for building modern cloud-based apps.&lt;/p&gt;    &lt;p&gt;Here are some of the features of ASP.NET vNext:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;vNext includes new cloud-optimized versions of MVC, Web API, Web Pages, SignalR, and Entity Framework. &lt;/li&gt;      &lt;li&gt;MVC, Web API, and Web Pages will be merged into one framework, called MVC 6. The new framework removes a lot of overlap between the existing MVC and Web API frameworks. It uses a common set of abstractions for routing, action selection, filters, model binding, and so on. You can use the framework to create both UI (HTML) and web APIs. &lt;/li&gt;      &lt;li&gt;ASP.NET vNext apps can use a cloud-optimized subset of .NET vNext. This subset is factored for server and web workloads, has a smaller footprint than the full .NET vNext, and supports side-by-side deployment. &lt;/li&gt;      &lt;li&gt;MVC 6 has no dependency on System.Web. The result is a leaner framework, with faster startup time and lower memory consumption. &lt;/li&gt;      &lt;li&gt;vNext will support true side-by-side deployment. If your app uses the cloud-optimized subset of .NET vNext, you can bin deploy all of your dependencies, including the .NET vNext (cloud optimized) packages. That means you can update your app without affecting other applications on the same server. &lt;/li&gt;      &lt;li&gt;vNext is host agnostic. You can host your app in IIS, or self-host in a custom process. (Web API 2 and SignalR 2 already support self-hosting; ASP.NET vNext brings this same capability to MVC.) &lt;/li&gt;      &lt;li&gt;Dependency injection is built into the framework. Use your preferred IoC container to register dependencies. &lt;/li&gt;      &lt;li&gt;vNext uses the Rosyln compiler to compile code dynamically. You will be able to edit a code file, refresh the browser, and see the changes without rebuilding the project. &lt;/li&gt;      &lt;li&gt;vNext is open source and cross platform. &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;To me as a web developer, this means I get:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All the advantages of the .NET platform (performance, stability, security, comprehensive API), and &lt;/li&gt;    &lt;li&gt;The development experience of C# and Visual Studio... with &lt;/li&gt;    &lt;li&gt;The simplicity, portability, quick dev refresh cycle and flexibility of an interpreted web framework. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And I like the sound of that.&lt;/p&gt;  &lt;h2&gt;Source Code&lt;/h2&gt;  &lt;p&gt;All the source code and samples are published under a new &lt;a href="https://github.com/aspnet"&gt;ASP.NET organization on GitHub&lt;/a&gt;. There are lots of interesting repos to look at; here are some top ones to get started with:&lt;/p&gt;  &lt;h3&gt;&lt;a href="https://github.com/aspnet/Home"&gt;Home repository&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is the place to get started. The readme for this repo explains how to install and run the Hello World samples.&lt;/p&gt;  &lt;h3&gt;&lt;a title="https://github.com/aspnet/MusicStore" href="https://github.com/aspnet/MusicStore"&gt;Music Store sample&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Ah, the Music Store. The team wanted some samples to validate and test vNext as they developed it, and this was one of them. I updated the source code to ASP.NET MVC 5 and threw it over the wall to them, and it seems to have held up. Cephas Lin has a &lt;a href="http://www.asp.net/vnext/overview/aspnet-vnext/walkthrough-mvc-music-store"&gt;Music Store walkthrough posted in the vNext content on the ASP.NET site&lt;/a&gt;, and it's pretty easy to follow along.&lt;/p&gt;  &lt;h3&gt;&lt;a href="https://github.com/aspnet/BugTracker"&gt;BugTracker sample&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The BugTracker is a single page application using SignalR,&amp;#160; Knockout.js and Web API. I'm pretty happy that they had a single page application as one of their validation cases from the beginning.&lt;/p&gt;  &lt;h3&gt;&lt;a title="https://github.com/aspnet/KRuntime" href="https://github.com/aspnet/KRuntime"&gt;KRuntime&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you're feeling adventurous, this it the actual runtime. It includes things like the compilation system, SDK tools, and the native CLR hosts. (parental warning advisory if stumbling across some C++ gives you nightmares)&lt;/p&gt;  &lt;ul&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt;  &lt;p&gt;&lt;font size="5"&gt;Quick Walkthrough&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I promised I'd skip the detailed walkthrough, because you really should be looking at the &amp;quot;official&amp;quot; ones I've linked to above. &lt;strong&gt;My point here is not really guide you through them, but to give you a look at what the experience is like if you're not feeling up to doing it yourself. So let's see what I can get running in 30 minutes or so (until my next meeting). If you want to follow along, read the walkthroughs.&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;Important Notes Before We Get Started&lt;/h3&gt;  &lt;p&gt;I'm doing this on my dev machine. It runs side by side with my existing .NET and Visual Studio 2013 installs.&lt;/p&gt;  &lt;p&gt;This looks a bit fiddly because we're doing this all from the commandline. Don't worry if that's not your bag - this will all be supported via Visual Studio. This is an early preview. But, it's good that this level of control is available. Note that I'm doing all of this without firing up Visual Studio or installing any other software.&lt;/p&gt;  &lt;p&gt;You'll see the letter K pops up from time to time. This was internally called Project K before it was released. I have no idea if the k will go away now, but I kind of like it. So we've got kvm (k version manager), kre (k runtime engine), kpm (k package manager), and k (the actual bootstrapper to run our app).&lt;/p&gt;  &lt;h3&gt;The Home Repo samples&lt;/h3&gt;  &lt;p&gt;First, let's try out the &lt;a href="https://github.com/aspnet/home"&gt;ASP.NET vNext Home repo&lt;/a&gt;. I've already got this locally, but for the purposes of science I'll pretend that I don't. Since I'm just kicking the tires here, instead of cloning the repo I'll just download the zip to my desktop, unblock if necessary, and unzip it.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-05-13_14h27_33" href="http://www.flickr.com/photos/36836555@N00/14200631213/"&gt;&lt;img border="0" alt="2014-05-13_14h27_33" src="http://farm3.static.flickr.com/2919/14200631213_8cc6c267cf_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's what that gets me:&lt;/p&gt;  &lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master&amp;gt;dir
 Volume in drive C has no label.
 Volume Serial Number is 5E2E-AE5E

 Directory of C:\Users\Jon\Desktop\Home-master\Home-master

05/13/2014  02:29 PM    &amp;lt;DIR&amp;gt;          .
05/13/2014  02:29 PM    &amp;lt;DIR&amp;gt;          ..
05/13/2014  01:51 PM               851 .gitattributes
05/13/2014  01:51 PM               245 .gitignore
05/13/2014  01:51 PM             1,513 CONTRIBUTING.md
05/13/2014  01:51 PM               356 kvm.cmd
05/13/2014  01:51 PM            17,278 kvm.ps1
05/13/2014  01:51 PM                28 kvmsetup.cmd
05/13/2014  01:51 PM               592 LICENSE.txt
05/13/2014  01:51 PM               481 NuGet.Config
05/13/2014  01:51 PM             6,390 README.md
05/13/2014  02:29 PM    &amp;lt;DIR&amp;gt;          samples
               9 File(s)         27,734 bytes
               3 Dir(s)  11,363,086,336 bytes free&lt;/pre&gt;

&lt;p&gt;The next step in the readme tells me to execute kvmsetup.cmd, which tells me this:&lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;Copying file C:\Users\Jon\.kre\bin\kvm.ps1
Copying file C:\Users\Jon\.kre\bin\kvm.cmd
Adding C:\Users\Jon\.kre\bin to process PATH
Adding C:\Users\Jon\.kre\bin to user PATH
Adding C:\Program Files\KRE;%USERPROFILE%\.kre to process KRE_HOME
Adding C:\Program Files\KRE;%USERPROFILE%\.kre to machine KRE_HOME
Press any key to continue ...&lt;/pre&gt;

&lt;p&gt;And with that, we've got the version manager installed. Important: this is the version manager, not the runtime. We can install multiple versions of the runtime engine, and use kvm to select the active one for a project.&lt;/p&gt;

&lt;p&gt;Next, the readme tells me to install a named version of the K Runtime Engine: &lt;code&gt;kvm install 0.1-alpha-build-0421&lt;/code&gt;&lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master&amp;gt;kvm install 0.1-alpha-build-0421
Downloading KRE-svr50-x86.0.1-alpha-build-0421 from https://www.myget.org/F/aspnetvnext/api/v2/
Installing to C:\Users\Jon\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0421
Adding C:\Users\Jon\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0421\bin to process PATH&lt;/pre&gt;

&lt;p&gt;Now we've got a runtime installed, so we can run some samples. The readme recommends running the console sample first, and I think that makes sense since it's an incredibly simple app that verifies things are installed. So I cd to samples\ConsoleApp and run kpm restore. This looks scary, but it's really fast, and it's a good thing. The idea is that instead of running on big, monolithic framework assemblies, ASP.NET vNext is grabbing a bunch of small, focused NuGet packages. &lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master&amp;gt;cd samples\ConsoleApp

C:\Users\Jon\Desktop\Home-master\Home-master\samples\ConsoleApp&amp;gt;kpm restore

C:\Users\Jon\Desktop\Home-master\Home-master\samples\ConsoleApp&amp;gt;CALL &amp;quot;C:\Users\Jon\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0421\bin\KLR.cmd&amp;quot; --lib &amp;quot;C:\Users\Jon\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0421\bin\;C:\Users\Jon\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0421\bin\lib\Microsoft.Framework.PackageManager&amp;quot; &amp;quot;Microsoft.Framework.PackageManager&amp;quot; restore
Restoring packages for C:\Users\Jon\Desktop\Home-master\Home-master\samples\ConsoleApp\project.json
Attempting to resolve dependency ConsoleApp &amp;gt;= 1.0.0
Attempting to resolve dependency System.Console &amp;gt;= 4.0.0.0
  GET https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Console'
  GET https://nuget.org/api/v2/FindPackagesById()?Id='System.Console'
Attempting to resolve dependency mscorlib &amp;gt;=
Attempting to resolve dependency System &amp;gt;=
Attempting to resolve dependency System.Core &amp;gt;=
Attempting to resolve dependency Microsoft.CSharp &amp;gt;=
Attempting to resolve dependency ConsoleApp &amp;gt;= 1.0.0
Attempting to resolve dependency System.Console &amp;gt;= 4.0.0.0
  OK https://nuget.org/api/v2/FindPackagesById()?Id='System.Console' 931ms
  OK https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Console' 972ms
  GET https://www.myget.org/F/aspnetvnext/api/v2/package/System.Console/4.0.0.0
  OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.Console/4.0.0.0 1696ms
Attempting to resolve dependency System.IO &amp;gt;= 4.0.0.0
  GET https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.IO'
  GET https://nuget.org/api/v2/FindPackagesById()?Id='System.IO'
Attempting to resolve dependency System.Runtime &amp;gt;= 4.0.0.0
  GET https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Runtime'
  GET https://nuget.org/api/v2/FindPackagesById()?Id='System.Runtime'
  OK https://nuget.org/api/v2/FindPackagesById()?Id='System.Runtime' 659ms
  OK https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.IO' 838ms
  OK https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Runtime' 841ms
  GET https://www.myget.org/F/aspnetvnext/api/v2/package/System.Runtime/4.0.20.0
  OK https://nuget.org/api/v2/FindPackagesById()?Id='System.IO' 954ms
  GET https://www.myget.org/F/aspnetvnext/api/v2/package/System.IO/4.0.0.0
  OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.IO/4.0.0.0 1779ms
Attempting to resolve dependency System.Text.Encoding &amp;gt;= 4.0.0.0
  GET https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Text.Encoding'
  GET https://nuget.org/api/v2/FindPackagesById()?Id='System.Text.Encoding'
Attempting to resolve dependency System.Threading.Tasks &amp;gt;= 4.0.0.0
  GET https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Threading.Tasks'
  GET https://nuget.org/api/v2/FindPackagesById()?Id='System.Threading.Tasks'
  OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.Runtime/4.0.20.0 1919ms
  OK https://nuget.org/api/v2/FindPackagesById()?Id='System.Text.Encoding' 746ms
  OK https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Text.Encoding' 837ms
  GET https://www.myget.org/F/aspnetvnext/api/v2/package/System.Text.Encoding/4.0.10.0
  OK https://www.myget.org/F/aspnetvnext/FindPackagesById()?Id='System.Threading.Tasks' 843ms
  OK https://nuget.org/api/v2/FindPackagesById()?Id='System.Threading.Tasks' 1051ms
  GET https://www.myget.org/F/aspnetvnext/api/v2/package/System.Threading.Tasks/4.0.0.0
  OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.Text.Encoding/4.0.10.0 1356ms
  OK https://www.myget.org/F/aspnetvnext/api/v2/package/System.Threading.Tasks/4.0.0.0 1721ms
Resolving complete, 8357ms elapsed
Installing System.Console 4.0.0.0
Installing System.Runtime 4.0.20.0
Installing System.IO 4.0.0.0
Installing System.Text.Encoding 4.0.10.0
Installing System.Threading.Tasks 4.0.0.0
Restore complete, 8495ms elapsed&lt;/pre&gt;

&lt;p&gt;Now I run it with k run:&lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master\samples\ConsoleApp&amp;gt;k run
Hello World

C:\Users\Jon\Desktop\Home-master\Home-master\samples\ConsoleApp&amp;gt;&lt;/pre&gt;

&lt;p&gt;Like I said, not all that exciting. Just a quick verification check. Now that I know that's working, I'll quickly pop into one of the other sandbox samples, the HelloWeb one. Notice how simple the startup.cs file is (&lt;a href="http://www.asp.net/vnext/overview/aspnet-vnext/overview"&gt;the official walkthrough explains it in detail&lt;/a&gt;). &lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master\samples\HelloWeb&amp;gt;dir
 Volume in drive C has no label.
 Volume Serial Number is 5E2E-AE5E

 Directory of C:\Users\Jon\Desktop\Home-master\Home-master\samples\HelloWeb

05/13/2014  02:29 PM    &amp;lt;DIR&amp;gt;          .
05/13/2014  02:29 PM    &amp;lt;DIR&amp;gt;          ..
05/13/2014  01:51 PM           310,647 image.jpg
05/13/2014  01:51 PM               506 project.json
05/13/2014  01:51 PM               227 Startup.cs
               3 File(s)        311,380 bytes
               2 Dir(s)  11,368,951,808 bytes free

C:\Users\Jon\Desktop\Home-master\Home-master\samples\HelloWeb&amp;gt;copy startup.cs con
using Microsoft.AspNet.Builder;

namespace KWebStartup
{
    public class Startup
    {
        public void Configure(IBuilder app)
        {
            app.UseStaticFiles();
            app.UseWelcomePage();
        }
    }
}        1 file(s) copied.

C:\Users\Jon\Desktop\Home-master\Home-master\samples\HelloWeb&amp;gt;&lt;/pre&gt;

&lt;p&gt;Now I'll call kpm restore , just like before. This time kpm restore takes a bit longer, because there are more included packages (listed in &lt;a href="https://github.com/aspnet/Home/blob/master/samples/HelloWeb/project.json"&gt;project.json&lt;/a&gt;) and their dependencies.&lt;/p&gt;

&lt;p&gt;And I'm ready to run it. This time, instead of k run, I'll call k web since it's a web app. If I forget and call k run, it reminds what's what:&lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;C:\Users\Jon\Desktop\Home-master\Home-master\samples\HelloWeb&amp;gt;k run
'HelloWeb' does not contain a static 'Main' method suitable for an entry point&lt;/pre&gt;

&lt;p&gt;Fine, k web it is. It tells me the server's started, but how do I view it? Well, the readme tells me it's at &lt;a href="http://localhost:5001"&gt;http://localhost:5001&lt;/a&gt;, but if I didn't know I could consult the commands section of project.json:&lt;/p&gt;

&lt;pre class="brush: plain; auto-links: false;"&gt;&amp;quot;commands&amp;quot;: {
    &amp;quot;web&amp;quot;: &amp;quot;Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001&amp;quot;
  }&lt;/pre&gt;

&lt;p&gt;Simple enough. And browsing to that gives me a cool hello world page:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-05-13_15h01_50" href="http://www.flickr.com/photos/36836555@N00/13993838169/"&gt;&lt;img border="0" alt="2014-05-13_15h01_50" src="http://farm6.static.flickr.com/5566/13993838169_53a2e6619f_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nerd note: That page is shown because we've got app.UseWelcomePage() in startup.cs. There are no images or css in the project because everything's contained in the emitted HTML. It's actually really impressive - it's got embedded fonts, images as data:urls, CSS, and a minimized version of jQuery (for some nice animations), so it's a 287KB HTML payload... but since it's being served locally and you're not going to run this in production, not a problem.&lt;/p&gt;

&lt;p&gt;Nerd smackdown: David Fowler reminded me that this welcome page has been in Katana for a while.&lt;/p&gt;

&lt;h3&gt;Music Store&lt;/h3&gt;

&lt;p&gt;Okay, now that I've got this stuff installed, let's see how fast I can get the Music Store sample running.&lt;/p&gt;

&lt;p&gt;Step 1: Grab the zip from &lt;a title="https://github.com/aspnet/MusicStore" href="https://github.com/aspnet/MusicStore"&gt;https://github.com/aspnet/MusicStore&lt;/a&gt;, verify it's not blocked, and unzip on desktop.&lt;/p&gt;

&lt;p&gt;Step 2: Run kpm restore.&lt;/p&gt;

&lt;p&gt;Step 3: Select the hosting opeion (Helios, SelfHost, CustomHost - explained &lt;a href="https://github.com/aspnet/MusicStore"&gt;here&lt;/a&gt;). In this case I'll stick with selfhost, so I run k web and browse to localhost:5002:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-05-13_15h15_46" href="http://www.flickr.com/photos/36836555@N00/13993925660/"&gt;&lt;img border="0" alt="2014-05-13_15h15_46" src="http://farm3.static.flickr.com/2897/13993925660_5110a4b5e3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yippee!&lt;/p&gt;

&lt;p&gt;Again, the point is that it's pretty quick and painless to get started and play with the samples; just follow the walkthroughs. If you're used to Node or Rails a lot of these steps should seem pretty familiar. If you're not and this freaks you out, don't be freaked out... this will all work smoothly from within Visual Studio in the release version. This is a preview. Take a look! Have Fun! Let us know what you think!&lt;/p&gt;

&lt;h2&gt;Videos&lt;/h2&gt;

&lt;p&gt;The best way to get up to speed is by watching the videos I mentioned earlier.&lt;/p&gt;

&lt;p&gt;&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B385/player?h=540&amp;amp;w=960" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B411/player?h=540&amp;amp;w=960" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 23:05:50 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/a-30-minute-look-at-asp-net-vnext</guid></item><item><title>Upcoming Web Camps - Summer 2014</title><link>https://weblogs.asp.net:443/jongalloway/upcoming-web-camps-summer-2014</link><description>&lt;p&gt;Web Camps are free, no fluff, lots of code events where you can get learn what's new in the Microsoft web platform and how you can put it to use right away. They're by developers for developers - no marketing, just building web apps.&lt;/p&gt;
&lt;p&gt;&lt;a title="DevCamps-Summer-2014" href="http://www.flickr.com/photos/36836555@N00/14149839646/"&gt;&lt;img alt="DevCamps-Summer-2014" src="http://farm6.static.flickr.com/5588/14149839646_3ffc4b0443.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Upcoming events&lt;/h4&gt;
&lt;p&gt;Here's the list, with speakers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;May 20 - &lt;strong&gt;Lisbon&lt;/strong&gt;, Portugal - Jon Galloway and &lt;a href="http://www.matvelloso.com/"&gt;Mat Velloso&lt;/a&gt; [&lt;a href="http://aka.ms/mswebcamp"&gt;register&lt;/a&gt; (nearly full, hurry!)]&lt;/li&gt;
&lt;li&gt;May 22 - &lt;strong&gt;Milan&lt;/strong&gt;, Italy - Jon Galloway and &lt;a href="http://www.matvelloso.com/"&gt;Mat Velloso&lt;/a&gt; (additional tracks as part of Cloud e ASP.NET Developer Day) [&lt;a href="https://msevents.microsoft.com/cui/EventDetail.aspx?EventID=1032587661"&gt;register&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;May 26 - &lt;strong&gt;Helsinki&lt;/strong&gt;, Finland - Jon Galloway and &lt;a href="http://www.matvelloso.com/"&gt;Mat Velloso&lt;/a&gt; [&lt;a href="https://msevents.microsoft.com/cui/EventDetail.aspx?EventID=1032582777"&gt;register&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;May 28 - &lt;strong&gt;Brussels&lt;/strong&gt; (Mechelen), Belgium - Jon Galloway (part of &lt;a href="http://www.techorama.be/"&gt;Techorama&lt;/a&gt;) [sold out]&lt;/li&gt;
&lt;li&gt;June 23 - &lt;strong&gt;New York City&lt;/strong&gt;, NY, USA - &lt;a href="http://www.bradygaster.com/"&gt;Brady Gaster&lt;/a&gt;, &lt;a href="http://nikcodes.com/"&gt;Nik Molnar&lt;/a&gt;, &lt;a href="http://blog.anthonyvanderhoorn.com/"&gt;Anthony van der Hoorn&lt;/a&gt; [&lt;a href="https://msevents.microsoft.com/cui/EventDetail.aspx?EventID=1032587864"&gt;register&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;July 9&amp;nbsp;- &lt;strong&gt;Los Angeles&lt;/strong&gt;, CA, USA - &lt;a href="https://twitter.com/coolcsh"&gt;Scott Hunter&lt;/a&gt;, Jon Galloway, Daniel Egan, Adam Tuliper&amp;nbsp;[&lt;a href="https://msevents.microsoft.com/cui/EventDetail.aspx?EventID=1032587863"&gt;register&lt;/a&gt;] (rescheduled)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Fresh ASP.NET and Visual Studio 2013.2 Content&lt;/h4&gt;
&lt;p&gt;We'll be covering all kinds of great new stuff in ASP.NET, Visual Studio 2013.2 and Azure for web developers. We organized the content so we start with tools and frameworks (e.g. ASP.NET MVC, ASP.NET Web API, Visual Studio 2013.2, Azure Web Sites), then dig into some specific scenarios for modern web application development. Here's the general agenda (varies by location, but should give you the general idea):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keynote&lt;/li&gt;
&lt;li&gt;Introduction to ASP.NET and Visual Studio 2013 Web Tools&lt;/li&gt;
&lt;li&gt;Building Web Applications using the latest ASP.NET technologies&lt;/li&gt;
&lt;li&gt;Building web front ends for both desktop and mobile using the latest web standards&lt;/li&gt;
&lt;li&gt;API Services for both web and devices&lt;/li&gt;
&lt;li&gt;Running, improving and maintaining a site in the real world&lt;/li&gt;
&lt;li&gt;Real-time Communications with SignalR&lt;/li&gt;
&lt;li&gt;Wrap Up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go on, register (links are up above)! And let your web dev friends and co-workers who don't read blogs know, too, because this is a great way for them to get a recap on what's going on with ASP.NET, Visual Studio 2012, HTML5, JavaScript, and more.&lt;/p&gt;
&lt;p&gt;And... if we're not coming to a city near you (this time), you can play along from home. There's a complete video recording of our &lt;a href="http://channel9.msdn.com/Events/Windows-Azure-DevCamps/WebCamp"&gt;Web Camp from Vancouver posted on Channel 9&lt;/a&gt;, and the &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36393"&gt;Web Camps Training Kit&lt;/a&gt; includes all the decks and demos, plus 5 in-depth hands on labs.&lt;/p&gt;</description><pubDate>Mon, 12 May 2014 23:21:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/upcoming-web-camps-summer-2014</guid></item><item><title>Lessons Learned Preparing and Presenting Tech Training Events</title><link>https://weblogs.asp.net:443/jongalloway/lessons-learned-preparing-and-presenting-tech-training-events</link><description>&lt;p&gt;You've agreed to present a full day training event, and the day's approaching. What do you do?&lt;/p&gt;  &lt;p&gt;I'm not a training expert, but I've learned a few lessons on the job over the past few years that I think will help. I'd done some technical presentations over the years, but in the 4+ years I've been at Microsoft I've been doing quite a bit more. I've presented at dozens of Web Camp events (both one and two day) all over the world, been in charge of the Web Camps Training Kit for the past few years, helped plan and present two &lt;a href="http://www.microsoftvirtualacademy.com/training-courses/developing-asp-net-mvc-4-web-applications-jump-start"&gt;Microsoft Virtual Academy events&lt;/a&gt; (both full day, &lt;a href="http://channel9.msdn.com/Series/Building-Web-Apps-with-ASP-NET-Jump-Start"&gt;almost 400k online views for some of the sessions&lt;/a&gt;). I've also presented some smaller training workshops to some development teams at some large companies as they were looking at making some technology transitions.&lt;/p&gt;  &lt;p&gt;Most of these events went pretty well. Some of them, towards the beginning and despite my best efforts, did not go well. Here's what I've learned so far.&lt;/p&gt;  &lt;h2&gt;Different From One Hour Tech Presentation&lt;/h2&gt;  &lt;p&gt;I'm going to start with the planning stages in a second, but we need to get one thing out of the way first. A training event is significantly different from a one hour technical presentation. Many of the things are similar - you can start to get a handle on it by breaking an eight hour day into a series of eight one hour talks - but it's different enough that some things you can get away with for an hour won't work for eight, and vice versa.&lt;/p&gt;  &lt;p&gt;Just a few of the important differences:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Expectations for the balance training vs. entertaining are different. When people invest a day attending training, they have higher expectations of learning something, whereas some attendees of a one hour session - especially at a conference or code camp - are just &amp;quot;channel surfing&amp;quot; and have greater expectations for entertainment. On the other hand, it's perhaps more important to strategically entertain / engage during a full day of training to break it up. &lt;/li&gt;    &lt;li&gt;A full day of training is exhausting. I know an hour presentation seems tiring, but wait until you've done a full day. It's a marathon, not a sprint. &lt;/li&gt;    &lt;li&gt;Organization and timing are more important. You might be able to get away with rambling and poor time management for an hour, but it won't fly when you're doing multiple sessions. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Note: Keep in mind that this post is focused on presenting several consecutive hours of technical training. Many of the recommendations I'll give will also apply to your standard one hour technical presentation, but keep in mind that I'm not writing about How To Give A Technical Presentation. &lt;/p&gt;  &lt;h2&gt;Planning&lt;/h2&gt;  &lt;h3&gt;Ask Questions Early&lt;/h3&gt;  &lt;p&gt;If at possible, do a short pre-meeting before you get too much into planning. I generally hate meetings and avoid them when possible. This is a meeting you want to have. I get different answers in a meeting than I do in an e-mail thread. &lt;/p&gt;  &lt;p&gt;Find out the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Who will you be speaking to (numbers, skill level, etc.)? &lt;/li&gt;    &lt;li&gt;What do they want to get out of the day? &lt;/li&gt;    &lt;li&gt;Get a list of specific questions and topics that they want to learn about. &lt;/li&gt;    &lt;li&gt;What is the expected format? Is this presentation style (attendees passively watching speaker), workshop (attendees following along on laptops), a mix, or something else? &lt;/li&gt;    &lt;li&gt;Will the presentation be filmed? It usually can be if you ask early enough. &lt;/li&gt;    &lt;li&gt;What's the tech setup? What resolution will you be projecting at? What video connector? &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Some Anecdotes on Planning&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Planning win:&lt;/strong&gt; A few years back I got a request for a day of advanced MVC training, but during a pre-meeting it came out that the team had no MVC experience and while they were experienced developers, what they needed was an introduction to MVC with a few additional, specific questions addressed at the end of the day after they were up to speed. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Lesson: Ask questions before (or at the very least at the beginning of) the event to determine skill and experience level, don't assume.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Planning fail:&lt;/strong&gt; Probably my worst presentation ever was an ASP.NET MVC bootcamp I presented at a conference. Having spent a portion of my youth in the military, I'd assumed that the participants at a bootcamp would show up expecting to do some work. In what kind of bizarro world do bootcamp attendees just kick back and watch a presentation? None, right? Right. &lt;/p&gt;  &lt;p&gt;So I prepared a long workshop style tutorial wherein I would guide attendees through building an application, completely revolving around them typing things into their laptops. I had a bunch of downloads prepared for them including checkpoints at the end of each section, etc. When I began the presentation, it quickly became apparent that none of my assumptions were correct. Many of the attendees didn't have laptops, many that did have laptops didn't have the development prerequisites, and everyone was expecting to watch me talk to them for half a day. It was horrible. Eventually I just had to give up on my plans, throw out my slides, and come up with something new on the fly. It wasn't good, but it was better than the train wreck my original lesson plan had become. Some left, some stuck around and I did my best to adapt, get those who wanted to follow along set up and speak to the rest of them. Years later, this still haunts me. I'm really sorry. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Lesson: Ask an organizer to make sure you're clear on the format. If you expect people to participate, make sure that's clearly communicated to them before the event. Assume people will be participating as little as they can get away with unless.&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;Get Another Presenter&lt;/h2&gt;  &lt;p&gt;Training is SO much easier if you have another presenter who can cover a few of your talks. You'll need breathers, and you'll appreciate time to review notes and set up your demos. Attendees will appreciate the break from watching one person all day, too.&lt;/p&gt;  &lt;p&gt;This goes double if you're travelling to another time zone. It's really hard to keep focused and energetic when you're jetlagged. Breaks are important, and you'll be kept busy during scheduled breaks.&lt;/p&gt;  &lt;h2&gt;Preparing The Lesson Plan&lt;/h2&gt;  &lt;h3&gt;What Matters: The End Result&lt;/h3&gt;  &lt;p&gt;Decide what you want them to get out of the day and let that drive your outline – not the feature list or demos you want to show off, etc. What will they remember a day after your talk? Focus on that.&lt;/p&gt;  &lt;p&gt;Expectations for the balance of training vs. entertaining are different compared to a one hour presentation. When people invest a day attending training, they have higher expectations of learning something, whereas some attendees of a one hour session - especially at a conference or code camp - are just &amp;quot;channel surfing&amp;quot; and have greater expectations for entertainment. On the other hand, it's perhaps more important to strategically entertain / engage during a full day of training to break it up.&lt;/p&gt;  &lt;p&gt;A lot of the value you're providing in a full day of training is in the higher level conceptual models and organization. You're not just working through the feature list, you're explaining why the features exist and how they work together.&lt;/p&gt;  &lt;h3&gt;Work From An Outline&lt;/h3&gt;  &lt;p&gt;As I mentioned earlier, an eight hour training course is just eight one hour presentations. It takes time an preparation, but you can do this. Let's look at an example breakdown an eight hour course on anything - could be on How To Make Ramen Burgers:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Keynote&lt;/strong&gt;. You always need an introduction. Explain what you'll cover, set expectations, explain the high level roadmap for the day, cover prerequisites. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The Tools&lt;/strong&gt; - Explain what you'll use, how it works, where you can learn more. (note: If you're thinking this doesn't apply, remember to adapt tools to the concept. e.g. for Node, this is stuff like NPM.) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The Concepts&lt;/strong&gt; - Now that we're familiar with the tools, let's build something simple and explain every concept, ever step of the way. Remind advanced folks that we're going to speed up in a bit. Let them feel superior for being so experienced (and stay awake) by asking questions. Key point: the experienced people are not your adversaries! They are your allies, and a huge asset in teaching the class. Include them, don't battle them. &lt;/li&gt;    &lt;li&gt;Deep Dive 1 &lt;/li&gt;    &lt;li&gt;Deep Dive 2 &lt;/li&gt;    &lt;li&gt;Deep Dive 3 &lt;/li&gt;    &lt;li&gt;Deep Dive 4 &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Wrap Up.&lt;/strong&gt; Summarize what was covered, encourage everyone with what they've learned, give resources for going further. This is important for two reasons. First, you want to tie things up conceptually so they don't just leave with &amp;quot;Whoa, that was a lot of stuff. What was the middle thing?&amp;quot; feeling. Second, you want to make sure they can take advantage of what you just taught them, and learn more or get help. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Yes, steps 4 - 7 are not filled in. &lt;/p&gt;  &lt;p&gt;&lt;a title="sidney-harris-cartoon-a-miracle-occurs-here[1]" href="http://www.flickr.com/photos/36836555@N00/13900085900/"&gt;&lt;img border="0" alt="sidney-harris-cartoon-a-miracle-occurs-here[1]" src="http://farm8.static.flickr.com/7061/13900085900_8cac31e8df_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;But already you're down from 8 hours to 4 hours, and that's quite something.&lt;/p&gt;  &lt;p&gt;Now, for steps 4 - 7, here's the idea. You are the expert. You've been asked to speak because you know something. You're really quite smart, and experienced. Right? If not, well... oh, dear, we should have covered that earlier. You'll really need to be somewhat experienced to do some training. If you're not, and you can't get out of this, hack like mad for a week or two to try to build some experience. Good luck!&lt;/p&gt;  &lt;p&gt;So, you're experienced. What would you tell a friend who wanted to learn about this concept? Can you break it into four big things they should know? Either four main concepts, or a four step process? Great. From there, it's just four one hour presentations.&lt;/p&gt;  &lt;p&gt;Here's what I currently cover at Web Camps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Keynote &lt;/li&gt;    &lt;li&gt;Introduction to ASP.NET and Visual Studio 2013 Web Tooling &lt;em&gt;&amp;lt;-- The tools &lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Building Web Applications using the latest ASP.NET technologies &lt;em&gt;&amp;lt;-- The concepts &lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Building web front ends using the latest web standards &lt;em&gt;&amp;lt;-- Deep dive #1&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;API Services for both web and devices &lt;em&gt;&amp;lt;-- Deep dive #2&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Running, improving and maintaining a site in the real world &lt;em&gt;&amp;lt;-- Deep dive #3&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Real-time Communications with SignalR &lt;em&gt;&amp;lt;-- Deep Dive #3 &lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Wrap Up &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Presenting several presentations works best if there's a natural flow. In the above case, it's something like &lt;em&gt;Create -&amp;gt; Build -&amp;gt; Deploy&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;But be willing to make exceptions. For this example, you'll see there's one small thing that's out of order: Sessions 6 is post-deployment, and 7 is a dev topic. That is completely intentional, based on presenting this content a few times. &lt;a href="http://asp.net/signalr"&gt;SignalR&lt;/a&gt; is cool and exciting. It's a highlight, and it's fun to end on. Scaling and maintaining a site in production is really important, but it's hard work and requires more energy than most attendees will have at the end of the day. So I break my logical flow to put the hawt guitar solo at the end. And, honestly, to keep people from leaving after session 5, or at lunch time.&lt;/p&gt;  &lt;h3&gt;A Theme&lt;/h3&gt;  &lt;p&gt;You've been to technical training, right? It gets hard to keep perspective and focus after a few hours. One really useful way to simplify that is to have a common theme. For me, that's usually a common scenario: we're building a site that does X. It doesn't really matter what X is as long as it fits all of your scenarios and you can excited about it. Really, it should be something you can get excited about. Do you like golfing? Make a golf tracker site, not a Contoso Widget Inventory System. And definitely not a Foo app that tracks Bar and Baz instances.&lt;/p&gt;  &lt;ol&gt;&lt;!--EndFragment--&gt;&lt;/ol&gt;  &lt;h2&gt;Demos&lt;/h2&gt;  &lt;p&gt;Okay, let's start with the bad news:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The only way to keep people awake and interested in a full day training course is with a lot of demos. &lt;/li&gt;    &lt;li&gt;It is exponentially harder to do a full day of demos than it is to do a single hour of demos. The hardest part is that you don't really get any set up time in between sessions, but even if you do it might get monopolized by someone with an obscure question who isn't thinking about the time it takes to set up demos for the next session. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So, just plan to give 8 presentations without any time in between them. (Note: Remember that I said it's great to have another presenter? Yeah. Any time another presenter speaks, it resets your clock. Gold.)&lt;/p&gt;  &lt;h3&gt;Begin / End States&lt;/h3&gt;  &lt;p&gt;Okay, we've built up some stress. You have to give eight presentations, you can't count on having any prep time between them, and they have to be good. What can you do?&lt;/p&gt;  &lt;p&gt;Here's where prep can really help.&amp;#160; The idea is that, for each demo, you have a begin state (where the demo starts) and an end state (the way the demo should look when your demo is done). This really helps with your peace of mind: for every demo, you've got a set place to start and - more importantly - a working demo to fall back to in case everything goes wrong. Just like washing your car ensures it won't rain, having a working (and validated) end state for each demo does wonders for both the demo and your peace of mind. Trust me. And, if you get nervous (like me) it's so great knowing there's a working example of your demo app in case things just won't cooperate.&lt;/p&gt;  &lt;p&gt;You can do this using source control labels if those come naturally to you. For the Web Camps Training Kit, we just have subfolders with begin and end stats.&lt;/p&gt;  &lt;h3&gt;Strategic Typing&lt;/h3&gt;  &lt;p&gt;Think about what you'll be live coding. Does this add value? Does it teach people? Are you 100% certain you can pull it off without dealing with a&amp;#160; minor typo here or there? Hey, if you're a ninja coder, more power to you. Run that kata.&lt;/p&gt;  &lt;p&gt;For the rest of us, think of what you'll actually show, and what your attendees will profit from seeing. Forget about impressing them, focus on the actual value of having 100 or so people watch you type. As I've done this, I've moved to showing a lot of my demos as tours rather than &amp;quot;feats of strength&amp;quot; - here's what the code looks like, let's talk about it.&lt;/p&gt;  &lt;p&gt;I realize I'm not going to impress people with this technique, or get high speaker ratings, or any of that. I'm okay with it. I have a limited amount of time, I choose to focus it on making my viewers successful rather than trying to make me successful.&lt;/p&gt;  &lt;p&gt;But, recognize that just watching someone explain code can be boring, too. So I try to pick strategic bits and pieces. An easy way to interact with the code is to intentionally break it, or change output text.&lt;/p&gt;  &lt;h3&gt;Reset Scripts&lt;/h3&gt;  &lt;p&gt;Doubling back a bit here, but if you're going to give the same training several times, what do you do? The simplest solution is to have one source&amp;#160; of truth, and you copy from that into a presentation directory each time. That totally works. The important bit is not to present from the source directory.&lt;/p&gt;  &lt;p&gt;If you want to level-up a bit, you might want to write some scripts. The idea is to have three directories for each demo: Begin, Complete, and Initial. The idea is that your script copies your initial state directories over your presentation directory.&lt;/p&gt;  &lt;h3&gt;You Don't Have To Write Then All From Scratch&lt;/h3&gt;  &lt;p&gt;You don't necessarily have to write all of your own demos. More precisely, there's no perceived value to your students / attendees in presenting novel, amazing demos that don't actually accomplish something. Your demos should be optimized for the time and opportunity. Lately I've been building some simple code by hand, then showing a completed example someone else has published. I'll dig in to the code and show them how the exact concepts and code we used in the simple Hello World example work in a completed application.&lt;/p&gt;  &lt;p&gt;Ask around - Twitter, social networks, co-workers, etc. Often someone has a great demo already written, waiting for you to show it off. That lets you focus on the presentation, not building a new demo from scratch.&lt;/p&gt;  &lt;h2&gt;Presentation&lt;/h2&gt;  &lt;h3&gt;Managing expectations&lt;/h3&gt;  &lt;p&gt;Be really clear with expectations and roadmap throughout the day.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Show the outline at the start of the day and set expectations on what you will and won’t be covering. &lt;/li&gt;    &lt;li&gt;Refer back to the outline regularly during the day – it doesn’t hurt to have a “you are here” at the start of each talk. It also cuts down on questions about things that will be covered in a later session. &lt;/li&gt;    &lt;li&gt;Wrap up at the end – helps people digest what they’ve learned (as explained earlier). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Things make a lot more sense if you're providing the conceptual framework for attendees to file the content away.&lt;/p&gt;  &lt;h3&gt;Slides&lt;/h3&gt;  &lt;p&gt;There are different philosophies on using slides in presentations. For training, my opinion is that they can really help, and it's best to keep them pretty standard.&lt;/p&gt;  &lt;p&gt;Here's what I think the slides should do:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Make it easy to follow what you're talking about by showing structure, showing frequent &amp;quot;you are here&amp;quot; signposts, and giving plenty of context. &lt;/li&gt;    &lt;li&gt;Gives something for attendees to write down (or take pictures of). &lt;/li&gt;    &lt;li&gt;Give the speaker some cues. It's hard to remember where every single demo goes in a full day of training. Some Demo slides that just show the title of the feature or concept can cue you in so you're not wondering what's next or forgetting demos. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The standard things apply - don't read slide after slide, don't make eye charts with tons of bullet points, etc. Use diagrams and pictures where possible. Use the slides to enhance the presentation, not as a crutch.&lt;/p&gt;  &lt;h2&gt;Rehearsal&lt;/h2&gt;  &lt;p&gt;It's time consuming, but it's important to take the time for a full rehearsal. If you're co-presenting, take turns presenting your sessions for the other speakers (screen sharing if you're remote). I know this is a big time investment and you won't want to do it - or you'll want to race through it - but this will really pay off.&lt;/p&gt;  &lt;p&gt;Two big things to pay attention to:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Timing&lt;/strong&gt; - You know how it's tricky to nail timing a one hour talk? Multiply that by eight. You need to know which sessions are running long, which ones can be sped up if you're running late, etc. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Demo Transitions&lt;/strong&gt; - You'll want to make sure you're able to transition smoothly between slides and demos, that the demos actually work when you do them consecutively, etc. &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Cheat Sheet&lt;/h2&gt;  &lt;p&gt;As you're rehearsing, make notes on a one-page cheat sheet. Mine usually include reminders about important bits of code or steps for the demos, anything tricky about the demo reset steps or setup, and important points I miss in practicing. I keep mine with me when I speak, and the fact that I know it's sitting next to me means I rarely really need it. When you do need it, though, it saves your audience from watching you fumble around. And it's handy to glance at during travel, as well.&lt;/p&gt;  &lt;h2&gt;Tech Check&lt;/h2&gt;  &lt;p&gt;It's a good idea to get in to the place you'll be presenting early to make sure that your laptop works and check the resolution and font size are visible in the back seats. Attendees shouldn't have to suffer through any of that. If you absolutely can't schedule it, at least find out the tech specifics and make sure you've got whatever video adapters you'll need.&lt;/p&gt;  &lt;h2&gt;It's All About Preparation&lt;/h2&gt;  &lt;p&gt;You'll notice that pretty much all of the above covers how to prepare for the event itself. There are a few other small tips for during the event (e.g. have some energy bars or Five Hour Energy handy, ask questions at the beginning to verify attendee experience level), but if you've prepared correctly then most of the actual presentation is already done. &lt;a href="http://seriouspony.com/blog/2013/10/4/presentation-skills-considered-harmful"&gt;Just be the user interface for the content you've prepared. Disappear.&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 05 May 2014 23:14:48 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/lessons-learned-preparing-and-presenting-tech-training-events</guid></item><item><title>5 Tricks for catching up on the Channel 9 event videos for Build 2014</title><link>https://weblogs.asp.net:443/jongalloway/catching-up-on-the-channel-9-event-videos-for-build-2014</link><description>&lt;p&gt;Okay, you've had a week to digest all the video content from Build 2014? Done yet? Me, neither. Well, how about some tricks to make this easier?&lt;/p&gt;  &lt;p&gt;I'd written up a few tips and tricks for catching up on Channel 9 event videos back in 2011, this is an update circa 2014.&lt;/p&gt;  &lt;h2&gt;Trick 1: Subscribe and watch at high speed in VLC&lt;/h2&gt;  &lt;p&gt;There are a lot of sessions, and watching even at 10% faster makes a difference. I think you'll be surprised at how, with a little practice, you can keep cranking the speed up and absorb the content at 2x or even faster. Note: Every time I tell people about high speed playback, people assume it's going to make the speakers sound like chipmunks. &lt;strong&gt;All of the high speed playback options I'm going to show are pitch corrected, so they don't raise the speakers' voices.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you don't have VLC installed, I highly recommend it. It's lightweight and has a minimal interface, but is packed with codecs and advanced features when you need them. You can install via &lt;a href="http://chocolatey.org/packages/vlc"&gt;Chocolatey&lt;/a&gt; (cinst vlc), directly from &lt;a href="http://www.videolan.org/"&gt;http://www.videolan.org/&lt;/a&gt;, or from &lt;a href="http://ninite.com"&gt;http://ninite.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Run VLC and pop into Playlist mode. You can do that from the View menu, hit Ctrl+L, or click on the Playlist icon at the bottom to do that.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/36836555@N00/5642027358/"&gt;&lt;img border="0" alt="2011-04-21 16h47_08" src="http://static.flickr.com/5023/5642027358_7896ef1d7d.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the Playlist interface, expand the Internet group and click on + sign to the right of Podcasts.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_14h59_04" href="http://www.flickr.com/photos/36836555@N00/13881286755/"&gt;&lt;img border="0" alt="2014-04-15_14h59_04" src="http://farm3.static.flickr.com/2850/13881286755_14fdfda85b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This brings up a prompt to enter the URL for the feed. Each Channel 9 event has a list of formats available under the &amp;quot;Subscribe to this event&amp;quot; link:&lt;/p&gt;  &lt;p&gt;&lt;a title="Channel 9 Event - RSS" href="http://www.flickr.com/photos/36836555@N00/13881210023/"&gt;&lt;img border="0" alt="Channel 9 Event - RSS" src="http://farm3.static.flickr.com/2835/13881210023_cdbd89f5f7.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You have a few options (the types are obvious from the last bit of the URL):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/Build/2014/RSS/mp4"&gt;http://channel9.msdn.com/Events/Build/2014/RSS/mp4&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/Build/2014/RSS/mp4high"&gt;http://channel9.msdn.com/Events/Build/2014/RSS/mp4high&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/Build/2014/RSS/mp3"&gt;http://channel9.msdn.com/Events/Build/2014/RSS/mp3&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can enter the format of your choice here - in my case I'm going to pick the MP4 HD feed: &lt;a href="http://channel9.msdn.com/Events/Build/2014/RSS/mp4high"&gt;http://channel9.msdn.com/Events/Build/2014/RSS/mp4high&lt;/a&gt;. However, note that the MP3 format is available. We'll get back to that later.&lt;/p&gt;  &lt;p&gt;That grabs the feed and builds a playlist for us, listing all the videos. &lt;/p&gt;  &lt;p&gt;Note: nothing's been downloaded at this point, it's just showing the list from the RSS feed.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h06_24" href="http://www.flickr.com/photos/36836555@N00/13881464363/"&gt;&lt;img border="0" alt="2014-04-15_15h06_24" src="http://farm8.static.flickr.com/7101/13881464363_47b464242b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now I'll use the search section to filter on ASP.NET because I do love it so.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h16_09" href="http://www.flickr.com/photos/36836555@N00/13881632633/"&gt;&lt;img border="0" alt="2014-04-15_15h16_09" src="http://farm8.static.flickr.com/7333/13881632633_f760420689.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's the key thing - when I double click the video to start streaming it, I'll switch to a faster speed. There are two ways to do that.&lt;/p&gt;  &lt;p&gt;The easy way is to use the Playback / Speed menu.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h19_24" href="http://www.flickr.com/photos/36836555@N00/13881625085/"&gt;&lt;img border="0" alt="2014-04-15_15h19_24" src="http://farm4.static.flickr.com/3692/13881625085_afc967b8cd.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Once you get hooked on this, though, you can use the [ and ] hotkeys (speed up and slow down respectively). Now I'm watching this demo at 2x speed. You might start with 1.5x or so and crank it up as you get more used to it.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h20_16" href="http://www.flickr.com/photos/36836555@N00/13881701123/"&gt;&lt;img border="0" alt="2014-04-15_15h20_16" src="http://farm3.static.flickr.com/2814/13881701123_731b575e74.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Trick 2: Use high speed playback in the Channel 9 player&lt;/h2&gt;  &lt;p&gt;HTML5 video players in all the new browsers support high speed playback. Here's an example showing the Day 1 Keynote on the Channel 9 site; I've right clicked the video to bring up the context menu and I'm about to kick it up to 2x.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h24_19" href="http://www.flickr.com/photos/36836555@N00/13881744765/"&gt;&lt;img border="0" alt="2014-04-15_15h24_19" src="http://farm4.static.flickr.com/3785/13881744765_0c604ba5fc_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That's it! Easy!&lt;/p&gt;  &lt;h2&gt;Trick 3: Subscribe to the MP3 feed on Windows Phone 8.1&lt;/h2&gt;  &lt;p&gt;One of my favorite sleeper features in Windows Phone 8.1 is support for high speed playback in the new Podcasts app. For this one, I wanted to add the MP3 URL for just the Build 2014 event: &lt;a href="http://channel9.msdn.com/Events/Build/2014/RSS/mp3"&gt;http://channel9.msdn.com/Events/Build/2014/RSS/mp3&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But that's a bit long to type on the phone, so I made a special short URL: &lt;a href="http://aka.ms/b14mp3"&gt;http://aka.ms/b14mp3&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then in the Podcasts app, I chose add by URL:&lt;/p&gt;  &lt;p&gt;&lt;a title="wp_ss_20140415_0002" href="http://www.flickr.com/photos/36836555@N00/13882347204/"&gt;&lt;img border="0" alt="wp_ss_20140415_0002" src="http://farm3.static.flickr.com/2856/13882347204_259d718a1b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That gave me a list of MP3's. In the podcast options, I can select to have it stream or download them. Now, once I started playing one, I clicked on the little 1.5x thing to the right of the video twice, toggling to 2x speed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a title="wp_ss_20140415_0001" href="http://www.flickr.com/photos/36836555@N00/13882347074/"&gt;&lt;img border="0" alt="wp_ss_20140415_0001" src="http://farm6.static.flickr.com/5275/13882347074_f3e87fac48.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yee haw!!!&lt;/p&gt;  &lt;p&gt;Notes: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;David Tesar reminded me that the &lt;a href="http://www.windowsphone.com/en-us/store/app/moliplayer-pro/19ea6d3e-e3d9-401d-b30a-f6471811fe08"&gt;Moliplayer video player app&lt;/a&gt; for Windows Phone has variable speed playback.&lt;/li&gt;    &lt;li&gt;There are high speed playback options for other phones, too. On Android, the &lt;a href="https://play.google.com/store/apps/details?id=com.astroplayerkey"&gt;Astro Player app&lt;/a&gt; has great support for variable speed playback.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Trick 4: Downloading videos using a script&lt;/h2&gt;  &lt;p&gt;In the past, I've published some Powershell scripts for bulk downloading Channel 9 videos. Here' s one, updated for Build 2014. But don't run it just yet, because I think I've found a better options, which I'll show you next.&lt;/p&gt; &lt;script src="https://gist.github.com/jongalloway/935780.js"&gt;&lt;/script&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Trick 5: Downloading videos using a smarter script&lt;/h2&gt;  &lt;p&gt;That's fine, but it's kind of heavy handed. Let's be honest, have you actually watched all of the videos from an event before? It's more likely that you'll want to pick some based on the topic. I found a great site that builds customized feeds based on the session tags: &lt;a title="http://dayngo.com/channel9/Events/a99db53e-aa3d-4089-9859-a2fe017ca357/Build_2014" href="http://dayngo.com/channel9/Events/a99db53e-aa3d-4089-9859-a2fe017ca357/Build_2014"&gt;http://dayngo.com/channel9/Events/a99db53e-aa3d-4089-9859-a2fe017ca357/Build_2014&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Disclaimer: This is some random site I found on the internet. Works on my machine. It does generate scripts, so you can see what it's doing.&lt;/p&gt;  &lt;p&gt;Here I've filtered to show events tagged with ASP.NET, Web API, and Node.js.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h54_54" href="http://www.flickr.com/photos/36836555@N00/13882221823/"&gt;&lt;img border="0" alt="2014-04-15_15h54_54" src="http://farm8.static.flickr.com/7413/13882221823_8165911af5_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Clicking the download button lets me select the formats I want to download.&lt;/p&gt;  &lt;p&gt;&lt;a title="2014-04-15_15h56_40" href="http://www.flickr.com/photos/36836555@N00/13882590544/"&gt;&lt;img border="0" alt="2014-04-15_15h56_40" src="http://farm3.static.flickr.com/2908/13882590544_d17f59b2ef_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That generates a custom PowerShell script (WGET is also an option) with just the content I picked:&lt;/p&gt;  &lt;pre class="brush: ps; auto-links: false;"&gt;$overwrite = $false
$webClient = New-Object System.Net.WebClient 
$feeds =  ((&amp;quot;Take_Your_Solution_Worldwide_from_the_Start_with_Bing_Translator.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/2-656_LG.mp4&amp;quot;),(&amp;quot;Continuous_Delivery_and_Continuous_Integration_with_Visual_Studio_Online_and_Microsoft_Azure.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-584_LG.mp4&amp;quot;),(&amp;quot;What_s_New_for_ASP_NET_and_Web_in_Visual_Studio_2013_Update_2_and_Beyond.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-602_LG.mp4&amp;quot;),(&amp;quot;Building_Web_APIs_for_Mobile_Apps_Using_ASP_NET_Web_API_2_1.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-603_LG.mp4&amp;quot;),(&amp;quot;Deep_Dive_Improving_Performance_in_Your_ASP_NET_App.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-605_LG.mp4&amp;quot;),(&amp;quot;Powerful_Mobile_Apps_with_Mobile_Services_and_ASP_NET_Web_API.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-623_LG.mp4&amp;quot;),(&amp;quot;Using_Node_js_and_Python_in_Visual_Studio_and_on_Azure.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-631_LG.mp4&amp;quot;),(&amp;quot;Building_a_Single_Page_Application_with_ASP_NET_and_AngularJS.mp4&amp;quot;,&amp;quot;http://video.ch9.ms/sessions/build/2014/3-644_LG.mp4&amp;quot;))  
$entries = $feeds.Length
$progress = 0 
$pagepercent = 0 
$dir = get-location
foreach ($item in $feeds){
    $name,$link = $item
    $saveFileName = join-path $dir $name
    if ((-not $overwrite) -and (Test-Path -path $saveFileName))     
    {        
        write-progress -activity &amp;quot;$saveFileName already downloaded&amp;quot; -status &amp;quot;$pagepercent% ($progress / $entries) complete&amp;quot; -percentcomplete $pagepercent    
    }    
    else     
    {        
        write-progress -activity &amp;quot;Downloading $saveFileName&amp;quot; -status &amp;quot;$pagepercent% ($progress / $entries) complete&amp;quot; -percentcomplete $pagepercent       
        &amp;amp;{#TRY
            $webClient.DownloadFile($link, $saveFileName)
        }
        trap [Exception]{
            write-host
            write-host (&amp;quot;Unable to download &amp;quot; + $saveFileName)
            continue; 
        }
    }    
    $pagepercent = [Math]::floor((++$progress)/$entries*100) 
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hope these tips help. Get to work!&lt;/p&gt;</description><pubDate>Tue, 15 Apr 2014 23:01:45 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/catching-up-on-the-channel-9-event-videos-for-build-2014</guid></item><item><title>Looking at ASP.NET MVC 5.1 and Web API 2.1 - Part 4 - Web API Help Pages, BSON, and Global Error Handling</title><link>https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling</link><description>&lt;p&gt;This is part 4 of a series covering some of the new features in the ASP.NET MVC 5.1 and Web API 2.1 releases. The last one! If you've read them all, you have earned twelve blog readership points... after you finish this one, of course. Here are the previous posts:&lt;/p&gt;    &lt;ul&gt;    &lt;li&gt;Part 1: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;Overview and Enums&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;Part 2: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;Attribute Routing with Custom Constraints&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;Part 3: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/28/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements.aspx"&gt;Bootstrap and JavaScript enhancements&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;Part 4: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/02/26/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling.aspx"&gt;Web API Help Pages, BSON, and Global Error Handling&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;  &lt;p&gt;The sample project covering the posts in this series is &lt;a href="https://github.com/jongalloway/StarDotOne"&gt;here&lt;/a&gt;; other referenced samples are in the &lt;a href="http://aspnet.codeplex.com/sourcecontrol/latest#Samples/ReadMe.txt"&gt;ASP.NET sample repository&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;As a reminder, Part 1 explained that ASP.NET MVC 5.1 / Web API 2.1 is a NuGet update for the MVC 5 / Web API 2 releases that shipped with Visual Studio 2013. There will be a Visual Studio update that will make them the defaults when you create new projects.&lt;/p&gt;    &lt;p&gt;In this post, we'll look at new features in ASP.NET Web API 2.1.&lt;/p&gt;    &lt;h2&gt;Attribute Routing&lt;/h2&gt;   &lt;p&gt;We already looked at the updates to Attribute Routing improvements for both ASP.NET Web API and MVC in the second post in this series, I just want to call it out again since this post is overviewing all of the other new features in ASP.NET Web API 2.1 and the Attribute Routing support for custom constraints is one of the top features in the ASP.NET Web API 2.1 release.&lt;/p&gt;    &lt;p&gt;As a reminder, custom route constraints make it really easy to create wrap route matching logic in a constraint which can then be placed on ApiControllers or actions like this:&lt;/p&gt;    &lt;pre class="brush: csharp; auto-links: false; highlight: [1,7];"&gt;[VersionedRoute("api/Customer", 1)]
public class CustomerVersion1Controller : ApiController
{
    // controller code goes here
}
[VersionedRoute("api/Customer", 2)]
public class CustomerVersion2Controller : ApiController
{
    // controller code goes here
}&lt;/pre&gt;

&lt;p&gt;In that example, the custom VersionedRoute constraint looks for an api-version header and forwards the request to the correct controller. &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;See the post for more information&lt;/a&gt;, including a link to the sample application.&lt;/p&gt;

&lt;h2&gt;Help Page improvements&lt;/h2&gt;

&lt;p&gt;Okay, let's dig into some of the cool new features we haven't seen yet. To start with, I'm going to scaffold out a new PersonApiController using the same Person class I've used earlier in this series, shown below:&lt;/p&gt;

&lt;pre class="brush: js; auto-links: false;"&gt;public class Person
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }
    [UIHint("Enum-radio")]
    public Salutation Salutation { get; set; }
    [Display(Name = "First Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
   public string FirstName { get; set; }
    [Display(Name = "Last Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string LastName { get; set; }
    public int Age { get; set; }
}
//I guess technically these are called honorifics
public enum Salutation : byte
{
    [Display(Name = "Mr.")]   Mr,
    [Display(Name = "Mrs.")]  Mrs,
    [Display(Name = "Ms.")]   Ms,
    [Display(Name = "Dr.")]   Doctor,
    [Display(Name = "Prof.")] Professor,
    Sir, 
    Lady, 
    Lord
}&lt;/pre&gt;

&lt;p&gt;And we're using the standard Web API scaffolding:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-30_16h11_27" href="http://www.flickr.com/photos/36836555@N00/12228468183/" mce_href="http://www.flickr.com/photos/36836555@N00/12228468183/"&gt;&lt;img alt="2014-01-30_16h11_27" src="http://farm8.static.flickr.com/7343/12228468183_ff9c844c8e.jpg" border="0" mce_src="http://farm8.static.flickr.com/7343/12228468183_ff9c844c8e.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing has really changed for the top level ASP.NET Web API Help Page - you get a generated list of API calls for each API Controller.&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-12_23h20_49" href="http://www.flickr.com/photos/36836555@N00/12495094414/" mce_href="http://www.flickr.com/photos/36836555@N00/12495094414/"&gt;&lt;img alt="2014-02-12_23h20_49" src="http://farm4.static.flickr.com/3711/12495094414_6afae7eb09.jpg" border="0" mce_src="http://farm4.static.flickr.com/3711/12495094414_6afae7eb09.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What has changed is what you see when you click through on one of the API calls, e.g. the PersonApi GET method. Here's how that looked in ASP.NET Web API 2.1:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_13h40_46" href="http://www.flickr.com/photos/36836555@N00/12598874764/" mce_href="http://www.flickr.com/photos/36836555@N00/12598874764/"&gt;&lt;img alt="2014-02-17_13h40_46" src="http://farm3.static.flickr.com/2817/12598874764_9baa1098f0_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2817/12598874764_9baa1098f0_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows sample data in JSON and XML, and you can kind of guess what they are if you've named your model properties well, but there's no information on type, model attributes, validation rules, etc.&lt;/p&gt;

&lt;p&gt;Here's how it looks in ASP.NET Web API 2:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_13h41_45" href="http://www.flickr.com/photos/36836555@N00/12598899184/" mce_href="http://www.flickr.com/photos/36836555@N00/12598899184/"&gt;&lt;img alt="2014-02-17_13h41_45" src="http://farm3.static.flickr.com/2860/12598899184_be54e7720a_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2860/12598899184_be54e7720a_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Response Formats section hasn't changed, but now we have a Resource Description area at the top. Let's take a closer look at that:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_13h53_18" href="http://www.flickr.com/photos/36836555@N00/12599121614/" mce_href="http://www.flickr.com/photos/36836555@N00/12599121614/"&gt;&lt;img alt="2014-02-17_13h53_18" src="http://farm4.static.flickr.com/3779/12599121614_b2cbe8590e_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3779/12599121614_b2cbe8590e_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we're clearly displaying both the type and validation rules.&lt;/p&gt;

&lt;p&gt;Note that the Salutation type is hyperlinked, since it's using our custom Salutation enum. Clicking through shows the possible values for that enum:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_13h47_37" href="http://www.flickr.com/photos/36836555@N00/12598689633/" mce_href="http://www.flickr.com/photos/36836555@N00/12598689633/"&gt;&lt;img alt="2014-02-17_13h47_37" src="http://farm4.static.flickr.com/3823/12598689633_aeeaff5074_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3823/12598689633_aeeaff5074_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;If you've done any work integrating with API's that had minimal or out of date documentation, hopefully the value of the above is really clear. What's great is that this is generated for me at runtime, so it's always up to date with the latest code. If my Web API is in production and I add a new Enum value or change a validation rule, the live documentation on the web site is immediately updated without any work or extra thought on my part as soon as I deploy the code.&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;Short detour: Filling in Descriptions using C# /// Comments&lt;/h3&gt;

&lt;p&gt;Now that we've got documentation for our model types, it's clear that we could improve it a bit. The most obvious thing is that there's no provided description. That's easy to add using C# /// comments (aka XML Comments). ASP.NET Web API Help Pages have had support for /// comments documentation for a while, it just hasn't been this obvious.&lt;/p&gt;

&lt;p&gt;The ASP.NET Web API Help Pages are implemented in a really clear, open model: it's all implemented in an ASP.NET MVC Area within your existing site. If you're not familiar with ASP.NET MVC Areas, they're a way to allow you to segment your applications into with separate routes, models, views and controllers but still keep them in the same project so it's easier to manage, share resources, etc.&lt;/p&gt;

&lt;p&gt;Here's the Help Page Area within the sample project we're working on:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_14h36_48" href="http://www.flickr.com/photos/36836555@N00/12599963954/" mce_href="http://www.flickr.com/photos/36836555@N00/12599963954/"&gt;&lt;img alt="2014-02-17_14h36_48" src="http://farm3.static.flickr.com/2863/12599963954_f08e78d026_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2863/12599963954_f08e78d026_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. In the above screenshot, I've highlighted the \App_Start\HelpPageConfig.cs file because that's where we're going to set up the XML comments. There's a Register method right at the top with the following two lines:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;//// Uncomment the following to use the documentation from XML documentation file.
//config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));&lt;/pre&gt;

&lt;p&gt;So to use that, we'll uncomment the second line, just as the instructions say.&lt;/p&gt;

&lt;p&gt;2. Note that the comments are pointing to an XmlDocument.xml file. We need to check a box in the project settings to generate that XML file as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_14h46_38" href="http://www.flickr.com/photos/36836555@N00/12599717125/" mce_href="http://www.flickr.com/photos/36836555@N00/12599717125/"&gt;&lt;img alt="2014-02-17_14h46_38" src="http://farm6.static.flickr.com/5537/12599717125_e0e8763f1a_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5537/12599717125_e0e8763f1a_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Once that's done, I'm going to throw the /// comments on the controller methods and model properties and generate XML comments. I used &lt;a href="http://submain.com/products/ghostdoc.aspx" mce_href="http://submain.com/products/ghostdoc.aspx"&gt;GhostDoc&lt;/a&gt; to generate the comments, then cleaned them up and editorialized a bit.&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;/// &amp;lt;summary&amp;gt;
/// This is an example person class. It artisanally crafted by a
/// bearded, bespeckled craftsman after being lovingly sketched
/// in a leather bound notebook with charcoal pencils.
/// &amp;lt;/summary&amp;gt;
public class Person
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }
    /// &amp;lt;summary&amp;gt;
    /// This uses a custom salution enum since there's apparently no ISO standard.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;value&amp;gt;
    /// The person's requested salutation.
    /// &amp;lt;/value&amp;gt;
    [UIHint("Enum-radio")]
    public Salutation Salutation { get; set; }
    [Display(Name = "First Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
   public string FirstName { get; set; }
    [Display(Name = "Last Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string LastName { get; set; }
    /// &amp;lt;summary&amp;gt;
    /// This is the person's actual or desired age.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;value&amp;gt;
    /// The age in years, represented in an integer.
    /// &amp;lt;/value&amp;gt;
    public int Age { get; set; }
}&lt;/pre&gt;

&lt;p&gt;And here's the updated help page with the descriptions:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_15h04_16" href="http://www.flickr.com/photos/36836555@N00/12600033795/" mce_href="http://www.flickr.com/photos/36836555@N00/12600033795/"&gt;&lt;img alt="2014-02-17_15h04_16" src="http://farm8.static.flickr.com/7302/12600033795_f95a2754d6_b.jpg" border="0" mce_src="http://farm8.static.flickr.com/7302/12600033795_f95a2754d6_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are a ton of other features in the HelpPageConfig - you could pull your documentation from a database or CMS, for example. And since it's all implemented in standard ASP.NET MVC, you can modify the views or do whatever else you want. But it's nice to have these new features available out of the box.&lt;/p&gt;

&lt;h2&gt;BSON&lt;/h2&gt;

&lt;p&gt;BSON is a binary serialization format that's similar to JSON in that they both store name-value pairs, but it's quite different in how the data is actually stored. BSON serializes data in a binary format, which can offer some performance benefits for encode / decode / traversal.&amp;nbsp; It's been possible to hook up a custom BSON formatter in ASP.NET Web API before; &lt;a href="http://www.strathweb.com/2012/07/bson-binary-json-and-how-your-web-api-can-be-even-faster/" mce_href="http://www.strathweb.com/2012/07/bson-binary-json-and-how-your-web-api-can-be-even-faster/"&gt;Filip and others have written comprehensive blog posts describing how to do just that&lt;/a&gt;. It's even easier now - both for clients and servers - since the BSON formatter is included with ASP.NET Web API.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Important note:&lt;/b&gt; BSON isn't designed to be more compact than JSON, in fact it's often bigger (depending on your data structure and content). That's because, unlike JSON, BSON embeds type information in the document. That makes for fast scan and read, but it's holding more data than the equivalent JSON document. That means that it will be faster in some cases, but it may be slower in other cases if your messages are bigger. This shows the value of content negotiation and flexible formatters in ASP.NET Web API - you can easily try out different formatters, both on the client and server side, and use the best one for the job.&lt;/p&gt;

&lt;p&gt;I'll look at two examples here.&lt;/p&gt;

&lt;h3&gt;Testing BSON with a text-heavy model&lt;/h3&gt;

&lt;p&gt;For the first example, I'll use the Person class we've been using for our previous examples. I'd like to have a lot more people in my database. I grabbed some absolutely silly code I wrote 7 years ago that generates fake surnames (&lt;a href="http://weblogs.asp.net/jgalloway/archive/2007/01/12/code-puzzle-2-generate-random-fake-surnames-recap.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2007/01/12/code-puzzle-2-generate-random-fake-surnames-recap.aspx"&gt;Generate random fake surnames&lt;/a&gt;) and added a controller action to slam 500 new people with a first name of Bob but a random last name and age into the database. Then I clicked on it a few times.&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-17_16h19_50" href="http://www.flickr.com/photos/36836555@N00/12601399413/" mce_href="http://www.flickr.com/photos/36836555@N00/12601399413/"&gt;&lt;img alt="2014-02-17_16h19_50" src="http://farm8.static.flickr.com/7445/12601399413_a3ff443d5d.jpg" border="0" mce_src="http://farm8.static.flickr.com/7445/12601399413_a3ff443d5d.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turning on the BSON formatter is just a one line code change:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [5];"&gt;public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Formatters.Add(new BsonMediaTypeFormatter());
        // ...
    }
}&lt;/pre&gt;

&lt;p&gt;Now whenever a client sends an Accept header for application/bson, they'll get the data in BSON format. For comparison, I'm making two requests in Fiddler. Here's a request with no Accept header specified, so we get JSON:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-18_00h48_12" href="http://www.flickr.com/photos/36836555@N00/12608617655/" mce_href="http://www.flickr.com/photos/36836555@N00/12608617655/"&gt;&lt;img alt="2014-02-18_00h48_12" src="http://farm3.static.flickr.com/2810/12608617655_5096fc8815_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2810/12608617655_5096fc8815_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The content-length there is 118,353 bytes.&lt;/p&gt;

&lt;p&gt;Now I'm setting an Accept header with application/bson:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-18_00h51_19" href="http://www.flickr.com/photos/36836555@N00/12609081114/" mce_href="http://www.flickr.com/photos/36836555@N00/12609081114/"&gt;&lt;img alt="2014-02-18_00h51_19" src="http://farm6.static.flickr.com/5472/12609081114_9d2b98729c_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5472/12609081114_9d2b98729c_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice that &lt;b&gt;this BSON request is 134,395 bytes, or 13% larger&lt;/b&gt;. I've marked some of the type identifiers in there, but you can see there are a lot more since they're lined up in columns.&lt;/p&gt;

&lt;p&gt;Place your bets: think the faster BSON serializer will be faster, despite the larger payload size? Before we answer that, we'll add in a second scenario that replaces our text-heavy Person class with a quite exciting BoringData class that's mostly numeric and binary data:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public class BoringData
{
    public int Id { get; set; }
    public long DataLong { get; set; }
    public byte[] DataBytes { get; set; }
    public DateTime DataDate { get; set; }
}&lt;/pre&gt;

&lt;p&gt;And here's the test we'll throw at both of these:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;private HttpClient _client = new HttpClient();
static void Main(string[] args)
{
    try
    {
        Console.WriteLine("Hit ENTER to begin...");
        RunAsync().Wait();
    }
    finally
    {
        Console.WriteLine("Hit ENTER to exit...");
        Console.ReadLine();
    }
}
private async static Task RunAsync()
{
    using (HttpClient client = new HttpClient())
    {
        await RunTimedTest&amp;lt;BoringData&amp;gt;(client, new JsonMediaTypeFormatter(), "http://localhost:29108/api/BoringDataApi", "application/json");
        await RunTimedTest&amp;lt;BoringData&amp;gt;(client, new BsonMediaTypeFormatter(), "http://localhost:29108/api/BoringDataApi", "application/bson");
        await RunTimedTest&amp;lt;Person&amp;gt;(client, new JsonMediaTypeFormatter(), "http://localhost:29108/api/PersonApi", "application/json");
        await RunTimedTest&amp;lt;Person&amp;gt;(client, new BsonMediaTypeFormatter(), "http://localhost:29108/api/PersonApi", "application/bson");
    }
}
public static async Task RunTimedTest&amp;lt;T&amp;gt;(HttpClient _client, MediaTypeFormatter formatter, string Uri, string mediaHeader)
{
    int iterations = 500;
    _client.DefaultRequestHeaders.Accept.Clear();
    _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(mediaHeader));
    MediaTypeFormatter[] formatters = new MediaTypeFormatter[] { formatter };
    var watch = Stopwatch.StartNew();
    for (int i = 0; i &amp;lt; iterations; i++)
    {
        var result = await _client.GetAsync(Uri);
        var value = await result.Content.ReadAsAsync&amp;lt;T[]&amp;gt;(formatters);
    }
    Console.WriteLine("Format: {0,-20} Type: {1,-15}\t Time (s):{2,10:ss\\.fff}", mediaHeader, typeof(T).Name, watch.Elapsed);
}&lt;/pre&gt;

&lt;p&gt;The BoringDataApi controller's GET method returns lots of data, as you'd expect:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public class BoringDataApiController : ApiController
{
    static Random rng = new Random(Guid.NewGuid().GetHashCode());
    public IEnumerable&amp;lt;BoringData&amp;gt; GetBoringData()
    {
        return GetLotsOfBoringData(100);
    }
    private IEnumerable&amp;lt;BoringData&amp;gt; GetLotsOfBoringData(int quantity)
    {
        byte[] buf1 = new byte[10000];
        byte[] buf2 = new byte[64];

        for (int i = 1; i &amp;lt; quantity; i++)
        {
            rng.NextBytes(buf1);
            rng.NextBytes(buf2);
            yield return new BoringData
            {
                Id  = i,
                DataBytes = buf1,
                DataDate = DateTime.UtcNow,
                DataLong = BitConverter.ToInt64(buf2,0)
            };
        }
    }
}&lt;/pre&gt;

&lt;p&gt;So, big picture, the test harness will run 500 end to end tests on both controllers, requesting both Person and BoringData as both JSON and BSON. What we're &lt;b&gt;not comparing&lt;/b&gt; is the difference between the Person and BoringData responses, we're just looking for some general trends to see if BSON is faster than JSON for a mostly-textual and mostly-binary model. &lt;a href="http://kellabyte.com/2014/02/12/create-benchmarks-and-results-that-have-value/" mce_href="http://kellabyte.com/2014/02/12/create-benchmarks-and-results-that-have-value/"&gt;Yes, Kelly Sommers will beat me up for this, and I'm okay with that&lt;/a&gt;. My goal is to get some basic guidelines on when BSON works better than JSON. &lt;/p&gt;

&lt;p&gt;The real point here is that you won't know how your API or a specific content type will perform until you test it.&lt;/p&gt;

&lt;p&gt;So how'd we do?&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-02-18_17h13_33" href="http://www.flickr.com/photos/36836555@N00/12624517414/" mce_href="http://www.flickr.com/photos/36836555@N00/12624517414/"&gt;&lt;img alt="2014-02-18_17h13_33" src="http://farm6.static.flickr.com/5540/12624517414_10643b7003_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5540/12624517414_10643b7003_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case (and I ran this test many times with the same general result) BSON was a lot faster for mostly binary/numeric data, and a little slower for mostly textual data. In this pretty random example, &lt;b&gt;BSON was 140% faster for the mostly binary case and and 21% slower for the mostly-textual case. &lt;/b&gt;That's because both serialize textual data to UTF-8, but BSON includes some additional metadata.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;So, very generally speaking, if your service returns a lot of binary / numeric / non-textual data, you should really look at BSON.&lt;/b&gt; If you're looking for a silver bullet, you may have to pony up for some silver.&lt;/p&gt;

&lt;h3&gt;Easier implementations due to BaseJsonMediaTypeFormatter&lt;/h3&gt;

&lt;p&gt;Yes, that's the most boring heading you'll ever see. But it's hopefully true. The new BaseJsonMediaTypeFormatter has been designed to make it easier to implement new different serialization formats easier, since the the internal JSON formatters have been redesigned to make it easier to extend. I asked Doug, the dev that did most of the work for this BSON update, about his &lt;a href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/8b1440decc8ccc5800be799925064d5bb1aca509" mce_href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/8b1440decc8ccc5800be799925064d5bb1aca509"&gt;commit message saying recent changes will make it easier to make other formatters like MessagePack happen&lt;/a&gt; and he said:&lt;/p&gt;

&lt;blockquote&gt;
  
&lt;p&gt;Yes.&amp;nbsp; BaseJsonMediaTypeFormatter introduces a few Json.Net types and concepts.&amp;nbsp; But it also provides solid and reusable async wrappers around easier-to-implement sync methods.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The main thing I've noticed there is the common BaseJsonMediaTypeFormatter. There's not a whole lot of code in the &lt;a href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/8b1440decc8ccc5800be799925064d5bb1aca509" mce_href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/8b1440decc8ccc5800be799925064d5bb1aca509"&gt;BsonMediaTypeFormatter&lt;/a&gt;, since a lot of it's in the common base and in other support classes.&lt;/p&gt;

&lt;p&gt;And while I'm mentioning &lt;a href="http://msgpack.org/" mce_href="http://msgpack.org/"&gt;MessagePack&lt;/a&gt;, I think it's another great option that's really worth looking at, since (unlike BSON) MessagePack is designed for small message size. There's a &lt;a href="https://github.com/WebApiContrib/WebAPIContrib" mce_href="https://github.com/WebApiContrib/WebAPIContrib"&gt;MsgPack formatter available now in the WebApiContrib formatters collection&lt;/a&gt;, and Filip Woj. wrote a nice blog post overview here: &lt;a href="http://www.strathweb.com/2012/09/boost-up-your-asp-net-web-api-with-messagepack/" mce_href="http://www.strathweb.com/2012/09/boost-up-your-asp-net-web-api-with-messagepack/"&gt;Boost up your ASP.NET Web API with MessagePack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Global Error Handling&lt;/h2&gt;

&lt;p&gt;The last feature we'll look at is Global Error Handling. The name's pretty self-descriptive: it lets you register handlers and loggers which will respond to any unhandled exceptions across your entire Web API application.&lt;/p&gt;

&lt;p&gt;Global error handling is especially useful in Web API because of the way the parts are so loosely coupled and composable - you've got all kinds of different handlers and filters, wired together with a very configurable system that encourages dependency injection... There's a lot going on.&lt;/p&gt;

&lt;p&gt;&lt;a title="ASP.NET Web API Poster" href="http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf" mce_href="http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf"&gt;&lt;img alt="ASP.NET Web API Poster" src="http://farm4.static.flickr.com/3731/12758637613_45f521098d_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3731/12758637613_45f521098d_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: You can &lt;a href="http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf" mce_href="http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster.pdf"&gt;download the PDF of this poster from the ASP.NET site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That provides you tons of flexibility when you're building HTTP services, but it can make it hard to find out what's wrong when there's a problem. Exception filters help, but &lt;a href="http://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling" mce_href="http://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling"&gt;as David Matson notes&lt;/a&gt;, they don't handle:&lt;/p&gt;

&lt;ol&gt;
  
&lt;li&gt;Exceptions thrown from controller constructors &lt;/li&gt;

  
&lt;li&gt;Exceptions thrown from message handlers &lt;/li&gt;

  
&lt;li&gt;Exceptions thrown during routing &lt;/li&gt;

  
&lt;li&gt;Exceptions thrown during response content serialization &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I recommend David Matson's &lt;a href="http://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling" mce_href="http://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling"&gt;Web API Global Error Handling&lt;/a&gt; wiki article entry in the ASP.NET repository for more information on design and technical implementation. The short excerpt is that you can register one IExceptionHandler and multiple IExceptionLogger instances in your application, and they'll respond to all Web API exceptions.&lt;/p&gt;

&lt;p&gt;There's already &lt;a href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/Elmah/ReadMe.txt" mce_href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/Elmah/ReadMe.txt"&gt;a pretty clear sample in the Web API samples&lt;/a&gt; which shows a GenericTextExceptionHandler (which returns a generic exception message for unhandled exceptions) and an ElmahExceptionLogger (which implements logging using the popular ELMAH logging system). I've been trying to come up with some other use cases, but I think they captured the main ones here - usually if you have an unhandled exception, you want to log it and make sure you return some sort of useful message to your client. &lt;/p&gt;

&lt;p&gt;Both of these interfaces are really simple - they both have a single async method (LogAsync and HandleAsync, respectively) which are passed an ExceptionContext and a CancellationToken.&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public interface IExceptionLogger
{
    Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken);
}
public interface IExceptionHandler
{
    Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken);
}&lt;/pre&gt;

&lt;p&gt;The ExceptionContext includes the exception as well as a lot of other useful context information:&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;Exception (Exception) &lt;/li&gt;

  
&lt;li&gt;Request (HttpRequestMessage) &lt;/li&gt;

  
&lt;li&gt;RequestContext () &lt;/li&gt;

  
&lt;li&gt;ControllerContext (HttpControllerContext) &lt;/li&gt;

  
&lt;li&gt;ActionContext (HttpActionContext) &lt;/li&gt;

  
&lt;li&gt;Response (HttpResponseMessage) &lt;/li&gt;

  
&lt;li&gt;CatchBlock (string) &lt;/li&gt;

  
&lt;li&gt;IsTopLevelCatchBlock (bool) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're registered in your WebApiConfig like this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        // There can be multiple exception loggers. (By default, no exception loggers are registered.)
        config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
        // There must be exactly one exception handler. (There is a default one that may be replaced.)
        // To make this sample easier to run in a browser, replace the default exception handler with one that sends
        // back text/plain content for all errors.
        config.Services.Replace(typeof(IExceptionHandler), new GenericTextExceptionHandler());
    }
}&lt;/pre&gt;

&lt;p&gt;There are a few areas to possibly add to, but I'm going to pass on actually implementing them so I can get this series wrapped before ASP.NET Web API 2.2 ships. Maybe an exercise for the reader?&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;The sample GenericTextExceptionHandler just returns generic text, but since it has access to the exception details and the context, I'd perhaps instead return an error reference code with the response so customers of my API could use them for troubleshooting. Since one cause of API errors is an inability to access the backend database, I might instead &lt;a href="https://www.runscope.com/docs/api/resources/messages#message-create" mce_href="https://www.runscope.com/docs/api/resources/messages#message-create"&gt;send an error message to Runscope&lt;/a&gt; to give more context for debugging there as well. &lt;/li&gt;

  
&lt;li&gt;Rather than implement several IExceptionLogger instances, I'd probably use ELMAH's extensibility to register additional log listeners - there are listeners available for files and databases like &lt;a href="http://code.google.com/p/elmah/downloads/list" mce_href="http://code.google.com/p/elmah/downloads/list"&gt;XML, JSON, SQL Server, PostgreSQL, SQLite, MySQL&lt;/a&gt;, and lots of &lt;a href="https://www.nuget.org/packages?q=elmah&amp;amp;prerelease=&amp;amp;sortOrder=relevance" mce_href="https://www.nuget.org/packages?q=elmah&amp;amp;prerelease=&amp;amp;sortOrder=relevance"&gt;NuGet packages&lt;/a&gt; covering &lt;a href="https://www.nuget.org/packages/Glimpse.Elmah/" mce_href="https://www.nuget.org/packages/Glimpse.Elmah/"&gt;Glimpse integration&lt;/a&gt;, RavenDb, MongoDb, etc. One other idea is to &lt;a href="http://docs.exceptionless.com/contents/sendingerrors/" mce_href="http://docs.exceptionless.com/contents/sendingerrors/"&gt;add in an additional logger to an additional service like Exceptionless&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Damien (damienbod) has a nice overview of Web API Exception handling, complete with a lot of references: &lt;a href="http://damienbod.wordpress.com/2014/02/12/exploring-web-api-exception-handling/" mce_href="http://damienbod.wordpress.com/2014/02/12/exploring-web-api-exception-handling/"&gt;Exploring Web API Exception Handling&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;More features to read about&lt;/h2&gt;

&lt;p&gt;We've looked at several of the top features in this release, but there are a lot more. Here's a list with links to the documentation:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;ASP.NET MVC 5.1&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#AttributeRouting" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#AttributeRouting"&gt;Attribute routing improvements&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Bootstrap" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Bootstrap"&gt;Bootstrap support for editor templates&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum"&gt;Enum support in views&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Unobtrusive" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Unobtrusive"&gt;Unobtrusive validation for MinLength/MaxLength Attributes&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#thisContext" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#thisContext"&gt;Supporting the ‘this’ context in Unobtrusive Ajax&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;Various &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=MVC&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=MVC&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;bug fixes&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;ASP.NET Web API 2.1&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error"&gt;Global error handling&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#attribute-routing" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#attribute-routing"&gt;Attribute routing improvements&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#help-page" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#help-page"&gt;Help Page improvements&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#ignoreroute" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#ignoreroute"&gt;IgnoreRoute support&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#bson" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#bson"&gt;BSON media-type formatter&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#async-filters" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#async-filters"&gt;Better support for async filters&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#query-parsing" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#query-parsing"&gt;Query parsing for the client formatting library&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;Various &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20API|Web%20API%20OData&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20API|Web%20API%20OData&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;bug fixes&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;ASP.NET Web Pages 3.1&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;Various &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20Pages%2FRazor&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20Pages%2FRazor&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;bug fixes&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope you enjoyed the series. As a reminder, you can grab the source for my samples &lt;a href="https://github.com/jongalloway/StarDotOne" mce_href="https://github.com/jongalloway/StarDotOne"&gt;here&lt;/a&gt; and the official ASP.NET / Web API samples in the &lt;a href="http://aspnet.codeplex.com/sourcecontrol/latest#Samples/ReadMe.txt" mce_href="http://aspnet.codeplex.com/sourcecontrol/latest#Samples/ReadMe.txt"&gt;ASP.NET sample repository&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 26 Feb 2014 19:51:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling</guid></item><item><title>Looking at ASP.NET MVC 5.1 and Web API 2.1 - Part 3 - Bootstrap and JavaScript enhancements</title><link>https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements</link><description>
&lt;p&gt;This is part 3 of a 4 part series covering some of the new features in the ASP.NET MVC 5.1 and Web API 2.1 releases.&lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;Part 1: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;Overview and Enums&lt;/a&gt; &lt;/li&gt;
    
&lt;li&gt;Part 2: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;Attribute Routing with Custom Constraints&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 3: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/28/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements.aspx"&gt;Bootstrap and JavaScript enhancements&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 4: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/02/26/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling.aspx"&gt;Web API Help Pages, BSON, and Global Error Handling&lt;/a&gt;&lt;/li&gt;

 &lt;/ul&gt;
  
&lt;p&gt;In this post, we'll be focusing on some client-side improvements to ASP.NET MVC 5.1.&lt;/p&gt;
  
&lt;p&gt;As a reminder if you haven't read the first post, these updates are currently delivered via a NuGet update to your existing ASP.NET MVC 5 / Web API 2 applications. They'll be part of the File / New Project templates included in an upcoming Visual Studio update.&lt;/p&gt;
  &lt;h2&gt;EditorFor now supports passing HTML attributes - Great for Bootstrap&lt;/h2&gt;  
&lt;p&gt;The new ASP.NET project templates all include Bootstrap themes. Bootstrap uses custom class names for everything - styling, components, layout, behavior. That made it frustrating that you couldn't pass classes down to the Html.EditorFor HTML helper: you either had to use specific HTML Helpers like Html.TextBoxFor (which do allow you to pass HTML attributes, but don't benefit from some of the other nice features in HTML.EditorFor, like Data Attribute support for display and input validation) or give up on using the Bootstrap classes and style things yourself.&lt;/p&gt;
  
&lt;p&gt;In the 5.1 release, you can now pass HTML attributes as an additional parameter to Html.EditorFor, allowing you to get the best of both. Here's an example of why that's useful.&lt;/p&gt;
  
&lt;p&gt;In the first post in the series, we scaffolded a simple create controller and associated views. The Create view ended up looking like this:&lt;/p&gt;
  
&lt;p&gt;&lt;a title="2014-01-28_10h51_55" href="http://www.flickr.com/photos/36836555@N00/12193032655/" mce_href="http://www.flickr.com/photos/36836555@N00/12193032655/"&gt;&lt;img alt="2014-01-28_10h51_55" src="http://farm3.static.flickr.com/2890/12193032655_8a37eaee04_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2890/12193032655_8a37eaee04_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;That's okay, but it's not taking advantage of any of the Bootstrap form styling (e.g. focus indication, element sizing, groups, etc.) and it won't do anything special with custom Bootstrap themes. A great start would be just to add the "form-control" class to the form elements. That just involves changing from this:&lt;/p&gt;
  
&lt;pre class="brush: csharp; auto-links: false;"&gt;@Html.EditorFor(model =&amp;gt; model.FirstName)&lt;/pre&gt;

&lt;p&gt;to this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;@Html.EditorFor(model =&amp;gt; model.FirstName, new { htmlAttributes = new { @class = "form-control" }, })&lt;/pre&gt;

&lt;p&gt;When I make that update to the textboxes, I get this view:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-28_00h51_07" href="http://www.flickr.com/photos/36836555@N00/12186423094/" mce_href="http://www.flickr.com/photos/36836555@N00/12186423094/"&gt;&lt;img alt="2014-01-28_00h51_07" src="http://farm3.static.flickr.com/2850/12186423094_8976fc8c40_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2850/12186423094_8976fc8c40_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll notice some subtle improvements, like the focus highlight on the FirstName field, nicer textbox size and validation layout for Age, etc. These are just really simple things with a&amp;nbsp; very basic model, but they give a quick idea of the improvement here.&lt;/p&gt;

&lt;p&gt;Also nice is that I can pass the attributes on Html.EditorFor when displaying the entire model. Here I've updated the entire form section to just use one EditorFor call, passing in the model:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [10];"&gt;@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    &amp;lt;div class="form-horizontal"&amp;gt;
        &amp;lt;h4&amp;gt;Person&amp;lt;/h4&amp;gt;
        &amp;lt;hr /&amp;gt;
        @Html.ValidationSummary(true)
        @Html.EditorFor(model =&amp;gt; model, new { htmlAttributes = new { @class = "form-control" }, })
        &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;div class="col-md-offset-2 col-md-10"&amp;gt;
                &amp;lt;input type="submit" value="Create" class="btn btn-default" /&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
}&lt;/pre&gt;

&lt;p&gt;Note that to make sure the Id property didn't display and to use the custom radio enum display template (as explained in the first post in the series), I added two annotations to my model. Here's how the model and associated Enum look:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [3,5];"&gt;public class Person
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }
    [UIHint("Enum-radio")]
    public Salutation Salutation { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
//I guess technically these are called honorifics
public enum Salutation : byte
{
    [Display(Name = "Mr.")]   Mr,
    [Display(Name = "Mrs.")]  Mrs,
    [Display(Name = "Ms.")]   Ms,
    [Display(Name = "Dr.")]   Doctor,
    [Display(Name = "Prof.")] Professor,
    Sir, 
    Lady, 
    Lord
}&lt;/pre&gt;

&lt;p&gt;That gives me the exact same output as shown above (the second, nicer screenshot). What's cool there is that the EditorFor method passed that form-control class to each element in the form, so each input tag got the form-control class. That means that I could apply additional Bootstrap classes, as well as my own custom classes, in that same call:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;        @Html.EditorFor(model =&amp;gt; model, new { htmlAttributes = new { @class = "form-control input-sm my-custom-class" }, })&lt;/pre&gt;

&lt;p&gt;You can see the &lt;a href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/f5a8ab8dd751b6d046f55dfdf0138bda202bcdbf" mce_href="https://aspnetwebstack.codeplex.com/SourceControl/changeset/f5a8ab8dd751b6d046f55dfdf0138bda202bcdbf"&gt;code changes and associated tests for this EditorFor change on this commit on CodePlex&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Client-side validation for MinLength and MaxLength&lt;/h2&gt;

&lt;p&gt;This is a pretty straightforward one: we had client-side validation for StringLength before, but not for MinLength and MaxLength. Personally, I feel like it's a tossup on which to use - StringLength lets you set both min and max and is more widely supported, but MinLength and MaxLength allow you to specify them separately and give different validation messages for each. Regardless, the good news is that whichever you use, they're both supported on both server and client.&lt;/p&gt;

&lt;p&gt;To test that out, we'll add some MinLength and MaxLength attributes to our Person class.&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [8,9,12,13];"&gt;public class Person
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }
    [UIHint("Enum-radio")]
    public Salutation Salutation { get; set; }
    [Display(Name = "First Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string FirstName { get; set; }
    [Display(Name = "Last Name")]
    [MinLength(3, ErrorMessage = "Your {0} must be at least {1} characters long")]
    [MaxLength(100, ErrorMessage = "Your {0} must be no more than {1} characters")]
    public string LastName { get; set; }
    public int Age { get; set; }
}&lt;/pre&gt;

&lt;p&gt;I get immediate feedback on what the website thinks of a potential stage name I've been considering:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-28_14h45_16" href="http://www.flickr.com/photos/36836555@N00/12196896086/" mce_href="http://www.flickr.com/photos/36836555@N00/12196896086/"&gt;&lt;img alt="2014-01-28_14h45_16" src="http://farm8.static.flickr.com/7443/12196896086_9043699fb8_b.jpg" border="0" mce_src="http://farm8.static.flickr.com/7443/12196896086_9043699fb8_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="http://aspnetwebstack.codeplex.com/workitem/1476" mce_href="http://aspnetwebstack.codeplex.com/workitem/1476"&gt;link to the work item&lt;/a&gt;, and here's &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/1eb13543f730431a2f20abe64bb8ff5df76d5941" mce_href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/1eb13543f730431a2f20abe64bb8ff5df76d5941"&gt;the code diff for the commit&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Three small but useful fixes to Unobtrusive Ajax&lt;/h2&gt;

&lt;p&gt;There are a &lt;a href="http://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=ajax&amp;amp;status=Resolved&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=All&amp;amp;sortField=Votes&amp;amp;sortDirection=Descending&amp;amp;page=0&amp;amp;reasonClosed=All" mce_href="http://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=ajax&amp;amp;status=Resolved&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=All&amp;amp;sortField=Votes&amp;amp;sortDirection=Descending&amp;amp;page=0&amp;amp;reasonClosed=All"&gt;few fixes to Unobtrusive Ajax&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;&lt;a href="http://aspnetwebstack.codeplex.com/workitem/1487" mce_href="http://aspnetwebstack.codeplex.com/workitem/1487"&gt;Support "this" context for ajax actions/forms&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://aspnetwebstack.codeplex.com/workitem/238" mce_href="http://aspnetwebstack.codeplex.com/workitem/238"&gt;Unobtrusive.Ajax interferes with the cancel convention on validation&lt;/a&gt; &lt;/li&gt;

  
&lt;li&gt;&lt;a href="http://aspnetwebstack.codeplex.com/workitem/1520" mce_href="http://aspnetwebstack.codeplex.com/workitem/1520"&gt;ASP.NET MVC 3 LoadingElementDuration is not working&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I thought the first fix was pretty interesting: a &lt;a href="http://stackoverflow.com/questions/6630189/how-to-use-this-inside-mvc3-ajax-actionlink-onbegin-oncomplete-events/14611314#14611314" mce_href="http://stackoverflow.com/questions/6630189/how-to-use-this-inside-mvc3-ajax-actionlink-onbegin-oncomplete-events/14611314#14611314"&gt;question came up on StackOverflow&lt;/a&gt;, someone posted &lt;a href="http://aspnetwebstack.codeplex.com/workitem/1487" mce_href="http://aspnetwebstack.codeplex.com/workitem/1487"&gt;a suggested one line fix on a CodePlex issue&lt;/a&gt;, and it got &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/8a2c969ab6b41591e6a7194028b5b37a562c855a" mce_href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/8a2c969ab6b41591e6a7194028b5b37a562c855a"&gt;fixed in this commit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This issue allows callbacks from Unobtrusive Ajax to have access to the initiating element.&amp;nbsp; That's pretty handy when you've got multiple potential callers, e.g. a list of items which contain Ajax.ActionLink calls. In the past, I've had to write &lt;a href="http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-8" mce_href="http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-8"&gt;unnecessarily complicated JavaScript to wire things up manually&lt;/a&gt; because I couldn't take advantage of the OnBegin, OnComplete, OnFailure and OnSuccess options, e.g.&lt;/p&gt;

&lt;pre class="brush: js; auto-links: false;"&gt;&amp;lt;script type="text/javascript"&amp;gt;
    $(function () {
        // Document.ready -&amp;gt; link up remove event handler
        $(".RemoveLink").click(function () {
            // Get the id from the link
            var recordToDelete = $(this).attr("data-id");
            if (recordToDelete != '') {
                // Perform the ajax post
                $.post("/ShoppingCart/RemoveFromCart", {"id": recordToDelete },
                    function (data) {
                        // Successful requests get here
                        // Update the page elements
                        if (data.ItemCount == 0) {
                            $('#row-' + data.DeleteId).fadeOut('slow');
                        } else {
                            $('#item-count-' + data.DeleteId).text(data.ItemCount);
                        }
                        $('#cart-total').text(data.CartTotal);
                        $('#update-message').text(data.Message);
                        $('#cart-status').text('Cart (' + data.CartCount + ')');
                    });
            }
        });
    });
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Now with this change, I'd have the option of wiring up the Ajax call and success callbacks separately and tersely, since they'd have access to the calling element for the ID.&lt;/p&gt;

&lt;p&gt;That's it for this post, in the next (and definitely last) post of this series I'll look at some ASP.NET Web API 2.1 improvements.&lt;/p&gt;
</description><pubDate>Tue, 28 Jan 2014 23:17:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements</guid><category>ASP.NET</category><category>ASP.NET MVC</category></item><item><title>Looking at ASP.NET MVC 5.1 and Web API 2.1 - Part 2 - Attribute Routing with Custom Constraints</title><link>https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints</link><description>
&lt;p&gt;I'm continuing a series looking at some of the new features in ASP.NET MVC 5.1 and Web API 2.1. Part 1 (&lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;Overview and Enums&lt;/a&gt;) explained how to update your NuGet packages in an ASP.NET MVC application, so I won't rehash that here.&lt;/p&gt;

&lt;ul&gt;   
&lt;li&gt;Part 1: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;Overview and Enums&lt;/a&gt; &lt;/li&gt;
    
&lt;li&gt;Part 2: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;Attribute Routing with Custom Constraints&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 3: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/28/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements.aspx"&gt;Bootstrap and JavaScript enhancements&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 4: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/02/26/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling.aspx"&gt;Web API Help Pages, BSON, and Global Error Handling&lt;/a&gt;&lt;/li&gt;

 &lt;/ul&gt;

&lt;p&gt;The sample project covering the posts in this series is &lt;a href="https://github.com/jongalloway/StarDotOne"&gt;here&lt;/a&gt;; other referenced samples are in the &lt;a href="http://aspnet.codeplex.com/sourcecontrol/latest#Samples/ReadMe.txt"&gt;ASP.NET sample repository&lt;/a&gt;.&lt;/p&gt;
  
&lt;p&gt;In this post, we'll look at improvements to attribute routing for both ASP.NET MVC and ASP.NET Web API. First, a quick review of what routing constraints are used for.&lt;/p&gt;
  &lt;h2&gt;Intro to Routing Constraints&lt;/h2&gt;  
&lt;p&gt;ASP.NET MVC and Web API have both offered both simple and custom route constraints since they first came out. A simple constraint would be something like this:&lt;/p&gt;
  
&lt;pre class="brush: csharp; auto-links: false; highlight: [3];"&gt;routes.MapRoute("blog", "{year}/{month}/{day}",
    new { controller = "blog", action = "index" },
    new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}" });&lt;/pre&gt;

&lt;p&gt;In the above case, "/2014/01/01" would match but "/does/this/work" would not since the values don't match the required pattern.&amp;nbsp; If you needed something more complex than a simple pattern match, you'd use a custom constraint by implementing IRouteConstraint and defining the custom logic in the Match method - if it returns true, the route is a match.&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public interface IRouteConstraint
{
    bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);
}&lt;/pre&gt;
&lt;h2&gt;Route Constraints in Attribute Routing&lt;/h2&gt;

&lt;p&gt;One of the top new features in ASP.NET MVC 5 and Web API 2 was the addition of Attribute Routing. Rather than defining all your routes in /App_Start/RouteConfig.cs using a series of routes.MapRoute() calls, you can define routes using attributes on your controller actions and controller classes. You can take your pick of whichever works better to you: continue to use traditional routing, use attribute routing instead, or use them both.&lt;/p&gt;

&lt;p&gt;Attribute routing previously offered custom inline constraints, like this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;[Route("temp/{scale:values(celsius|fahrenheit)}")]&lt;/pre&gt;

&lt;p&gt;Here, the scale segment has a custom inline Values constraint which will only match if the the scale value is in the pipe-delimited list, e.g. this will match temp/celsius and /temp/fahrenheit but not /temp/foo. You can read more about the Attribute Routing features that shipped with ASP.NET MVC 5, including inline constraints like the above, on this post by Ken Egozi: &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx" mce_href="http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx"&gt;Attribute Routing in ASP.NET MVC 5&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;While inline constraints allow you to restrict values for a particular segment, they're both a little limited (e.g. they can't operate over the entire URL, and some more complex thing that aren't possible at that scope). To see more about what changed and why, see the &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/f291ab8258da6536eb74930222a9a73989128b3b" mce_href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/f291ab8258da6536eb74930222a9a73989128b3b"&gt;issue report&lt;/a&gt; and &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/f291ab8258da6536eb74930222a9a73989128b3b" mce_href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/f291ab8258da6536eb74930222a9a73989128b3b"&gt;changed code for this commit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now with ASP.NET MVC 5.1, we can create a new attribute that implements a custom route constraint. Here's an example.&lt;/p&gt;

&lt;h2&gt;ASP.NET MVC 5.1 Example: Adding a custom LocaleRoute&lt;/h2&gt;

&lt;p&gt;Here's a simple custom route attribute that matches based on a list of supported locales.&lt;/p&gt;

&lt;p&gt;First, we'll create a custom LocaleRouteConstraint that implements IRouteConstraint:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public class LocaleRouteConstraint : IRouteConstraint
{
	public string Locale { get; private set; }
	public LocaleRouteConstraint(string locale)
	{
		Locale = locale;
	}
	public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
	{
		object value;
		if (values.TryGetValue("locale", out value) &amp;amp;&amp;amp; !string.IsNullOrWhiteSpace(value as string))
		{
			string locale = value as string;
			if (isValid(locale))
			{
				return string.Equals(Locale, locale, StringComparison.OrdinalIgnoreCase);
			}
		}
		return false;
	}
	private bool isValid(string locale)
	{
		string[] validOptions = "EN-US|EN-GB|FR-FR".Split('|') ;
		return validOptions.Contains(locale.ToUpper());
	}
}&lt;/pre&gt;

&lt;p&gt;IRouteConstraint has one method, Match. That's where you write your custom logic which determines if a set of incoming route values, context, etc., match your custom route. If you return true, routes with this constraint are eligible to respond to the request; if you return false the request will not be mapped to routes with this constraint.&lt;/p&gt;

&lt;p&gt;In this case, we've got a simple isValid matcher which takes a locale string (e.g. fr-fr) and validates it against a list of supported locales. In more advanced use, this may be querying against a database backed cache of locales your site supports or using some other more advanced method. If you are working with a more advanced constraint, especially a locale constraint, I recommend Ben Foster's article &lt;a title="http://ben.onfabrik.com/posts/improving-aspnet-mvc-routing-configuration" href="http://ben.onfabrik.com/posts/improving-aspnet-mvc-routing-configuration" mce_href="http://ben.onfabrik.com/posts/improving-aspnet-mvc-routing-configuration"&gt;Improving ASP.NET MVC Routing Configuration&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It's important to see that the real value in this case is running more advanced logic than a simple pattern match - if that's all you're doing, you could use a regex inline route constraint (e.g. {x:regex(^\d{3}-\d{3}-\d{4}$)}).&lt;/p&gt;

&lt;p&gt;Now we've got a constraint, but we need to map it to an attribute to use in attribute routing. Note that separating constraints from attributes gives a lot more flexibility - for instance, we could use this constraint on multiple attributes.&lt;/p&gt;

&lt;p&gt;Here's a simple one:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public class LocaleRouteAttribute : RouteFactoryAttribute
{
	public LocaleRouteAttribute(string template, string locale)
		: base(template)
	{
		Locale = locale;
	}
	public string Locale
	{
		get;
		private set;
	}
	public override RouteValueDictionary Constraints
	{
		get
		{
			var constraints = new RouteValueDictionary();
			constraints.Add("locale", new LocaleRouteConstraint(Locale));
			return constraints;
		}
	}
	public override RouteValueDictionary Defaults
	{
		get
		{
			var defaults = new RouteValueDictionary();
			defaults.Add("locale", "en-us");
			return defaults;
		}
	}
}&lt;/pre&gt;

&lt;p&gt;Now we've got a complete route attribute we can place on a controller or action:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [5];"&gt;using System.Web.Mvc;
namespace StarDotOne.Controllers
{
    [LocaleRoute("hello/{locale}/{action=Index}", "EN-GB")]
    public class ENGBHomeController : Controller
    {
        // GET: /hello/en-gb/
        public ActionResult Index()
        {
            return Content("I am the EN-GB controller.");
        }
    }
}&lt;/pre&gt;

&lt;p&gt;And here's our FR-FR controller:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;using System.Web.Mvc;
namespace StarDotOne.Controllers
{
    [LocaleRoute("hello/{locale}/{action=Index}", "FR-FR")]
    public class FRFRHomeController : Controller
    {
        // GET: /hello/fr-fr/
        public ActionResult Index()
        {
            return Content("Je suis le contrôleur FR-FR.");
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Before running this, we need to verify that we've got Attribute Routes enabled in our RouteConfig:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [7];"&gt;public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}&lt;/pre&gt;

&lt;p&gt;Now a request to /hello/en-gb/ goes to our ENGBController and a request to /hello/fr-fr/ goes to the FRFRController:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-24_11h18_03" href="http://www.flickr.com/photos/36836555@N00/12122081323/" mce_href="http://www.flickr.com/photos/36836555@N00/12122081323/"&gt;&lt;img alt="2014-01-24_11h18_03" src="http://farm6.static.flickr.com/5532/12122081323_30f4b1cd6f_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5532/12122081323_30f4b1cd6f_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because we've set the default locale in the LocaleRouteAttribute to en-us, we can browse to it using either /hello/en-us/ or just /hello:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-24_11h20_05" href="http://www.flickr.com/photos/36836555@N00/12122479736/" mce_href="http://www.flickr.com/photos/36836555@N00/12122479736/"&gt;&lt;img alt="2014-01-24_11h20_05" src="http://farm4.static.flickr.com/3704/12122479736_545c6a0708_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3704/12122479736_545c6a0708_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been paying close attention, you may be thinking that we could have accomplished the same thing using an inline route constraint. I think the real benefit over a custom inline constraint is when you're doing more than operating on one segment in the URL: preforming logic on the entire route or context. One great example there would be using a custom attribute based on a user's locale selection (set in a cookie, perhaps) or using a header.&lt;/p&gt;

&lt;p&gt;So, to recap:&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;You could write custom route constraints before in "Traditional" code-based routing, but not in attribute routing &lt;/li&gt;

  
&lt;li&gt;You could write custom inline constraints, but they mapped just to a segment in the URL &lt;/li&gt;

  
&lt;li&gt;Custom route constraints now can operate at a higher level than just a segment on the URL path, e.g. headers or other request context &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A very common use case for using headers in routing is versioning by header. We'll look at that with ASP.NET Web API 2.1 next. Keep in mind that, while the general recommendation is to use ASP.NET Web API for your HTTP APIs, many APIs are still running on ASP.NET MVC for a variety of reasons (existing / legacy systems APIs built on ASP.NET MVC, familiarity with MVC, mostly-MVC applications with relatively few APIs that want to stay simple, developer preferences, etc.) and for that reason, versioning ASP.NET MVC HTTP APIs by headers is probably one of the top use cases of custom route attribute constaints for ASP.NET MVC as well.&lt;/p&gt;

&lt;h2&gt;ASP.NET Web API 2.1 Custom Route Attributes example: Versioning By Header&lt;/h2&gt;

&lt;p&gt;Note: The example I'm showing here is in &lt;a href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt" mce_href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt"&gt;the official samples list on CodePlex&lt;/a&gt;. There's a lot of great examples there, including some samples showing off some of the more complex features you don't hear about all that often. Since the methodology is almost exactly the same as what we looked at in ASP.NET MVC 5.1 and &lt;a href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt" mce_href="http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt"&gt;the sample's available&lt;/a&gt;, I'll go through this one a lot faster.&lt;/p&gt;

&lt;p&gt;First, the custom constraint:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;internal class VersionConstraint : IHttpRouteConstraint
{
    public const string VersionHeaderName = "api-version";
    private const int DefaultVersion = 1;
    public VersionConstraint(int allowedVersion)
    {
        AllowedVersion = allowedVersion;
    }
    public int AllowedVersion
    {
        get;
        private set;
    }
    public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary&amp;lt;string, object&amp;gt; values, HttpRouteDirection routeDirection)
    {
        if (routeDirection == HttpRouteDirection.UriResolution)
        {
            int version = GetVersionHeader(request) ?? DefaultVersion;
            if (version == AllowedVersion)
            {
                return true;
            }
        }
        return false;
    }
    private int? GetVersionHeader(HttpRequestMessage request)
    {
        string versionAsString;
        IEnumerable&amp;lt;string&amp;gt; headerValues;
        if (request.Headers.TryGetValues(VersionHeaderName, out headerValues) &amp;amp;&amp;amp; headerValues.Count() == 1)
        {
            versionAsString = headerValues.First();
        }
        else
        {
            return null;
        }
        int version;
        if (versionAsString != null &amp;amp;&amp;amp; Int32.TryParse(versionAsString, out version))
        {
            return version;
        }
        return null;
    }
}&lt;/pre&gt;

&lt;p&gt;This is similar to the simpler LocaleConstraint we looked at earlier, but parses an integer version number from a header. Now, like before, we create an attribute to put this constraint to work:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;    internal class VersionedRoute : RouteFactoryAttribute
    {
        public VersionedRoute(string template, int allowedVersion)
            : base(template)
        {
            AllowedVersion = allowedVersion;
        }
        public int AllowedVersion
        {
            get;
            private set;
        }
        public override IDictionary&amp;lt;string, object&amp;gt; Constraints
        {
            get
            {
                var constraints = new HttpRouteValueDictionary();
                constraints.Add("version", new VersionConstraint(AllowedVersion));
                return constraints;
            }
        }
    }
}&lt;/pre&gt;

&lt;p&gt;And with that set up, we can just slap the attribute header on a couple different ApiControllers:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false; highlight: [1,7];"&gt;[VersionedRoute("api/Customer", 1)]
public class CustomerVersion1Controller : ApiController
{
    // controller code goes here
}
[VersionedRoute("api/Customer", 2)]
public class CustomerVersion2Controller : ApiController
{
    // controller code goes here
}&lt;/pre&gt;

&lt;p&gt;That's it - now requests to /api/Customer with the api-version header set to 1 (or empty, since it's the default) go to the first controller, and with api-version set to 2 go to the second controller. The sample includes a handy test client console app that does just that:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-24_14h58_06" href="http://www.flickr.com/photos/36836555@N00/12124449735/" mce_href="http://www.flickr.com/photos/36836555@N00/12124449735/"&gt;&lt;img alt="2014-01-24_14h58_06" src="http://farm8.static.flickr.com/7310/12124449735_156c2c6a3e_b.jpg" border="0" mce_src="http://farm8.static.flickr.com/7310/12124449735_156c2c6a3e_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, let's wrap up there for now. In the next (probably final) post, we'll take a quick high level look at some of the other features in this release.&lt;/p&gt;

&lt;p&gt;Recap:&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;Custom route constraints let you run custom logic to determine if a route matches as well as other things like compute values that are available in the matching controllers &lt;/li&gt;

  
&lt;li&gt;The previous release allowed for custom inline route constraints, but they only operated on a segment &lt;/li&gt;

  
&lt;li&gt;This *.1 release includes support for full custom route constraints &lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 24 Jan 2014 23:03:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints</guid></item><item><title>Looking at ASP.NET MVC 5.1 and Web API 2.1 - Part 1 - Overview and Enums</title><link>https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums</link><description>&lt;p&gt;This is the first in a four part series covering ASP.NET MVC 5.1 and Web API 2.1&lt;/p&gt;

&lt;ul&gt;   
&lt;li&gt;Part 1: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;Overview and Enums&lt;/a&gt; &lt;/li&gt;
    
&lt;li&gt;Part 2: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;Attribute Routing with Custom Constraints&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 3: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/28/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-3-bootstrap-and-javascript-enhancements.aspx"&gt;Bootstrap and JavaScript enhancements&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 4: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/02/26/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-4-web-api-help-pages-bson-and-global-error-handling.aspx"&gt;Web API Help Pages, BSON, and Global Error Handling&lt;/a&gt;&lt;/li&gt;

 &lt;/ul&gt;

&lt;p&gt;The sample project covering the posts in this series is &lt;a href="https://github.com/jongalloway/StarDotOne"&gt;here&lt;/a&gt;; other referenced samples are in the &lt;a href="http://aspnet.codeplex.com/sourcecontrol/latest#Samples/ReadMe.txt"&gt;ASP.NET sample repository&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;ASP.NET MVC 5.1, Web API 2.1 and Web Pages 3.1 were released on January 20. I call it the star-dot-one release, not sure if that one's going to stick. Here are the top links to find out more:&lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;The announcement blog post: &lt;a href="http://blogs.msdn.com/b/webdev/archive/2014/01/20/announcing-the-release-of-asp-net-mvc-5-1-asp-net-web-api-2-1-and-asp-net-web-pages-3-1.aspx" mce_href="http://blogs.msdn.com/b/webdev/archive/2014/01/20/announcing-the-release-of-asp-net-mvc-5-1-asp-net-web-api-2-1-and-asp-net-web-pages-3-1.aspx"&gt;Announcing the Release of ASP.NET MVC 5.1, ASP.NET Web API 2.1 and ASP.NET Web Pages 3.1&lt;/a&gt; &lt;/li&gt;
 &lt;/ul&gt;
  
&lt;p&gt;Release notes &lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes"&gt;ASP.NET MVC 5.1 release notes&lt;/a&gt;       
&lt;ul&gt;       
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#AttributeRouting" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#AttributeRouting"&gt;Attribute routing improvements&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Bootstrap" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Bootstrap"&gt;Bootstrap support for editor templates&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum"&gt;Enum support in views&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Unobtrusive" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Unobtrusive"&gt;Unobtrusive validation for MinLength/MaxLength Attributes&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#thisContext" mce_href="http://www.asp.net/mvc/overview/releases/mvc51-release-notes#thisContext"&gt;Supporting the ‘this’ context in Unobtrusive Ajax&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;Various &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=MVC&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=MVC&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;bug fixes&lt;/a&gt;&lt;!--EndFragment--&gt; &lt;/li&gt;
     &lt;/ul&gt;
   &lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21"&gt;ASP.NET Web API release notes&lt;/a&gt;       
&lt;ul&gt;       
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#global-error"&gt;Global error handling&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#attribute-routing" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#attribute-routing"&gt;Attribute routing improvements&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#help-page" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#help-page"&gt;Help Page improvements&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#ignoreroute" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#ignoreroute"&gt;IgnoreRoute support&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#bson" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#bson"&gt;BSON media-type formatter&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#async-filters" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#async-filters"&gt;Better support for async filters&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;&lt;a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#query-parsing" mce_href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21#query-parsing"&gt;Query parsing for the client formatting library&lt;/a&gt; &lt;/li&gt;
        
&lt;li&gt;Various &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20API|Web%20API%20OData&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20API|Web%20API%20OData&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;bug fixes&lt;/a&gt; &lt;!--EndFragment--&gt;&lt;/li&gt;
     &lt;/ul&gt;
   &lt;/li&gt;
    
&lt;li&gt;ASP.NET Web Pages 3.1 is a bug fix release, here's the &lt;a href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20Pages%2FRazor&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed" mce_href="https://aspnetwebstack.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=v5.1%20Preview|v5.1%20RTM&amp;amp;assignedTo=All&amp;amp;component=Web%20Pages%2FRazor&amp;amp;sortField=AssignedTo&amp;amp;sortDirection=Ascending&amp;amp;page=0&amp;amp;reasonClosed=Fixed"&gt;list of fixed bugs&lt;/a&gt; &lt;/li&gt;
 &lt;/ul&gt;
  
&lt;p&gt;Let's run through what's involved in getting them and trying some of the new features.&lt;/p&gt;
  &lt;h3&gt;Nothing to Install, just NuGet package updates&lt;/h3&gt;  
&lt;p&gt;As I mentioned in my last post, ASP.NET has moved from a "big thing" that you install every few years. The ASP.NET project templates are now mostly a collection of composable NuGet packages, which can be updated more frequently and used without needing to install anything that will affect your dev environment, other projects you're working on, your server environment, or other applications on your server.&lt;/p&gt;
  
&lt;p&gt;You don't need to wait for your hosting provider to support ASP.NET MVC 5.1, ASP.NET Web API 2.1 or ASP.NET Web Pages 3.1 - if they supported 5/2/3 they support 5.1/2.1/3.1. Easier said, if your server supports ASP.NET 4.5, you're set.&lt;/p&gt;
  
&lt;p&gt;However, there are some new features for ASP.NET MVC 5.1 views that require you to be running the most recent Visual Studio update to get editing support. You're installing the Visual Studio updates when they come out so that's not a problem, right?&lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;For Visual Studio 2012, you should have &lt;a href="http://go.microsoft.com/fwlink/?LinkId=390062" mce_href="http://go.microsoft.com/fwlink/?LinkId=390062"&gt;ASP.NET and Web Tools 2013.1 for Visual Studio 2012&lt;/a&gt;. You'd need this for ASP.NET MVC 5 support in Visual Studio 2012, so no real change there. &lt;/li&gt;
    
&lt;li&gt;For Visual Studio 2013, you should have &lt;a href="http://go.microsoft.com/fwlink/?LinkId=390064" mce_href="http://go.microsoft.com/fwlink/?LinkId=390064"&gt;Visual Studio 2013 Update 1&lt;/a&gt;. This update is needed to get nice editor support for the new ASP.NET MVC 5.1 Razor View features (e.g. Bootstrap overloads). &lt;/li&gt;
 &lt;/ul&gt;
  &lt;h3&gt;Okay, Let's Have a Look Then&lt;/h3&gt;  
&lt;p&gt;Game plan: I'm going to take an ASP.NET MVC 5 + Web API 2 project, update the NuGet packages, and then throw some of my favorite features in there.&lt;/p&gt;
  
&lt;p&gt;In this case, I'm opting for the "mostly Web API template" since it includes both MVC and Web API, and it includes help pages right out of the box. I could go with "mostly MVC" + Web API, but then I'd need to install the Web API Help Page NuGet package and I might strain a muscle.&lt;/p&gt;
  
&lt;p&gt;&lt;a title="2014-01-20_16h31_07" href="http://www.flickr.com/photos/36836555@N00/12060286423/" mce_href="http://www.flickr.com/photos/36836555@N00/12060286423/"&gt;&lt;img alt="2014-01-20_16h31_07" src="http://farm4.static.flickr.com/3764/12060286423_947afba81e.jpg" border="0" mce_src="http://farm4.static.flickr.com/3764/12060286423_947afba81e.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;Now I'll open the Manage NuGet Packages dialog and check for updates. Yup, there they are.&lt;/p&gt;
  
&lt;p&gt;&lt;a title="2014-01-20_16h37_07" href="http://www.flickr.com/photos/36836555@N00/12060960846/" mce_href="http://www.flickr.com/photos/36836555@N00/12060960846/"&gt;&lt;img alt="2014-01-20_16h37_07" src="http://farm4.static.flickr.com/3819/12060960846_2472bcd4c5_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3819/12060960846_2472bcd4c5_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;Since this is a throw-away project I'll throw caution to the wind and click Update All. If this were a real project, I might just update the three new releases so as not to pick an unnecessary fight with JavaScript libraries. But I'm feeling lucky today so Update All it is. &lt;/p&gt;
  
&lt;p&gt;&lt;a title="2014-01-20_16h42_15" href="http://www.flickr.com/photos/36836555@N00/12061011636/" mce_href="http://www.flickr.com/photos/36836555@N00/12061011636/"&gt;&lt;img alt="2014-01-20_16h42_15" src="http://farm6.static.flickr.com/5511/12061011636_906022fdbc_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5511/12061011636_906022fdbc_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;Wow, look at them go! jQuery 2.0.3 even. It's a party. (anti-party disclaimer for those who might be getting carsick: I didn't have to update to jQuery 2.0.3 or any of that other stuff to use the 5.1/2.1 stuff).&lt;/p&gt;
  &lt;h3&gt;Enum Support in ASP.NET MVC Views&lt;/h3&gt;  
&lt;p&gt;Okay, I'll start by creating a Person model class with a Salutation enum:&lt;/p&gt;
  
&lt;pre class="brush: csharp; auto-links: false;"&gt;using System.ComponentModel.DataAnnotations;
namespace StarDotOne.Models
{
    public class Person
    {
        public int Id { get; set; }
        public Salutation Salutation { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
    //I guess technically these are called honorifics
    public enum Salutation
    {
        [Display(Name = "Mr.")]
        Mr,
        [Display(Name = "Mrs.")]
        Mrs,
        [Display(Name = "Ms.")]
        Ms,
        [Display(Name = "Dr.")]
        Doctor,
        [Display(Name = "Prof.")]
        Professor,
        Sir,
        Lady,
        Lord
    }
}&lt;/pre&gt;

&lt;p&gt;Note that I'm using the Display attribute on a few that I want to abbreviate.&lt;/p&gt;

&lt;p&gt;Next, I delete my HomeController and views and scaffold a new HomeController using the Person class. Caution to the wind being our theme, I'll run it.&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-21_00h04_50" href="http://www.flickr.com/photos/36836555@N00/12065201545/" mce_href="http://www.flickr.com/photos/36836555@N00/12065201545/"&gt;&lt;img alt="2014-01-21_00h04_50" src="http://farm6.static.flickr.com/5473/12065201545_26d6e4041f_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5473/12065201545_26d6e4041f_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh no! No dropdown on Salutation!&lt;/p&gt;

&lt;p&gt;Just kidding. That's to be expected. To get the dropdown, we need to change the scaffolded view code for the Salutation from the generic Html.EditorFor to use the new Html.EnumDropDownListFor helper.&lt;/p&gt;

&lt;p&gt;So in my Create.cshtml, I need to change this line:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;@Html.EditorFor(model =&amp;gt; model.Salutation)&lt;/pre&gt;

&lt;p&gt;to this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;@Html.EnumDropDownListFor(model =&amp;gt; model.Salutation)&lt;/pre&gt;

&lt;p&gt;Okay, with that done I'll refresh the page:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-21_00h09_53" href="http://www.flickr.com/photos/36836555@N00/12065544563/" mce_href="http://www.flickr.com/photos/36836555@N00/12065544563/"&gt;&lt;img alt="2014-01-21_00h09_53" src="http://farm6.static.flickr.com/5478/12065544563_b892c5f80e_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5478/12065544563_b892c5f80e_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there it is.&lt;/p&gt;

&lt;p&gt;"Now, Jon," you say, "That's really nice, but it would have been absolutely perfect if the scaffolder or EditorFor or something had seen the Enum property and just done the right thing."&lt;/p&gt;

&lt;p&gt;You're right. I'm told that will all magically work in an update on the way soon. For now, though, it's easy to get that behavior using some simple EditorTemplates and DisplayTemplates. You can find examples of them in this &lt;a href="https://aspnet.codeplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Views/Shared/" mce_href="https://aspnet.codeplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Views/Shared/"&gt;EnumSample on CodePlex&lt;/a&gt;. So I grabbed those templates and copied them into the /Views/Shared directory in my project:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-21_00h18_21" href="http://www.flickr.com/photos/36836555@N00/12065331315/" mce_href="http://www.flickr.com/photos/36836555@N00/12065331315/"&gt;&lt;img alt="2014-01-21_00h18_21" src="http://farm6.static.flickr.com/5482/12065331315_c33f53ec08_b.jpg" border="0" mce_src="http://farm6.static.flickr.com/5482/12065331315_c33f53ec08_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I'll change my Create.cshtml view back how it was originally scaffolded, using Html.EditorFor. That way the view engine will look for a matching EditorTemplate for the object type, find Enum.cshtml, and use that to render all Enum model properties.&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-21_00h51_35" href="http://www.flickr.com/photos/36836555@N00/12065950363/" mce_href="http://www.flickr.com/photos/36836555@N00/12065950363/"&gt;&lt;img alt="2014-01-21_00h51_35" src="http://farm3.static.flickr.com/2847/12065950363_06f7e5be44_b.jpg" border="0" mce_src="http://farm3.static.flickr.com/2847/12065950363_06f7e5be44_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blam!&lt;/p&gt;

&lt;p&gt;Okay, one more fun thing in that EnumSample. There's an override in Html.EditorFor that lets you specify the EditorTemplate you'd like to be used. So I'll change that line to this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;@Html.EditorFor(model =&amp;gt; model.Salutation, templateName: "Enum-radio")&lt;/pre&gt;

&lt;p&gt;And now we are truly dropping science like Galileo dropped the orange:&lt;/p&gt;

&lt;p&gt;&lt;a title="2014-01-21_00h57_41" href="http://www.flickr.com/photos/36836555@N00/12066013263/" mce_href="http://www.flickr.com/photos/36836555@N00/12066013263/"&gt;&lt;img alt="2014-01-21_00h57_41" src="http://farm4.static.flickr.com/3756/12066013263_ca2023f5f6_b.jpg" border="0" mce_src="http://farm4.static.flickr.com/3756/12066013263_ca2023f5f6_b.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recap so far:&lt;/p&gt;

&lt;ul&gt;
  
&lt;li&gt;We updated to the new NuGet packages &lt;/li&gt;

  
&lt;li&gt;We saw that we can now use a new helper to render dropdowns for enums: Html.EnumDropDownListFor &lt;/li&gt;

  
&lt;li&gt;We saw that we can use EditorTemplates (and, trust me, DisplayTemplates as well) to encapsulate that so any call to Html.EditorFor will intelligently display enum properties &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the next post in the series: &lt;a title="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx" mce_href="http://weblogs.asp.net/jgalloway/archive/2014/01/24/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-2-attribute-routing-with-custom-constraints.aspx"&gt;Looking at ASP.NET MVC 5.1 and Web API 2.1 - Part 2 - Attribute Routing with Custom Constraints&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Tue, 21 Jan 2014 22:44:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums</guid></item><item><title>ASP.NET - A last look back at 2013, looking ahead to 2014</title><link>https://weblogs.asp.net:443/jongalloway/asp-net-a-last-look-back-at-2013-looking-ahead-to-2014</link><description>&lt;p&gt;There's something about getting into a new year that makes us step back and consider the bigger picture. Where is it all headed? Am I making the most out of my life? What web tools and products has Microsoft released lately?&lt;/p&gt;  &lt;p&gt;I got to present a few Web Camps in December, in Oslo and Vancouver. I was reminded that there are some people - we'll call them normal developers who have work to do - don't sit there refreshing the Microsoft downloads new releases page all day. I don't understand them, but I appreciate that they exist. &lt;/p&gt;  &lt;p&gt;We announce stuff all the time, but it's hard to keep up with what's important, what you need to know, and stuff you should start paying attention to because it's going to be a big deal really soon. So here's my quick summary of the important things that happened in 2013 and what I think it suggests we watch for in 2014.&lt;/p&gt;  &lt;h2&gt;The Big Picture&lt;/h2&gt;  &lt;h3&gt;One ASP.NET&lt;/h3&gt;  &lt;p&gt;This has been a thing for brewing for a bit, but really came together in 2013. With Visual Studio 2013, you really can mix and match ASP.NET MVC + Web API + Web Forms + SignalR + &amp;quot;your framework here&amp;quot; and they all get along. This has been a lot of work over several releases: breaking out functionality out into packages, setting up common components like routing and identity so they're universal, moving to common HTML and CSS for the project templates, Visual Studio tooling changes, etc. That all culminated with the Visual Studio 2013 release, where we finally have just one ASP.NET project with a la carte support for Web Forms, MVC, Web API, and more. &lt;/p&gt;  &lt;p&gt;What's probably more important is that you can also add functionality after you've created a project, so if you decide later to add MVC libraries to your Web Forms project it's no big deal.&lt;/p&gt;  &lt;h3&gt;Visual Studio as a great editor for front-end (HTML / CSS / JavaScript) files&lt;/h3&gt;  &lt;p&gt;Again, this one has been growing over time: Visual Studio 2012 introduced new JavaScript and CSS editors. The &lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/whats-new#_Toc318097407"&gt;JavaScript editor added tons of new features&lt;/a&gt; like ECMAScript 5 support, code outlining, brace matching, go to definition, dynamic IntelliSense. The &lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/whats-new#_Toc318097415"&gt;CSS editor added&lt;/a&gt; things like much better IntelliSense, color picker, snippets, lots of HTML5 / modern web development support. It also included Page Inspector - a built-in browser view that shows a running view of your site (e.g. live data from the database, JavaScript is evaluated, everything's running end to end) and allows you to click on an an element and find the line of code that produced the HTML. But the HTML editor in Visual Studio 2012 was old, and that prevented adding modern web development features.&lt;/p&gt;  &lt;p&gt;In Visual Studio 2013, the HTML editor was completely rewritten to allow for the cool (MEF based) extensibility that the CSS editor in Visual Studio 2012 leveraged so heavily. That allowed for new support for all kinds of new modern features like IntelliSense for AngularJS, built-in CoffeeScript and LESS editor support and more. The HTML editor features in Visual Studio 2013 get even better with the Web Essentials extension, which I'll talk about in a minute.&lt;/p&gt;  &lt;p&gt;And we haven't even mentioned Browser Link yet! Browser Link takes the smarts that went into Page Inspector, hooks it up with a real-time Web Socket connection (powered by SignalR) that's hosted inside of Visual Studio, and gives me real-time, two-way interactivity between my server-side code and any running browser. That means I can run my site in Visual Studio, pop open Chrome or Opera or Firefox or IE or some mobile emulator, hover over an element in the browser and see the source of that HTML highlighted in Visual Studio. That is a huge, huge timesaver I've been wanting for a very long time.&lt;/p&gt;  &lt;p&gt;The point is that Visual Studio 2013 ships with newly rewritten, advanced editors for your front-end web files. Like me, you may have seen Visual Studio as an editor for back-end code but went to a lightweight notepad style text editor for HTML / CSS / JavaScript / modern web language of the week. But I think it's time to change that way of thinking - Visual Studio gives me the benefits of a lightweight editor (starts up in 2-3 seconds on a modern computer, has a light UI that gets out of my way), but helps me spot misspellings, get the right vendor prefixes, use JavaScript libraries without having to dig through source code and docs more than I want to, etc.&lt;/p&gt;  &lt;h3&gt;Web Essentials as &amp;quot;Visual Studio web dev labs&amp;quot;&lt;/h3&gt;  &lt;p&gt;Web Essentials is a side project run by Mads Kristensen, the project manager for the web developer features that ship with Visual Studio. While Visual Studio's new ship schedule means you get a new version yearly and updates several times throughout the year, Web Essentials ships as often as Mads wants to. Which turns out to be &lt;a href="http://vswebessentials.com/changelog"&gt;pretty often&lt;/a&gt; - often every two or three weeks.&lt;/p&gt;  &lt;p&gt;Some features in Web Essentials are prototypes which might land in the next version of Visual Studio - an example is the Paste JSON as Classes feature. This allows you to get your hands on them right away, give feedback on how they work, and then see them graduate to full Visual Studio support.&lt;/p&gt;  &lt;p&gt;Web Essentials also includes some interesting features which are useful to web developers who are engaged enough to spend a minute to install and extension, but might not be for everyone. Zen Coding might be an example of that - I don't know if it'll ever ship in Visual Studio, but it's a useful feature if you're an HTML focused web developer and into the new, new stuff. Since web development techniques and metalanguages come out so frequently and change so rapidly, it's great to have a lightweight extension that can keep up with them until they're mature enough to maybe ship with Visual Studio.&lt;/p&gt;  &lt;h3&gt;Release and update speed&lt;/h3&gt;  &lt;p&gt;When Visual Studio 2012 was launched in September 2012, Soma announced that they were shifting to a faster release cadence which would include both more frequent full releases and regular smaller updates to deliver features throughout the year. An important point there is that these aren't just service packs with bug fixes, they include useful features. We really saw that come together in 2013. The best example of that was the ASP.NET and Web Tools 2012.2 release in February 2013. I list some of the features below, but it was a pretty big batch: new templates for both ASP.NET Web Forms and MVC, Page Inspector and more. As of now, there have been a total of 5 updates for Visual Studio 2012; &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/11/18/announcing-release-of-asp-net-and-web-tools-2013-1-for-visual-studio-2012.aspx"&gt;the latest added some support for ASP.NET MVC 5 (albeit only with an empty MVC 5 template) to Visual Studio 2012&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I think that's a great thing. The technologies, browsers and languages we need to work with as web developers move really quickly, and we need tools that keep up. Two or three years between releases doesn't work for me, and even yearly is pushing it. I expect to see this update cycle continue in 2014 and beyond. For instance, we've already got the &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/12/09/asp-net-and-web-tools-2013-2-preview-for-visual-studio-2013.aspx"&gt;release candidates for ASP.NET MVC 5.1, Web API 2.1 and Web Pages 3.1&lt;/a&gt; - expect the final release very soon. [Update: the final version was released on January 20, read my &lt;a href="http://weblogs.asp.net/jgalloway/archive/2014/01/21/looking-at-asp-net-mvc-5-1-and-web-api-2-1-part-1-overview-and-enums.aspx"&gt;post series on the new features here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: In case you didn't know - if you've got Visual Studio 2012 Professional, you can &lt;/em&gt;&lt;a href="http://www.microsoftstore.com/store/msusa/en_US/pdp/Visual-Studio-Professional-2013/productID.284832200"&gt;&lt;em&gt;upgrade to Visual Studio 2013 Professional for $99 now&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Again, thinking beyond Visual Studio, the rest of the ASP.NET dev landscape is moving very quickly. &lt;a href="http://weblogs.asp.net/scottgu/default.aspx"&gt;Windows Azure has releases roughly every three weeks&lt;/a&gt;. &lt;a href="http://vswebessentials.com/"&gt;Web Essentials&lt;/a&gt; and &lt;a href="http://sidewaffle.com/"&gt;SideWaffle&lt;/a&gt; have release updates measured in weeks. &lt;a href="https://twitter.com/nugetlatest"&gt;NuGet packages update constantly&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Do you have to keep up to date with all of the new things? No, of course not. But since web development technologies and requirements move rapidly, it's good to know that you're generally not going to be waiting on Visual Studio or ASP.NET when you do need the features. And of course, there are lots of benefits (in addition to the big flashy new features) to being on the newest version, e.g. scaffolding in ASP.NET MVC now whitelists your parameters to prevent overposting.&lt;/p&gt;  &lt;h3&gt;Externalization of ASP.NET&lt;/h3&gt;  &lt;p&gt;ASP.NET used to be pretty monolithic. You'd get one big ASP.NET release and it did everything. You could plug into it - using things like control events, membership provider hooks, modules and handlers, but you were just plugging into the big ASP.NET thing.&lt;/p&gt;  &lt;p&gt;That's really changed over the years.&lt;/p&gt;  &lt;p&gt;When you look at what's installed in a new ASP.NET project, it's almost all NuGet packages. That's a big part of what made it possible for the One ASP.NET thing to happen: ASP.NET MVC, Web Forms, Web API, and Web Pages all share common NuGet packages. That definitely includes new features, like the new &lt;a href="http://asp.net/identity"&gt;ASP.NET Identity&lt;/a&gt; system.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Side note: You can use these packages individually, or even create your own versions (since they're a permissive &lt;/em&gt;&lt;a href="http://aspnetwebstack.codeplex.com/"&gt;&lt;em&gt;under open source license&lt;/em&gt;&lt;/a&gt;&lt;em&gt;). You can grab &lt;/em&gt;&lt;a href="http://aspnetwebstack.codeplex.com/wikipage?title=Use%20Nightly%20Builds"&gt;&lt;em&gt;nightly builds&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and which include &lt;/em&gt;&lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/list/changesets"&gt;&lt;em&gt;changes as they're committed&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The tooling (Microsoftese, generally meaning &amp;quot;Visual Studio support&amp;quot;) for ASP.NET has also been externalized over the past few years. If you poke around in the Visual Studio program directory (e.g. \Common7\IDE\Extensions\Microsoft\Web Tools), you'll see features are being built using the standard VSIX / MEF extensibility points. That's good because it means things can ship and update more quickly, and the hooks they're using are available to you. Heck, the source is even available to you if you pop them open in a tool like ILSpy or Reflector.&lt;/p&gt;  &lt;p&gt;Things are also being built using OWIN (Open Web Interfaces for .NET) now. I've written before about &lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/05/30/getting-up-to-speed-with-katana.aspx"&gt;why I think OWIN and Katana are important&lt;/a&gt;. The result is that core functionality like authentication is now being plugged into ASP.NET as portable middleware rather than shipped in a big monolithic framework that hides somewhere in your GAC.&lt;/p&gt;  &lt;p&gt;Oh, and &lt;a href="http://sidewaffle.com/"&gt;SideWaffle&lt;/a&gt;. What on earth is a SideWaffle?!? Well, just like NuGet externalized ASP.NET dependencies and VSIX externalized tooling, SideWaffle externalizes templates. The idea is that, unlike waiting for new ASP.NET project templates in Visual Studio releases or updates, you install the SideWaffle extension and get (or contribute) Visual Studio templates that are updated more rapidly.&lt;/p&gt;  &lt;h2&gt;Releases&lt;/h2&gt;  &lt;p&gt;I've already talked about what these release mean in a big picture sense, so I'll just list them out in linked bullet point form.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw"&gt;ASP.NET and Web Tools 2012.2 (Feb 2013, included with Visual Studio Update 2)&lt;/a&gt;&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Here's my announcement blog post with more details: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/02/18/announcing-the-asp-net-and-web-tools-2012-2-release.aspx"&gt;Announcing the ASP.NET and Web Tools 2012.2 Release!&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Some top features:      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw#_Templates"&gt;Template updates for ASP.NET MVC 4 (SPA, Facebook)&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw#_ASP.NET_Web_API"&gt;ASP.NET Web API updates (Help Page, Tracing, OData)&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw#_ASP.NET_Friendly_URLs"&gt;ASP.NET Web Forms updates to include Friendly URLs&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw#_Tooling"&gt;Web Tools (Page Inspector updates, IntelliSense, Publishing)&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes-rtw#_ASP.NET_SignalR"&gt;ASP.NET SignalR (this was the first time SignalR shipped with a Visual Studio release)&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/10/17/top-things-web-developers-should-know-about-the-visual-studio-2013-release.aspx"&gt;Visual Studio 2013 (Oct 2013)&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;ASP.NET Core Features (new &lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC8"&gt;ASP.NET Identity&lt;/a&gt; system, common templates using Bootstrap, &lt;a href="http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview"&gt;new Scaffolding system&lt;/a&gt;) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC10"&gt;ASP.NET MVC 5&lt;/a&gt; (One ASP.NET so it works in all ASP.NET projects, attribute&amp;#160; routing) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC11"&gt;ASP.NET Web API 2&lt;/a&gt; (Attribute routing, OAuth 2, CORS, Portable client, OWIN integration, lots more) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC13"&gt;SignalR 2&lt;/a&gt; (OWIN and cross platform / portable support, cross domain support, lots more) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms171868.aspx#v451"&gt;.NET 4.5.1&lt;/a&gt; (ASP.NET impact is mostly performance improvements, e.g. &lt;a href="http://blogs.msdn.com/b/dotnet/archive/2013/10/09/asp-net-app-suspend-responsive-shared-net-web-hosting.aspx"&gt;App Suspend&lt;/a&gt;) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/using-browser-link"&gt;Brower Link&lt;/a&gt; (and &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/11/18/browser-link-apis-in-visual-studio-2013-rtm.aspx"&gt;Browser Link Extension support&lt;/a&gt;) &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/11/18/announcing-release-of-asp-net-and-web-tools-2013-1-for-visual-studio-2012.aspx"&gt;ASP.NET and Web Tools 2013.1 for Visual Studio 2012&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Release Post: &lt;a title="http://www.asp.net/visual-studio/overview/2012/aspnet-and-web-tools-20131-for-visual-studio-2012" href="http://blogs.msdn.com/b/webdev/archive/2013/11/18/announcing-release-of-asp-net-and-web-tools-2013-1-for-visual-studio-2012.aspx"&gt;Announcing release of ASP.NET and Web Tools 2013.1 for Visual Studio 2012&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Features      &lt;ul&gt;       &lt;li&gt;Round trip support between Visual Studio 2012 and 2013 &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC10"&gt;ASP.NET MVC 5 support&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC11"&gt;ASP.NET Web API 2 support&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;ASP.NET Scaffolding (brings the new scaffolding system in to Visual Studio 2012) &lt;/li&gt;        &lt;li&gt;Bootstrap support &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Windows Azure updates&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tons of releases throughout the year, but here are some of what I think are the top features for ASP.NET developers:      &lt;ul&gt;       &lt;li&gt;Remote debugging (was in Web Roles, now it's available in Windows Azure Web Sites) &lt;/li&gt;        &lt;li&gt;Create and publish to Windows Azure Web Sites from Visual Studio &lt;/li&gt;        &lt;li&gt;Right-click on VM, RDP &lt;/li&gt;        &lt;li&gt;MDSN benefits / price cuts / run VS in cloud (also VS Online) &lt;/li&gt;        &lt;li&gt;Web Socket support &lt;/li&gt;        &lt;li&gt;Windows Server 2012 R2 &lt;/li&gt;        &lt;li&gt;General Availability (Web Sites, Mobile Services, IAAS) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://vswebessentials.com/changelog"&gt;Web Essentials&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sidewaffle.com/"&gt;Side Waffle&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;NuGet&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There were lots throughout the year, but I think the main feature for web developers was that Package Restore is enabled by default in NuGet 2.7 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Portable class libraries&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;This is a big step forward for portable libraries - both community open source libraries and Microsoft provided libraries - to work cross platform &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;New Stuff That You Really Need To Understand&lt;/h2&gt;  &lt;h3&gt;&lt;a href="http://asp.net/identity"&gt;ASP.NET Identity&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;We had an old ASP.NET Membership system that worked for a while, but was definitely showing its age. It didn't support claims and social authentication, it didn't work well with custom membership data, it was hard to extend. Then we got Simple Membership in ASP.NET MVC 4, which was simple but hard to extend. A lot of work went into the new Identity system to make sure it both did simple things well and was wasn't hard to extend later.&lt;/p&gt;  &lt;p&gt;There's a lot of documentation out there on the new Identity system, and more on the way at &lt;a title="http://www.asp.net/identity" href="http://www.asp.net/identity"&gt;http://www.asp.net/identity&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also, I recommend K. Scott Allen's recent posts exploring ASP.NET Identity, such as&amp;#160; &lt;a href="http://odetocode.com/blogs/scott/archive/2014/01/09/customization-options-with-asp-net-identity.aspx"&gt;Customization Options With ASP.NET Identity&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;All of the new web project templates are built using Bootstrap. I &lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/10/17/top-things-web-developers-should-know-about-the-visual-studio-2013-release.aspx"&gt;overviewed that a little in a previous post&lt;/a&gt;, but there's a lot more to it. The top benefits I see are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It's popular across the web development community, so we're able to take advantage of community support for things like themes, documentation, tutorials, etc. &lt;/li&gt;    &lt;li&gt;It's responsive and mobile-first, so it's very easy to build sites that work well at narrow (mobile) screen resolutions, intermediate screen resolutions like tablets, and on widescreen displays &lt;/li&gt;    &lt;li&gt;It's got a lot of components and jQuery based plugins that handle common web developer concerns &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Other Neat Stuff That You Should Start Paying Attention To&lt;/h2&gt;  &lt;h3&gt;Scaffolding&lt;/h3&gt;  &lt;p&gt;We've had scaffolding in ASP.NET before, but it was framework specific - there was MVC scaffolding, Web API scaffolding, and nothing else if you were working on another project type. The scaffolding system in Visual Studio 2013 (and now available in 2012, as mentioned above) has been updated so it works in any ASP.NET project, and it's been built to be easily extensible (the extensibility bit will be shipped and documented in a Visual Studio update early this year).&lt;/p&gt;  &lt;p&gt;Some good references:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview"&gt;ASP.NET Scaffolding overview on the ASP.NET site&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/12/26/how-to-customize-the-generated-files-from-the-new-scaffolded-item-dialog.aspx"&gt;How to customize the generated files from the New Scaffolded Item dialog&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/12/09/asp-net-and-web-tools-2013-2-preview-for-visual-studio-2013.aspx"&gt;ASP.NET MVC 5.1, Web API 2.1 and Web Pages 3.1&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The release candidates have already shipped and the final release will be out very extremely soon. Some of the new features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ASP.NET MVC 5.1      &lt;ul&gt;       &lt;li&gt;Attribute Routing support for constraints &lt;/li&gt;        &lt;li&gt;Bootstrap support for HTML helpers (allowing HTML attributes in Html.EditorFor) &lt;/li&gt;        &lt;li&gt;Support for Enums &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;ASP.NET Web API 2.1      &lt;ul&gt;       &lt;li&gt;Global Error Handling &lt;/li&gt;        &lt;li&gt;Attribute Routing support for constraints &lt;/li&gt;        &lt;li&gt;BSON media type formatter &lt;/li&gt;        &lt;li&gt;Async filters &lt;/li&gt;        &lt;li&gt;Help Page improvements &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;OWIN and Katana&lt;/h3&gt;  &lt;p&gt;I mentioned these earlier. If you've been putting this on your &amp;quot;I'll ignore this until it starts getting important&amp;quot; list, it's time. The new Identity system is wired into the ASP.NET project templates using OWIN, and new things will be moving that direction.&lt;/p&gt;  &lt;h3&gt;Visual Studio Online&lt;/h3&gt;  &lt;p&gt;I think Visual Studio Online - including the Monaco editor - is getting pretty interesting. It's definitely useful for web developers. See my post here: &lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/11/13/a-quick-look-at-the-new-visual-studio-online-quot-monaco-quot-code-editor.aspx"&gt;A look at the new Visual Studio Online &amp;quot;Monaco&amp;quot; code editor&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Node Tools for Visual Studio&lt;/h3&gt;  &lt;p&gt;Node (and NPM) are getting to be pretty big in the web development world, and I think it's important to keep up with where it's going. It hasn't been that hard: Node's pretty lightweight, runs well on Windows for a while now, and is incredibly easy to run in Windows Azure Web Sites. But, it's gotten incredibly easy now that they've built pretty impressive support for Node.js into Visual Studio. I think it's worth taking some time and getting a little familiarity with Node.js if you haven't yet. Don't get me wrong, I'm in no way pushing Node.js over ASP.NET development, I'm just saying that I personally think it's a good idea to keep up with as a professional web developer.&lt;/p&gt;  &lt;p&gt;See Scott Hanselman's post (&lt;a href="http://www.hanselman.com/blog/IntroducingNodejsToolsForVisualStudio.aspx"&gt;Introducing node.js Tools for Visual Studio&lt;/a&gt;) and give it a look.&lt;/p&gt;  &lt;h2&gt;Keeping Up With The New Stuff&lt;/h2&gt;  &lt;p&gt;That's a condensed list of what I think's important circa January 2014, and it's a lot. How on earth can we keep up with all of this?&lt;/p&gt;  &lt;p&gt;Here are some resources I recommend:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ASP.NET social accounts      &lt;ul&gt;       &lt;li&gt;Twitter: &lt;a href="https://twitter.com/aspnet"&gt;@aspnet&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;Facebook: &lt;a href="http://fb.me/aspnet"&gt;http://fb.me/aspnet&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="https://plus.google.com/communities/115589658993141493462"&gt;Google+&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;The ASP.NET Community Spotlight (home page of the ASP.NET site) &lt;/li&gt;    &lt;li&gt;The /vnext section on ASP.NET, currently spotlighting Visual Studio 2013: &lt;a href="http://asp.net/vnext"&gt;http://asp.net/vnext&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Web Camps      &lt;ul&gt;       &lt;li&gt;Look for &lt;a href="http://www.devcamps.ms/web"&gt;live events&lt;/a&gt; in your area &lt;/li&gt;        &lt;li&gt;Download the &lt;a href="http://aka.ms/webcamps-training-kit"&gt;Web Camps Training Kit&lt;/a&gt; for 30mb of demos explaining all the new features &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/Shows/Web+Camps+TV"&gt;Web Camps TV&lt;/a&gt; with Cory Fowler and Jaffe Worley &lt;/li&gt;    &lt;li&gt;Windows Azure shows      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://channel9.msdn.com/Shows/Cloud+Cover"&gt;Cloud Cover&lt;/a&gt; with Nick Harris and Chris Risner &lt;/li&gt;        &lt;li&gt;&lt;a href="http://friday.azure.com/"&gt;Windows Azure Friday&lt;/a&gt; (with Scott Hanselman) is a great resource for Windows Azure content &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/webdev/"&gt;Web Dev blog&lt;/a&gt;       &lt;ul&gt;       &lt;li&gt;This is THE blog for the Web Dev team at Microsoft - lots of great content, release announcements, etc. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All right! Go to it! &lt;a href="https://www.youtube.com/watch?v=LkCNJRfSZBU"&gt;Let's do this&lt;/a&gt;!&lt;/p&gt;</description><pubDate>Sat, 18 Jan 2014 00:07:13 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/asp-net-a-last-look-back-at-2013-looking-ahead-to-2014</guid></item><item><title>Two great Kickstarter projects ending soon: Durandal JavaScript framework and bitCommander File Manager</title><link>https://weblogs.asp.net:443/jongalloway/two-great-kickstarter-projects-ending-soon-durandal-javascript-framework-and-bitcommander-file-manager</link><description>&lt;p&gt;I like Kickstarter. It's not a store, it's an easy way to help fund creative projects. You back projects you find exciting at different reward levels, and then follow along with the project's progress. I blogged about the &lt;a href="http://weblogs.asp.net/jgalloway/archive/2013/06/19/last-chance-to-back-the-agent-watch-kickatarter-first-chance-to-play-with-the-code-bonus-extra-credit-custom-device-emulator-with-screen-scaling.aspx"&gt;AGENT watch last June&lt;/a&gt; and was excited to see them hit 10x their goal - I'm really looking forward to getting my AGENT watch when they ship.&lt;/p&gt;  &lt;p&gt;Preemptive disclaimer: As I said, it's not a store. You're funding a project with goals and risks and target timelines. The average contribution amounts aren't that high and I fund projects that I want to support, so I'm okay with that. If you're not, Kickstarter's not your thing, and that's fine too.&lt;/p&gt;  &lt;p&gt;I wanted to help get the word out about two recent Kickstarter projects I've backed (and been tweeting about): &lt;a href="http://www.kickstarter.com/projects/eisenbergeffect/durandal-2014"&gt;Durandal&lt;/a&gt; and &lt;a href="http://www.kickstarter.com/projects/953554185/bitcommander"&gt;bitCommander&lt;/a&gt;. Both end soon (bitCommander ends on Jan 9, Durandal ends on Jan 10).&lt;/p&gt;  &lt;h2&gt;Durandal&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://durandaljs.com/"&gt;Durandal&lt;/a&gt; is an open source JavaScript framework that helps you build full-featured single page applications. &lt;a href="http://neverindoubtnet.blogspot.com/2014/01/hooray-for-durandal-nextgen.html"&gt;Ward Bell summed up what's unique about Durandal pretty well&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;What’s so great about it? What’s distinctive about it? &lt;a href="http://www.kickstarter.com/projects/eisenbergeffect/durandal-2014/posts/703625"&gt;Rob has his inventory&lt;/a&gt; of laudable features (and its impressive). Here are some of the aspects of nextGen Durandal that I love … and that have no equal among alternative frameworks:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;Convention over configuration&lt;/strong&gt; – I hate writing and maintaining “switch board” code to connect FooViewModel to FooView and FooRoute etc. I want to say “Foo” and be done with it … until and unless I have a compelling reason to break convention. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Customizable conventions&lt;/strong&gt; – Rob makes good choices but I’m free to define my own. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Page life-cycle&lt;/strong&gt; – Durandal has baked in understanding of the birth and death of “pages” so I don’t have to make up my own hacks to ensure that new pages are initialized on creation and cleaned up on destruction. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Asynchrony throughout&lt;/strong&gt; – Need to wait for the user to confirm or cancel before moving off the page? That’s easy in Durandal because asynchrony is plumbed through the page life-cycle and everywhere else. Dynamically load optional modules on-demand? Easy. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Diagnostics&lt;/strong&gt; – With debug mode turned on the console tells me exactly what choices Durandal is making for me as they happen. I can tap into that logging pipeline with my own diagnostics. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Write less, do more&lt;/strong&gt; – You all know what I mean. We all want to write less code. That’s the motherhood and apple pie that every framework promises. They usually deliver something else. Check out the &lt;a href="http://vimeo.com/82601948"&gt;nextGen Durandal sample video&lt;/a&gt; and tell me what other technology is that clear and concise. &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;We talked to Rob Eisenberg about what he wants to accomplish on the Durandal Kickstarter on Herding Code: &lt;a href="http://herdingcode.com/herding-code-182-durandal-kickstarter-with-rob-eisenberg/"&gt;Herding Code 182: Durandal Kickstarter with Rob Eisenberg&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Download / Listen:&lt;/p&gt; &lt;audio controls&gt; &lt;source src="http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3" type="audio/mpeg"&gt; &lt;a href="http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3"&gt;http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3&lt;/a&gt; &lt;/audio&gt; &lt;/p&gt;  &lt;p&gt;One of the things that really stood out for me was what Rob's doing with cutting edge browser and JavaScript technologies for the Durandal nextGen. He's investing heavily in a module system that works with ES6 modules, AMD and CommonJS. He's building on HTML Templates and Web Components. In addition to light weight, modular code, he's seeing 2-3x performance benefits over AngularJS. And it's all polyfilled so it works in current browsers while waiting for these features to ship. The result is that this is a great investment not only in a great next-generation SPA framework, but in the web in general: by backing Rob, you're getting real-world implementation of these specs early so we can get them right the first time.&lt;/p&gt;  &lt;p&gt;The main benefit of backing this Kickstarter is that you free Rob up from consulting work so Durandal gets these amazing features faster. The secondary benefit for backers is that Rob will be producing some great training series - video and source code included.&lt;/p&gt;  &lt;p&gt;As of now, there's still a good way to go on getting this funded. Pitch in and tell someone else to do so, too!&lt;/p&gt;  &lt;h2&gt;bitCommander&lt;/h2&gt;  &lt;p&gt;bitCommander is a really interesting file manager for Windows. It's already hit its funding goal as I write this. If you beat the end of the Kickstarter campaign, you can get a discount on it, and if not you'll want to pay the full price for it because this thing is looking really cool. &lt;/p&gt;  &lt;p&gt;I like the recent changes to the Windows File Explorer in Windows 8 - the ribbon's really nice, and the file copy experience is vastly improved, for instance. But when you're doing things that involve multiple simultaneous views - like assembling a lot of files, for instance - having several instances of File Explorer open gets clunky.&lt;/p&gt;  &lt;p&gt;Check out how browsing in bitCommander looks (all images below from the &lt;a href="http://bit-commander.com/"&gt;bitCommander website&lt;/a&gt;): &lt;/p&gt;  &lt;p&gt;&lt;a title="2014-01-08_13h36_32" href="http://www.flickr.com/photos/36836555@N00/11843915706/"&gt;&lt;img border="0" alt="2014-01-08_13h36_32" src="http://farm6.static.flickr.com/5486/11843915706_d2ec789ccc_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You might think it's just &lt;a href="http://en.wikipedia.org/wiki/Miller_Columns"&gt;Miller columns&lt;/a&gt; (recently popularized as the OS X Finder columns view mode, but dates all the way back to 1980). That alone would be pretty nice, but there's a lot more to it. There are tons of other great features, but I think my favorite is the temp list and batch support.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://bit-commander.com/GIF/bitcommander-batch2.gif" /&gt;&lt;/p&gt;  &lt;p&gt;There's a lot of other cool stuff, like tabs, nice thumbnail display (with details), intelligent filename shortening and more. I think what I like most about this is that it adds a lot of features but keep the design simple and focused. See what I mean on the &lt;a href="http://bit-commander.com/"&gt;bitCommander website&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Here's mockup of a possible additional feature that Milos is looking at adding: integrated command windows, sync'd to the current browsing directory:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://bit-commander.com/Mockup-CommandLine.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Un-disclaimer: I backed both of these projects and don't get anything for talking about them. I just like them.&lt;/p&gt;  &lt;p&gt;Go back &lt;a href="http://www.kickstarter.com/projects/953554185/bitcommander"&gt;bitCommander&lt;/a&gt; and &lt;a href="http://www.kickstarter.com/projects/eisenbergeffect/durandal-2014"&gt;Durandal&lt;/a&gt;!&lt;/p&gt;</description><pubDate>Wed, 08 Jan 2014 22:01:12 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/two-great-kickstarter-projects-ending-soon-durandal-javascript-framework-and-bitcommander-file-manager</guid><category>Browsers - Web Development</category><category>Tools</category><enclosure length="20303638" type="audio/mpeg" url="http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>I like Kickstarter. It's not a store, it's an easy way to help fund creative projects. You back projects you find exciting at different reward levels, and then follow along with the project's progress. I blogged about the AGENT watch last June and was excited to see them hit 10x their goal - I'm really looking forward to getting my AGENT watch when they ship. Preemptive disclaimer: As I said, it's not a store. You're funding a project with goals and risks and target timelines. The average contribution amounts aren't that high and I fund projects that I want to support, so I'm okay with that. If you're not, Kickstarter's not your thing, and that's fine too. I wanted to help get the word out about two recent Kickstarter projects I've backed (and been tweeting about): Durandal and bitCommander. Both end soon (bitCommander ends on Jan 9, Durandal ends on Jan 10). Durandal Durandal is an open source JavaScript framework that helps you build full-featured single page applications. Ward Bell summed up what's unique about Durandal pretty well: What’s so great about it? What’s distinctive about it? Rob has his inventory of laudable features (and its impressive). Here are some of the aspects of nextGen Durandal that I love … and that have no equal among alternative frameworks: Convention over configuration – I hate writing and maintaining “switch board” code to connect FooViewModel to FooView and FooRoute etc. I want to say “Foo” and be done with it … until and unless I have a compelling reason to break convention. Customizable conventions – Rob makes good choices but I’m free to define my own. Page life-cycle – Durandal has baked in understanding of the birth and death of “pages” so I don’t have to make up my own hacks to ensure that new pages are initialized on creation and cleaned up on destruction. Asynchrony throughout – Need to wait for the user to confirm or cancel before moving off the page? That’s easy in Durandal because asynchrony is plumbed through the page life-cycle and everywhere else. Dynamically load optional modules on-demand? Easy. Diagnostics – With debug mode turned on the console tells me exactly what choices Durandal is making for me as they happen. I can tap into that logging pipeline with my own diagnostics. Write less, do more – You all know what I mean. We all want to write less code. That’s the motherhood and apple pie that every framework promises. They usually deliver something else. Check out the nextGen Durandal sample video and tell me what other technology is that clear and concise. We talked to Rob Eisenberg about what he wants to accomplish on the Durandal Kickstarter on Herding Code: Herding Code 182: Durandal Kickstarter with Rob Eisenberg Download / Listen: http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3 One of the things that really stood out for me was what Rob's doing with cutting edge browser and JavaScript technologies for the Durandal nextGen. He's investing heavily in a module system that works with ES6 modules, AMD and CommonJS. He's building on HTML Templates and Web Components. In addition to light weight, modular code, he's seeing 2-3x performance benefits over AngularJS. And it's all polyfilled so it works in current browsers while waiting for these features to ship. The result is that this is a great investment not only in a great next-generation SPA framework, but in the web in general: by backing Rob, you're getting real-world implementation of these specs early so we can get them right the first time. The main benefit of backing this Kickstarter is that you free Rob up from consulting work so Durandal gets these amazing features faster. The secondary benefit for backers is that Rob will be producing some great training series - video and source code included. As of now, there's still a good way to go on getting this funded. Pitch in and tell someone else to do so, too! bitCommander bitCommander is a really interesting file manager for Windows. It's already hit its funding goal as I write this. If you beat the end of the Kickstarter campaign, you can get a discount on it, and if not you'll want to pay the full price for it because this thing is looking really cool. I like the recent changes to the Windows File Explorer in Windows 8 - the ribbon's really nice, and the file copy experience is vastly improved, for instance. But when you're doing things that involve multiple simultaneous views - like assembling a lot of files, for instance - having several instances of File Explorer open gets clunky. Check out how browsing in bitCommander looks (all images below from the bitCommander website): You might think it's just Miller columns (recently popularized as the OS X Finder columns view mode, but dates all the way back to 1980). That alone would be pretty nice, but there's a lot more to it. There are tons of other great features, but I think my favorite is the temp list and batch support. There's a lot of other cool stuff, like tabs, nice thumbnail display (with details), intelligent filename shortening and more. I think what I like most about this is that it adds a lot of features but keep the design simple and focused. See what I mean on the bitCommander website. Here's mockup of a possible additional feature that Milos is looking at adding: integrated command windows, sync'd to the current browsing directory: Un-disclaimer: I backed both of these projects and don't get anything for talking about them. I just like them. Go back bitCommander and Durandal!</itunes:subtitle><itunes:summary>I like Kickstarter. It's not a store, it's an easy way to help fund creative projects. You back projects you find exciting at different reward levels, and then follow along with the project's progress. I blogged about the AGENT watch last June and was excited to see them hit 10x their goal - I'm really looking forward to getting my AGENT watch when they ship. Preemptive disclaimer: As I said, it's not a store. You're funding a project with goals and risks and target timelines. The average contribution amounts aren't that high and I fund projects that I want to support, so I'm okay with that. If you're not, Kickstarter's not your thing, and that's fine too. I wanted to help get the word out about two recent Kickstarter projects I've backed (and been tweeting about): Durandal and bitCommander. Both end soon (bitCommander ends on Jan 9, Durandal ends on Jan 10). Durandal Durandal is an open source JavaScript framework that helps you build full-featured single page applications. Ward Bell summed up what's unique about Durandal pretty well: What’s so great about it? What’s distinctive about it? Rob has his inventory of laudable features (and its impressive). Here are some of the aspects of nextGen Durandal that I love … and that have no equal among alternative frameworks: Convention over configuration – I hate writing and maintaining “switch board” code to connect FooViewModel to FooView and FooRoute etc. I want to say “Foo” and be done with it … until and unless I have a compelling reason to break convention. Customizable conventions – Rob makes good choices but I’m free to define my own. Page life-cycle – Durandal has baked in understanding of the birth and death of “pages” so I don’t have to make up my own hacks to ensure that new pages are initialized on creation and cleaned up on destruction. Asynchrony throughout – Need to wait for the user to confirm or cancel before moving off the page? That’s easy in Durandal because asynchrony is plumbed through the page life-cycle and everywhere else. Dynamically load optional modules on-demand? Easy. Diagnostics – With debug mode turned on the console tells me exactly what choices Durandal is making for me as they happen. I can tap into that logging pipeline with my own diagnostics. Write less, do more – You all know what I mean. We all want to write less code. That’s the motherhood and apple pie that every framework promises. They usually deliver something else. Check out the nextGen Durandal sample video and tell me what other technology is that clear and concise. We talked to Rob Eisenberg about what he wants to accomplish on the Durandal Kickstarter on Herding Code: Herding Code 182: Durandal Kickstarter with Rob Eisenberg Download / Listen: http://herdingcode.com/wp-content/uploads/HerdingCode-0182-Durandal-Kickstarter.mp3 One of the things that really stood out for me was what Rob's doing with cutting edge browser and JavaScript technologies for the Durandal nextGen. He's investing heavily in a module system that works with ES6 modules, AMD and CommonJS. He's building on HTML Templates and Web Components. In addition to light weight, modular code, he's seeing 2-3x performance benefits over AngularJS. And it's all polyfilled so it works in current browsers while waiting for these features to ship. The result is that this is a great investment not only in a great next-generation SPA framework, but in the web in general: by backing Rob, you're getting real-world implementation of these specs early so we can get them right the first time. The main benefit of backing this Kickstarter is that you free Rob up from consulting work so Durandal gets these amazing features faster. The secondary benefit for backers is that Rob will be producing some great training series - video and source code included. As of now, there's still a good way to go on getting this funded. Pitch in and tell someone else to do so, too! bitCommander bitCommander is a really interesting file manager for Windows. It's already hit its funding goal as I write this. If you beat the end of the Kickstarter campaign, you can get a discount on it, and if not you'll want to pay the full price for it because this thing is looking really cool. I like the recent changes to the Windows File Explorer in Windows 8 - the ribbon's really nice, and the file copy experience is vastly improved, for instance. But when you're doing things that involve multiple simultaneous views - like assembling a lot of files, for instance - having several instances of File Explorer open gets clunky. Check out how browsing in bitCommander looks (all images below from the bitCommander website): You might think it's just Miller columns (recently popularized as the OS X Finder columns view mode, but dates all the way back to 1980). That alone would be pretty nice, but there's a lot more to it. There are tons of other great features, but I think my favorite is the temp list and batch support. There's a lot of other cool stuff, like tabs, nice thumbnail display (with details), intelligent filename shortening and more. I think what I like most about this is that it adds a lot of features but keep the design simple and focused. See what I mean on the bitCommander website. Here's mockup of a possible additional feature that Milos is looking at adding: integrated command windows, sync'd to the current browsing directory: Un-disclaimer: I backed both of these projects and don't get anything for talking about them. I just like them. Go back bitCommander and Durandal!</itunes:summary><itunes:keywords>Browsers - Web Development, Tools</itunes:keywords></item><item><title>A look at the new Visual Studio Online "Monaco" code editor</title><link>https://weblogs.asp.net:443/jongalloway/a-quick-look-at-the-new-visual-studio-online-quot-monaco-quot-code-editor</link><description>&lt;p&gt;One of the most interesting announcements at the Visual Studio 2013 Launch today was the Monaco editor in Visual Studio Online. &lt;/p&gt;  &lt;p&gt;I've seen little hints of this coming - for example, Scott Hanselman's post in August: &lt;a href="http://www.hanselman.com/blog/ARichNewJavaScriptCodeEditorSpreadingToSeveralMicrosoftWebSites.aspx"&gt;A rich new JavaScript code editor spreading to several Microsoft web sites&lt;/a&gt;. And if you looked around the command-line Kudu interface on an Azure Web Site (available at https://&amp;lt;SITENAME&amp;gt;.scm.azurewebsites.net) there's been a lightweight file editor available for a little while.&lt;/p&gt;  &lt;p&gt;After the announcement today, I dug up enough info to be dangerous and took it for a quick spin. Quick disclaimer: this is me playing around for a bit, it's not an official announcement.&lt;/p&gt;  &lt;h2&gt;Some top Monaco editor links&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/somasegar/archive/2013/11/13/visual-studio-2013-launch-announcing-visual-studio-online.aspx"&gt;Visual Studio 2013 Launch: Announcing Visual Studio Online&lt;/a&gt; - Soma's announcement post gives a quick overview. More importantly, it links to a series of videos on Channel 9 which overview the Monaco editor and demonstrate using it in a few different scenarios.&lt;/p&gt;  &lt;p&gt;Channel 9 series: &lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco"&gt;Visual Studio Online &amp;quot;Monaco&amp;quot;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/First-Steps"&gt;First Steps&lt;/a&gt; (2 minutes, 26 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Navigating-the-environment"&gt;Navigating the environment&lt;/a&gt; (4 minutes, 29 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Editor-Tips-and-Tricks"&gt;Editor Tips and Tricks&lt;/a&gt; (8 minutes, 45 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-ASPNET"&gt;Getting started with ASP.NET&lt;/a&gt; (2 minutes, 41 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-nodejs"&gt;Getting started with node.js&lt;/a&gt; (5 minutes, 33 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-PHP"&gt;Getting started with PHP&lt;/a&gt; (4 minutes, 10 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Using-LESS-in-nodejs"&gt;Using LESS in node.js&lt;/a&gt; (3 minutes, 15 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Debugging-nodejs"&gt;Debugging node.js&lt;/a&gt; (2 minutes, 52 seconds)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;a href="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-TypeScript"&gt;Getting started with TypeScript&lt;/a&gt; (3 minutes, 48 seconds)&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'll embed some of these videos at the end of the post - not here, or you'd get distracted and you'd never read the rest of the post, right?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The big one&lt;/strong&gt;: &lt;a href="http://www.visualstudio.com/en-us/news/2013-nov-13-vso"&gt;Visual Studio Online updates&lt;/a&gt; post on the Visual Studio Online features timeline news feed thing. Can I call it a blog? I just don't know. But it's wonderful.&lt;/p&gt;  &lt;p&gt;Specifically, the &lt;strong&gt;Announcing Visual Studio Online “Monaco”&lt;/strong&gt; section shows how to turn it on and get started.&lt;/p&gt;  &lt;h2&gt;Walkthrough: Editing an ASP.NET site in the browser&lt;/h2&gt;  &lt;p&gt;&lt;em&gt;Full disclosure: I tried bumbling my way through this and made a mess, then went crying to &lt;a href="http://blog.davidebbo.com/"&gt;David Ebbo&lt;/a&gt; for help. He set me straight.&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Step 1: Set up a Windows Azure Web Site with git deployment&lt;/h3&gt;  &lt;p&gt;First, I'm going to create a new ASP.NET site in Visual Studio 2013 and deploy it to git. Now, I could use Visual Studio Online's git hosting - of course it works well, and works with the Visual Studio Online Monaco editor. But you'd suspect some tricky business, so I'm going to use a GitHub repository.&lt;/p&gt;  &lt;p&gt;So, I'm creating a simple ASP.NET MVC 5 application (with no authentication so I don't need to deploy a database) and pushing it to a GitHub repository.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-11-13_11h21_09" href="http://www.flickr.com/photos/36836555@N00/10842274533/"&gt;&lt;img border="0" alt="2013-11-13_11h21_09" src="http://farm6.static.flickr.com/5539/10842274533_5e3352d0f6.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-11-13_11h22_11" href="http://www.flickr.com/photos/36836555@N00/10842282363/"&gt;&lt;img border="0" alt="2013-11-13_11h22_11" src="http://farm8.static.flickr.com/7396/10842282363_cc8aba40a7.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now I'm dropping in a standard .gitignore and initializing the repo, then pushing to GitHub.&lt;/p&gt;  &lt;pre&gt;
git init
git add .
git commit -m &amp;quot;Initial commit&amp;quot;
git remote add github https://github.com/jongalloway/PlayingWithMonacoEditor.git
git push -u github master&lt;/pre&gt;

&lt;p&gt;Now I'm going to create a new Windows Azure Web Site using that GitHub repo as the source. This has been available for a long time, but I'm showing the steps in case it's new to you.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h06_26" href="http://www.flickr.com/photos/36836555@N00/10847100516/"&gt;&lt;img border="0" alt="2013-11-13_18h06_26" src="http://farm4.static.flickr.com/3688/10847100516_a186f061c9_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h08_04" href="http://www.flickr.com/photos/36836555@N00/10847124636/"&gt;&lt;img border="0" alt="2013-11-13_18h08_04" src="http://farm4.static.flickr.com/3806/10847124636_413eaedb09_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h10_21" href="http://www.flickr.com/photos/36836555@N00/10847225454/"&gt;&lt;img border="0" alt="2013-11-13_18h10_21" src="http://farm4.static.flickr.com/3708/10847225454_8c0039eef4_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h16_54" href="http://www.flickr.com/photos/36836555@N00/10847160185/"&gt;&lt;img border="0" alt="2013-11-13_18h16_54" src="http://farm4.static.flickr.com/3760/10847160185_f615da3a8c_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Step 2: Set up for editing using Visual Studio Online&lt;/h3&gt;

&lt;p&gt;Okay, we've got a live repo and the site's deployed. Now we want to edit that source using Visual Studio Online.&lt;/p&gt;

&lt;p&gt;Here's the trick I learned from David Ebbo - you want to create another Windows Azure Web Site that's just associated with the source, not the deployment. So I head back into the portal and create a new Web Site just for source editing.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h20_03" href="http://www.flickr.com/photos/36836555@N00/10847696613/"&gt;&lt;img border="0" alt="2013-11-13_18h20_03" src="http://farm8.static.flickr.com/7338/10847696613_3e428aa7e3_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oops, I created it in Western Europe. Good thing the internets are fast.&lt;/p&gt;

&lt;p&gt;Now, in the new site, I head over to the Configure tab and enable &amp;quot;Edit in Visual Studio Online&amp;quot;.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h41_38" href="http://www.flickr.com/photos/36836555@N00/10847775773/"&gt;&lt;img border="0" alt="2013-11-13_18h41_38" src="http://farm8.static.flickr.com/7301/10847775773_f4172f28ba_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Can you feel it? We're almost there. Promise.&lt;/p&gt;

&lt;p&gt;Now I head over to the Dashboard tab, and click on the &lt;em&gt;Edit in Visual Studio Online&lt;/em&gt; link. Like you, I can hardly contain my excitement! What will happen?&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_14h59_14" href="http://www.flickr.com/photos/36836555@N00/10844926085/"&gt;&lt;img border="0" alt="2013-11-13_14h59_14" src="http://farm6.static.flickr.com/5513/10844926085_277b3296cd_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh, a login prompt. Hmm.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_15h00_26" href="http://www.flickr.com/photos/36836555@N00/10844936995/"&gt;&lt;img border="0" alt="2013-11-13_15h00_26" src="http://farm3.static.flickr.com/2890/10844936995_0722c4a61e_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fortunately, I know my username and password. If you forget, you can reset your password in the portal, on the Dashboard tab. Okay, with that done, here's what we get:&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_15h04_13" href="http://www.flickr.com/photos/36836555@N00/10845320933/"&gt;&lt;img border="0" alt="2013-11-13_15h04_13" src="http://farm8.static.flickr.com/7379/10845320933_cd9b853311.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hooray! Yeah, science!&lt;/p&gt;

&lt;h3&gt;Step 3: Appeal to the hipster demographic&lt;/h3&gt;

&lt;p&gt;Wait, you're not impressed because I used IE, is that it? You wanted me to see if it worked in another browser?&lt;/p&gt;

&lt;p&gt;Yeah, maybe this is an opportunity to dust off that Mac Mini to see how it does there. Hold on, it's over here somewhere. Under the... oh, that bill's overdue. Hm. Behind the... oh, there it is. Okay!&lt;/p&gt;

&lt;p&gt;So I log back in to the Azure portal on click that same Edit In Visual Studio Online link. Hey, there it is again! I'll show this screenshot bigger this time.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_18h49_05" href="http://www.flickr.com/photos/36836555@N00/10847679524/"&gt;&lt;img border="0" alt="2013-11-13_18h49_05" src="http://farm3.static.flickr.com/2841/10847679524_1ec29b0ba0_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Step 4: Clone the repo&lt;/h3&gt;

&lt;p&gt;Now I click on the git icon on the left side and enter my git url, then hit clone.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_19h00_18" href="http://www.flickr.com/photos/36836555@N00/10847818554/"&gt;&lt;img border="0" alt="2013-11-13_19h00_18" src="http://farm8.static.flickr.com/7447/10847818554_2e9a9a7018_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here it goes...&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_19h01_58" href="http://www.flickr.com/photos/36836555@N00/10847681795/"&gt;&lt;img border="0" alt="2013-11-13_19h01_58" src="http://farm3.static.flickr.com/2807/10847681795_395d8a2fb5_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, that looks really cool, and my code's visible on the left. Before I start editing, I want to make sure I can build it. In the console window, I'm going to type in &amp;quot;msbuild&amp;quot; and cross my fingers.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_19h09_25" href="http://www.flickr.com/photos/36836555@N00/10847835916/"&gt;&lt;img border="0" alt="2013-11-13_19h09_25" src="http://farm4.static.flickr.com/3791/10847835916_08b4c86ccc_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, we couldn't expect it to work on the first shot, could we? I...&lt;/p&gt;

&lt;p&gt;Oh, it did work. Well, hey there.&lt;/p&gt;

&lt;p&gt;So, back on my Windows box, here's what the site looks like in IE11.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_19h47_36" href="http://www.flickr.com/photos/36836555@N00/10848500103/"&gt;&lt;img border="0" alt="2013-11-13_19h47_36" src="http://farm4.static.flickr.com/3732/10848500103_491593edbe_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Step 5: Do some editing. That's what started this whole mess, remember?&lt;/h3&gt;

&lt;p&gt;I'm going to head back over to the Mac and edit some code. To make this interesting, I'm going to edit C#, CSHTML, CSS and JavaScript. What could go wrong?&lt;/p&gt;

&lt;p&gt;First I edit the HomeController to add something to the ViewBag.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_20h04_39" href="http://www.flickr.com/photos/36836555@N00/10849250694/"&gt;&lt;img border="0" alt="2013-11-13_20h04_39" src="http://farm6.static.flickr.com/5489/10849250694_0ccb281c8f_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next I edit the CSHTML, adding in some HTML and C# changes.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h23_39" href="http://www.flickr.com/photos/36836555@N00/10849078575/"&gt;&lt;img border="0" alt="2013-11-13_21h23_39" src="http://farm4.static.flickr.com/3809/10849078575_8eb9efef42_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, I make some CSS edits.&lt;/p&gt;

&lt;p&gt;I'm kind of rushing through this, but there's code completion and IntelliSense all along the way. For instance, when I start editing a CSS color, I get a dropdown with available colors.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_20h14_44" href="http://www.flickr.com/photos/36836555@N00/10849254236/"&gt;&lt;img border="0" alt="2013-11-13_20h14_44" src="http://farm6.static.flickr.com/5546/10849254236_02f57657ae_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I select a color, I can see what it will look like in the editor.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_20h15_02" href="http://www.flickr.com/photos/36836555@N00/10849257044/"&gt;&lt;img border="0" alt="2013-11-13_20h15_02" src="http://farm6.static.flickr.com/5543/10849257044_e690fef4ec_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I build to make sure it's all still good.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_20h50_22" href="http://www.flickr.com/photos/36836555@N00/10849447323/"&gt;&lt;img border="0" alt="2013-11-13_20h50_22" src="http://farm4.static.flickr.com/3750/10849447323_fca9e1d149_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Step 6: Deploy&lt;/h3&gt;

&lt;p&gt;And git push to deploy.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_20h51_44" href="http://www.flickr.com/photos/36836555@N00/10849273044/"&gt;&lt;img border="0" alt="2013-11-13_20h51_44" src="http://farm8.static.flickr.com/7389/10849273044_5b9d1e7cd5_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Step 7: Full circle, with a pirouette and a lemon twist &lt;/h3&gt;

&lt;p&gt;And hopping back to my Windows / IE 11 browser, we can see that it works.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h22_15" href="http://www.flickr.com/photos/36836555@N00/10849502723/"&gt;&lt;img border="0" alt="2013-11-13_21h22_15" src="http://farm8.static.flickr.com/7401/10849502723_c08122e585_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;What's the point?&lt;/h2&gt;

&lt;p&gt;Why did we do this? What did it buy us?&lt;/p&gt;

&lt;p&gt;Well, for one thing, we grabbed an ASP.NET repo from GitHub in a browser, on a Mac, made some code changes, and deployed it. If you've got a browser (free) and a Windows Azure account (free), you can edit and deploy an ASP.NET site. You could do it on an Android tablet, on an iPad, in a boat, with a goat.&lt;/p&gt;

&lt;p&gt;Even if you're on Windows, note that the Visual Studio Online experience didn't require me to sign up for or pay anything. Visual Studio Online is free for projects with five or fewer users, and didn't make me jump through any hoops to get going. That means you can get started using it. If you want more Visual Studio Online or Windows Azure services, you can get them, but there's no roadblock to creating / editing / deploying / maintaining a site right now.&lt;/p&gt;

&lt;p&gt;Oh, and this was ASP.NET MVC 5 - so, all the new stuff works out of the box. Yes, you'd expect that, but it's worth pointing out.&lt;/p&gt;

&lt;h2&gt;Recap and regrets&lt;/h2&gt;

&lt;p&gt;Yes, we've arrived. We deployed code to GitHub, pulled it into a Windows Azure Web Site, edited it in a browser, on a Mac (demo bingo, everyone drink), and saw it automatically deployed and running in a browser. Neat.&lt;/p&gt;

&lt;p&gt;What I didn't have time to show you was all the cool features in the Monaco editor.&lt;/p&gt;

&lt;p&gt;For instance, you can click on the settings gear in the upper right corner and switch to the Visual Studio dark theme, which is so much cooler.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h46_07" href="http://www.flickr.com/photos/36836555@N00/10849615443/"&gt;&lt;img border="0" alt="2013-11-13_21h46_07" src="http://farm8.static.flickr.com/7303/10849615443_b2a206e760_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I regret that we didn't have time to look at all of the cool editor features, like the editor commands shown when you hit ctrl+E.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h48_36" href="http://www.flickr.com/photos/36836555@N00/10849307605/"&gt;&lt;img border="0" alt="2013-11-13_21h48_36" src="http://farm4.static.flickr.com/3790/10849307605_ec7d9ffbe3_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wish we'd had time to look at the fancy IntelliSense features, including support for jQuery function overloads.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h50_33" href="http://www.flickr.com/photos/36836555@N00/10849320255/"&gt;&lt;img border="0" alt="2013-11-13_21h50_33" src="http://farm8.static.flickr.com/7426/10849320255_5f39bf2cac_b.jpg" width="379" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it would have been neat to cover the cool diff-on-commit view.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-11-13_21h52_46" href="http://www.flickr.com/photos/36836555@N00/10849680643/"&gt;&lt;img border="0" alt="2013-11-13_21h52_46" src="http://farm6.static.flickr.com/5514/10849680643_3c36815a82_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, alas, it was not to be.&lt;/p&gt;

&lt;p&gt;For those features, and many more, I recommend you check out the videos I referenced earlier. I'll even embed some of those in the next section, because this post wasn't quite long enough.&lt;/p&gt;

&lt;h2&gt;&lt;/h2&gt;

&lt;h2&gt;Neat Videos You Should Watch&lt;/h2&gt;

&lt;p&gt;All of the Monaco videos are good, but these are some of my favorite.&lt;/p&gt;

&lt;p&gt;First Steps&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/First-Steps/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;Editor Tips And Tricks&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Editor-Tips-and-Tricks/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;Getting Started With PHP&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-PHP/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;Debugging node.js&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Debugging-nodejs/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;And last, but not least, Getting started with TypeScript. Why? Because the Monaco editor was written in TypeScript!&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Series/Visual-Studio-Online-Monaco/Getting-started-with-TypeScript/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;</description><pubDate>Thu, 14 Nov 2013 06:00:11 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/a-quick-look-at-the-new-visual-studio-online-quot-monaco-quot-code-editor</guid></item><item><title>Top things web developers should know about the Visual Studio 2013 release</title><link>https://weblogs.asp.net:443/jongalloway/top-things-web-developers-should-know-about-the-visual-studio-2013-release</link><description>&lt;p&gt;ASP.NET and Web Tools for Visual Studio 2013 Release NotesASP.NET and Web Tools for Visual Studio 2013 Release NotesSummary for lazy readers:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio 2013 is now available for &lt;a href="http://www.microsoft.com/visualstudio/eng/downloads"&gt;download on the Visual Studio site&lt;/a&gt; and on &lt;a href="http://msdn.microsoft.com/en-US/subscriptions/downloads/"&gt;MSDN subscriber downloads&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;Visual Studio 2013 installs side by side with Visual Studio 2012 and supports round-tripping between Visual Studio versions, so you can try it out without committing to a switch &lt;/li&gt;    &lt;li&gt;Visual Studio 2013 ships with the new version of ASP.NET, which includes ASP.NET MVC 5, ASP.NET Web API 2, Razor 3, Entity Framework 6 and SignalR 2.0 &lt;/li&gt;    &lt;li&gt;The new releases ASP.NET focuses on One ASP.NET, so core features and web tools work the same across the platform (e.g. adding ASP.NET MVC controllers to a Web Forms application) &lt;/li&gt;    &lt;li&gt;New core features include new templates based on Bootstrap, a new scaffolding system, and a new identity system &lt;/li&gt;    &lt;li&gt;Visual Studio 2013 is an incredible editor for web files, including HTML, CSS, JavaScript, Markdown, LESS, Coffeescript, Handlebars, Angular, Ember, Knockdown, etc. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Top links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio 2013 content on the ASP.NET site are in the standard new releases area: &lt;a href="http://www.asp.net/vnext"&gt;http://www.asp.net/vnext&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes"&gt;ASP.NET and Web Tools for Visual Studio 2013 Release Notes&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Short intro videos on the new &lt;a href="http://www.asp.net/visual-studio/overview/2013"&gt;Visual Studio web editor features from Scott Hanselman and Mads Kristensen&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/10/17/announcing-release-of-asp-net-and-web-tools-for-visual-studio-2013.aspx"&gt;Announcing release of ASP.NET and Web Tools for Visual Studio 2013&lt;/a&gt; post on the official .NET Web Development and Tools Blog &lt;/li&gt;    &lt;li&gt;The &lt;a href="http://blogs.msdn.com/b/webdev/"&gt;.NET Web Development and Tools Blog&lt;/a&gt; has a lot of good post about the release&lt;/li&gt;    &lt;li&gt;Scott Guthrie's post: &lt;a href="http://weblogs.asp.net/scottgu/archive/2013/10/17/announcing-the-release-of-visual-studio-2013-and-great-improvements-to-asp-net-and-entity-framework.aspx"&gt;Announcing the Release of Visual Studio 2013 and Great Improvements to ASP.NET and Entity Framework&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Scott Hanselman did a series of quick feature overview videos on the ASP.NET site. These are really, really well done. Watch them here: &lt;a href="http://www.asp.net/visual-studio/overview/2013"&gt;http://www.asp.net/visual-studio/overview/2013&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Okay, for those of you who are still with me, let's dig in a bit.&lt;/p&gt;  &lt;h2&gt;Quick web dev notes on downloading and installing Visual Studio 2013&lt;/h2&gt;  &lt;p&gt;I found Visual Studio 2013 to be a pretty fast install. According to Brian Harry's release post, &lt;a href="http://blogs.msdn.com/b/bharry/archive/2013/10/17/visual-studio-2013-rtm-available.aspx"&gt;installing over pre-release versions of Visual Studio is supported&lt;/a&gt;.&amp;#160; I've installed the release version over pre-release versions, and it worked fine.&lt;/p&gt;  &lt;p&gt;If you're only going to be doing web development, you can speed up the install if you just select Web Developer tools.&lt;/p&gt;  &lt;p&gt;&lt;a title="Visual Studio 2013 installer" href="http://www.flickr.com/photos/36836555@N00/10329929544/"&gt;&lt;img border="0" alt="Visual Studio 2013 installer" src="http://farm4.static.flickr.com/3759/10329929544_4eaf8b4e42.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course, as a good Microsoft employee, I'll mention that you might also want to install some of those other features, like the Store apps for Windows 8 and the Windows Phone 8.0 SDK, but they do download and install a lot of other stuff (e.g. the Windows Phone SDK sets up Hyper-V and downloads several GB's of VM's). So if you're planning just to do web development for now, you can pick just the Web Developer Tools and install the other stuff later.&lt;/p&gt;  &lt;p&gt;If you've got a fast internet connection, I recommend using the web installer instead of downloading the ISO. The ISO includes all the features, whereas the web installer just downloads what you're installing.&lt;/p&gt;  &lt;p&gt;Visual Studio 2013 development settings and color theme&lt;/p&gt;  &lt;p&gt;When you start up Visual Studio, it'll prompt you to pick some defaults. These are totally up to you -whatever suits your development style - and you can change them later.&lt;/p&gt;  &lt;p&gt;&lt;a title="Visual Studio 2013 color theme" href="http://www.flickr.com/photos/36836555@N00/10330357344/"&gt;&lt;img border="0" alt="Visual Studio 2013 color theme" src="http://farm6.static.flickr.com/5505/10330357344_accd88b546.jpg" width="391" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As I said, these are completely up to you. I recommend either the Web Development or Web Development (Code Only) settings. The only real difference is that Code Only hides the toolbars, and you can switch between them using Tools / Import and Export Settings / Reset.&lt;/p&gt;  &lt;h3&gt;Web Development settings&lt;/h3&gt;  &lt;p&gt;&lt;a title="Web Development settings" href="http://www.flickr.com/photos/36836555@N00/10330563935/"&gt;&lt;img border="0" alt="Web Development settings" src="http://farm8.static.flickr.com/7418/10330563935_af181417dc.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Web Development (code only) settings&lt;/p&gt;  &lt;p&gt;&lt;a title="Web Development (code only) settings" href="http://www.flickr.com/photos/36836555@N00/10330585416/"&gt;&lt;img border="0" alt="Web Development (code only) settings" src="http://farm6.static.flickr.com/5547/10330585416_596ffe6103.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Usually I've just gone with Web Development (code only) in the past because I just want to focus on the code, although the Standard toolbar does make it easier to switch default web browsers. More on that later.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_09h24_56" href="http://www.flickr.com/photos/36836555@N00/10330638714/"&gt;&lt;img border="0" alt="2013-10-17_09h24_56" src="http://farm8.static.flickr.com/7378/10330638714_965cb1a342.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Color theme&lt;/h3&gt;  &lt;p&gt;Sigh. Okay, everyone's got their favorite colors. I alternate between Light and Dark depending on my mood, and I personally like how the low contrast on the window chrome in those themes puts the emphasis on my code rather than the tabs and toolbars. I know some people got pretty worked up over that, though, and wanted the blue theme back. I personally don't like it - it reminds me of ancient versions of Visual Studio that I don't want to think about anymore.&lt;/p&gt;  &lt;p&gt;So here's the thing: if you install Visual Studio Ultimate, it defaults to Blue. The other versions default to Light. If you use Blue, I won't criticize you - out loud, that is. You can change themes really easily - either Tools / Options / Environment / General, or the smart way: ctrl+q for quick launch, then type Theme and hit enter.&lt;/p&gt;  &lt;h3&gt;Signing in&lt;/h3&gt;  &lt;p&gt;During the first run, you'll be prompted to sign in. You don't have to - you can click the &amp;quot;Not now, maybe later&amp;quot; link at the bottom of that dialog. I recommend signing in, though. It's not hooked in with licensing or tracking the kind of code you write to sell you components. It is doing good things, like&amp;#160; &lt;a href="http://msdn.microsoft.com/en-US/library/vstudio/dn135229(v=vs.120).aspx"&gt;syncing your Visual Studio settings between computers.&lt;/a&gt; More about that &lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2013/06/28/welcome-sign-in-to-visual-studio.aspx"&gt;here&lt;/a&gt;. So, you don't have to, but I sure do.&lt;/p&gt;  &lt;h2&gt;Overview of shiny new things in ASP.NET land&lt;/h2&gt;  &lt;p&gt;There are a lot of good new things in ASP.NET. I'll list some of my favorite here, but you can &lt;a href="http://www.asp.net/vnext"&gt;read more on the ASP.NET site&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;One ASP.NET&lt;/h2&gt;  &lt;p&gt;You've heard us talk about this for a while. The idea is that options are good, but choice can be a burden. When you start a new ASP.NET project, why should you have to make a tough decision - with long-term consequences - about how your application will work? If you want to use ASP.NET Web Forms, but have the option of adding in ASP.NET MVC later, why should that be hard? It's all ASP.NET, right?&lt;/p&gt;  &lt;p&gt;Ideally, you'd just decide that you want to use ASP.NET to build sites and services, and you could use the appropriate tools (the green blocks below) as you needed them.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_09h56_49" href="http://www.flickr.com/photos/36836555@N00/10331262063/"&gt;&lt;img border="0" alt="2013-10-17_09h56_49" src="http://farm8.static.flickr.com/7378/10331262063_df982ef217.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So, here it is.&lt;/p&gt;  &lt;p&gt;When you create a new ASP.NET application, you just create an ASP.NET application.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_09h59_58" href="http://www.flickr.com/photos/36836555@N00/10331142464/"&gt;&lt;img border="0" alt="2013-10-17_09h59_58" src="http://farm8.static.flickr.com/7457/10331142464_d1147a5268.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Next, you can pick from some templates to get you started... but these are different. They're not &amp;quot;painful decision&amp;quot; templates, they're just some starting pieces. And, most importantly, you can mix and match. I can pick a &amp;quot;mostly&amp;quot; Web Forms template, but include MVC and Web API folders and core references.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_10h05_27" href="http://www.flickr.com/photos/36836555@N00/10331394573/"&gt;&lt;img border="0" alt="2013-10-17_10h05_27" src="http://farm6.static.flickr.com/5488/10331394573_69edea75c6.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you've tried to mix and match in the past, you're probably aware that it was possible, but not pleasant. ASP.NET MVC project files contained special project type GUIDs, so you'd only get controller scaffolding support in a Web Forms project if you manually edited the csproj file. Features in one stack didn't work in others. Project templates were painful choices. That's no longer the case. Hooray! &lt;/p&gt;  &lt;p&gt;I just did a demo in a presentation last week where I created a new Web Forms + MVC + Web API site, built a model, scaffolded MVC and Web API controllers with EF Code First, add data in the MVC view, viewed it in Web API, then added a GridView to the Web Forms Default.aspx page and bound it to the Model. In about 5 minutes. Sure, it's a simple example, but it's great to be able to share code and features across the whole ASP.NET family.&lt;/p&gt;  &lt;h2&gt;Authentication&lt;/h2&gt;  &lt;p&gt;In the past, authentication was built into the templates. So, for instance, there was an ASP.NET MVC 4 Intranet Project template which created a new ASP.NET MVC 4 application that was preconfigured for Windows Authentication. All of that authentication stuff was built into each template, so they varied between the stacks, and you couldn't reuse them. You didn't see a lot of changes to the authentication options, since they required big changes to a bunch of project templates.&lt;/p&gt;  &lt;p&gt;Now, the new project dialog includes a common authentication experience. When you hit the Change Authentication button, you get some common options that work the same way regardless of the template or reference settings you've made. These options work on all ASP.NET frameworks, and all hosting environments (IIS, IIS Express, or OWIN for self-host)&lt;/p&gt;  &lt;p&gt;The default is Individual User Accounts:&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_10h33_15" href="http://www.flickr.com/photos/36836555@N00/10331628534/"&gt;&lt;img border="0" alt="2013-10-17_10h33_15" src="http://farm3.static.flickr.com/2882/10331628534_a671108fd5.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is the standard &amp;quot;create a local account, using username / password or OAuth&amp;quot; thing; however, it's all built on the new Identity system. More on that in a second.&lt;/p&gt;  &lt;p&gt;The one setting that has some configuration to it is Organizational Accounts, which lets you configure authentication using Active Directory, Windows Azure Active Directory, or Office 365.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_10h46_50" href="http://www.flickr.com/photos/36836555@N00/10331817455/"&gt;&lt;img border="0" alt="2013-10-17_10h46_50" src="http://farm3.static.flickr.com/2886/10331817455_6a8587930d.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Identity&lt;/h2&gt;  &lt;p&gt;There's a new identity system. We've taken the best parts of the previous ASP.NET Membership and Simple Identity systems, rolled in a lot of feedback and made big enhancements to support important developer concerns like unit testing and extensiblity.&lt;/p&gt;  &lt;p&gt;I've written long posts about ASP.NET identity, and I'll do it again. Soon. This is not that post. The short version is that I think we've finally got just the right Identity system. Some of my favorite features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There are simple, sensible defaults that work well - you can File / New / Run / Register / Login, and everything works. &lt;/li&gt;    &lt;li&gt;It supports standard username / password as well as external authentication (OAuth, etc.). &lt;/li&gt;    &lt;li&gt;It's easy to customize without having to re-implement an entire provider. It's built using pluggable pieces, rather than one large monolithic system. &lt;/li&gt;    &lt;li&gt;It's built using interfaces like IUser and IRole that allow for unit testing, dependency injection, etc. &lt;/li&gt;    &lt;li&gt;You can easily add user profile data (e.g. URL, twitter handle, birthday). You just add properties to your ApplicationUser model and they'll automatically be persisted. &lt;/li&gt;    &lt;li&gt;Complete control over how the identity data is persisted. By default, everything works with Entity Framework Code First, but it's built to support changes from small (modify the schema) to big (use another ORM, store your data in a document database or in the cloud or in XML or in the EXIF data of your desktop background or whatever). &lt;/li&gt;    &lt;li&gt;It's configured via OWIN. More on OWIN and Katana later, but the fact that it's built using OWIN means it's portable. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can find out more in the &lt;a href="http://www.asp.net/aspnet/overview/authentication-and-identity"&gt;Authentication and Identity section of the ASP.NET site&lt;/a&gt; (and lots more content will be going up there soon).&lt;/p&gt;  &lt;h2&gt;New Bootstrap based project templates&lt;/h2&gt;  &lt;p&gt;The new project templates are built using Bootstrap 3. &lt;a href="http://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt; (formerly Twitter Bootstrap) is a front-end framework that brings a lot of nice benefits:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It's responsive, so your projects will automatically scale to device width using CSS media queries. For example, menus are full size on a desktop browser, but on narrower screens you automatically get a mobile-friendly menu. &lt;/li&gt;    &lt;li&gt;The built-in Bootstrap styles make your standard page elements (headers, footers, buttons, form inputs, tables etc.) look nice and modern. &lt;/li&gt;    &lt;li&gt;Bootstrap is themeable, so you can reskin your whole site by dropping in a new Bootstrap theme. Since Bootstrap is pretty popular across the web development community, this gives you a large and rapidly growing variety of templates (free and paid) to choose from. &lt;/li&gt;    &lt;li&gt;Bootstrap also includes a lot of very useful things: components (like progress bars and badges), useful &lt;a href="http://getbootstrap.com/components/#glyphicons"&gt;glyphicons&lt;/a&gt;, and some jQuery plugins for tooltips, dropdowns, carousels, etc.). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here's a look at how the responsive part works. When the page is full screen, the menu and header are optimized for a wide screen display:&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_12h14_50" href="http://www.flickr.com/photos/36836555@N00/10333317854/"&gt;&lt;img border="0" alt="2013-10-17_12h14_50" src="http://farm8.static.flickr.com/7333/10333317854_1c4e65e969.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When I shrink the page down (this is all based on page width, not useragent sniffing) the menu turns into a nice mobile-friendly dropdown:&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_12h15_12" href="http://www.flickr.com/photos/36836555@N00/10333498983/"&gt;&lt;img border="0" alt="2013-10-17_12h15_12" src="http://farm4.static.flickr.com/3698/10333498983_cc37fdf536.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For a quick example, I grabbed a new free theme off &lt;a href="http://bootswatch.com/"&gt;bootswatch.com&lt;/a&gt;. For simple themes, you just need to download the boostrap.css file and replace the /content/bootstrap.css file in your project.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_12h27_44" href="http://www.flickr.com/photos/36836555@N00/10333348956/"&gt;&lt;img border="0" alt="2013-10-17_12h27_44" src="http://farm6.static.flickr.com/5503/10333348956_d34447d214.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now when I refresh the page, I've got a new theme:&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_12h27_33" href="http://www.flickr.com/photos/36836555@N00/10333327544/"&gt;&lt;img border="0" alt="2013-10-17_12h27_33" src="http://farm4.static.flickr.com/3700/10333327544_a506aa8e72.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Scaffolding&lt;/h2&gt;  &lt;p&gt;The big change in scaffolding is that it's one system that works across ASP.NET. You can create a new Empty Web project or Web Forms project and you'll get the Scaffold context menus.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_12h36_14" href="http://www.flickr.com/photos/36836555@N00/10333443175/"&gt;&lt;img border="0" alt="2013-10-17_12h36_14" src="http://farm4.static.flickr.com/3769/10333443175_5f83991f24_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For release, we've got MVC 5 and Web API 2 controllers. We had a preview of Web Forms scaffolding in the preview releases, but they weren't fully baked for RTM. Look for them in a future update, expected pretty soon.&lt;/p&gt;  &lt;p&gt;This scaffolding system wasn't just changed to work across the ASP.NET frameworks, it's also built to enable future extensibility. That's not in this release, but should also hopefully be out soon.&lt;/p&gt;  &lt;h2&gt;Project Readme page&lt;/h2&gt;  &lt;p&gt;This is a small thing, but I really like it. When you create a new project, you get a Project_Readme.html page that's added to the root of your project and opens in the Visual Studio built-in browser.&lt;/p&gt;  &lt;p&gt;&lt;a title="2013-10-17_14h25_35" href="http://www.flickr.com/photos/36836555@N00/10335264663/"&gt;&lt;img border="0" alt="2013-10-17_14h25_35" src="http://farm4.static.flickr.com/3750/10335264663_304a16c2f9_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I love it.&lt;/p&gt;  &lt;p&gt;A long time ago, when you created a new project we just dumped it on you and left you scratching your head about what to do next. Not ideal.&lt;/p&gt;  &lt;p&gt;Then we started adding a bunch of Getting Started information to the new project templates. That told you what to do next, but you had to delete all of that stuff out of your website. It doesn't belong there. Not ideal.&lt;/p&gt;  &lt;p&gt;This is a simple HTML file that's not integrated into your project code at all. You can delete it if you want. But, it shows a lot of helpful links that are current for the project you just created. In the future, if we add new wacky project types, they can create readme docs with specific information on how to do appropriately wacky things.&lt;/p&gt;  &lt;p&gt;Side note: I really like that they used the internal browser in Visual Studio to show this content rather than popping open an HTML page in the default browser. I hate that. It's annoying. If you're doing that, I hope you'll stop. What if some unnamed person has 40 or 90 tabs saved in their browser session? When you pop open your &amp;quot;Thanks for installing my Visual Studio extension!&amp;quot; page, all eleventy billion tabs start up and I wish I'd never installed your thing. Be like these guys and pop stuff Visual Studio specific HTML docs in the Visual Studio browser.&lt;/p&gt;  &lt;h2&gt;ASP.NET MVC 5&lt;/h2&gt;  &lt;p&gt;The biggest change with ASP.NET MVC 5 is that it's no longer a separate project type. It integrates well with the rest of ASP.NET.&lt;/p&gt;  &lt;p&gt;In addition to that and the other common features we've already looked at (Bootstrap templates, Identity, authentication), here's what's new for ASP.NET MVC.&lt;/p&gt;  &lt;h3&gt;Attribute routing&lt;/h3&gt;  &lt;p&gt;ASP.NET MVC now supports attribute routing, thanks to a contribution by Tim McCall, the author of &lt;a href="http://attributerouting.net/"&gt;http://attributerouting.net&lt;/a&gt;. With attribute routing you can specify your routes by annotating your actions and controllers. This supports some pretty complex, customized routing scenarios, and it allows you to keep your route information right with your controller actions if you'd like.&lt;/p&gt;  &lt;p&gt;Here's a controller that includes an action whose method name is Hiding, but I've used AttributeRouting to configure it to /spaghetti/with-nesting/where-is-waldo&lt;/p&gt;  &lt;pre class="brush: csharp; auto-links: false;"&gt;public class SampleController : Controller
{

    [Route(&amp;quot;spaghetti/with-nesting/where-is-waldo&amp;quot;)]
    public string Hiding() 
    {
        return &amp;quot;You found me!&amp;quot;;
    }
}&lt;/pre&gt;

&lt;p&gt;I enable that in my RouteConfig.cs, and I can use that in conjunction with my other MVC routes like this:&lt;/p&gt;

&lt;pre class="brush: csharp; auto-links: false;"&gt;public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute(&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;);

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: &amp;quot;Default&amp;quot;,
            url: &amp;quot;{controller}/{action}/{id}&amp;quot;,
            defaults: new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional }
        );
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;a title="2013-10-17_14h06_56" href="http://www.flickr.com/photos/36836555@N00/10334803914/"&gt;&lt;img border="0" alt="2013-10-17_14h06_56" src="http://farm6.static.flickr.com/5536/10334803914_bb41127fc4.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can read &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx"&gt;more about Attribute Routing in ASP.NET MVC 5 here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Filter enhancements&lt;/h3&gt;

&lt;p&gt;There are two new additions to filters: Authentication Filters and Filter Overrides.&lt;/p&gt;

&lt;p&gt;Authentication filters are a new kind of filter in ASP.NET MVC that run prior to authorization filters in the ASP.NET MVC pipeline and allow you to specify authentication logic per-action, per-controller, or globally for all controllers. Authentication filters process credentials in the request and provide a corresponding principal. Authentication filters can also add authentication challenges in response to unauthorized requests.&lt;/p&gt;

&lt;p&gt;Override filters let you change which filters apply to a given action method or controller. Override filters specify a set of filter types that should not be run for a given scope (action or controller). This allows you to configure filters that apply globally but then exclude certain global filters from applying to specific actions or controllers.&lt;/p&gt;

&lt;h2&gt;ASP.NET Web API 2&lt;/h2&gt;

&lt;p&gt;ASP.NET Web API 2 includes a lot of new features.&lt;/p&gt;

&lt;h3&gt;Attribute Routing&lt;/h3&gt;

&lt;p&gt;ASP.NET Web API supports the same attribute routing system that's in ASP.NET MVC 5. You can read more about the Attribute Routing features in Web API in this &lt;a href="http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2"&gt;article&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;OAuth 2.0&lt;/h3&gt;

&lt;p&gt;ASP.NET Web API picks up OAuth 2.0 support, using security middleware running on OWIN (discussed below). This is great for features like authenticated Single Page Applications.&lt;/p&gt;

&lt;h3&gt;OData Improvements&lt;/h3&gt;

&lt;p&gt;ASP.NET Web API now has full OData support. That required adding in some of the most powerful operators: $select, $expand, $batch and $value. You can read more about &lt;a href="http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/using-$select,-$expand,-and-$value"&gt;OData operator support in this article by Mike Wasson&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lots more&lt;/p&gt;

&lt;p&gt;There's a huge list of other features, including CORS (cross-origin request sharing), IHttpActionResult, IHttpRequestContext, and more. I think the best overview is in the &lt;a href="http://www.asp.net/visual-studio/overview/2013/release-notes#TOC11"&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;OWIN and Katana&lt;/h2&gt;

&lt;p&gt;I've written about &lt;a href="weblogs.asp.net/jgalloway/archive/2013/05/30/getting-up-to-speed-with-katana.aspx"&gt;OWIN and Katana recently&lt;/a&gt;. I'm a big fan.&lt;/p&gt;

&lt;p&gt;OWIN is the Open Web Interfaces for .NET. It's a spec, like HTML or HTTP, so you can't install OWIN. The benefit of OWIN is that it's a community specification, so anyone who implements it can plug into the ASP.NET stack, either as middleware or as a host.&lt;/p&gt;

&lt;p&gt;Katana is the Microsoft implementation of OWIN. It leverages OWIN to wire up things like authentication, handlers, modules, IIS hosting, etc., so ASP.NET can host OWIN components and Katana components can run in someone else's OWIN implementation.&lt;/p&gt;

&lt;p&gt;Howard Dierking just wrote a cool article in MSDN magazine describing Katana in depth: &lt;a href="http://msdn.microsoft.com/en-us/magazine/dn451439.aspx"&gt;Getting Started with the Katana Project&lt;/a&gt;. He had an interesting example showing an OWIN based pipeline which leveraged SignalR, ASP.NET Web API and NancyFx components in the same stack.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.msdn.microsoft.com/dn451439.Dierking_Figure11_hires(en-us,MSDN.10).png" /&gt;&lt;/p&gt;

&lt;p&gt;If this kind of thing makes sense to you, that's great. If it doesn't, don't worry, but keep an eye on it. You're going to see some cool things happen as a result of ASP.NET becoming more and more pluggable.&lt;/p&gt;

&lt;h2&gt;Visual Studio Web Tools&lt;/h2&gt;

&lt;p&gt;Okay, this stuff's just crazy. Visual Studio has been adding some nice web dev features over the past few years, but they've really cranked it up for this release. &lt;/p&gt;

&lt;p&gt;Visual Studio is by far my favorite code editor for all web files: CSS, HTML, JavaScript, and lots of popular libraries. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop thinking of Visual Studio as a big editor that you only use to write back-end code. Stop editing HTML and CSS in Notepad (or Sublime, Notepad++, etc.). Visual Studio starts up in under 2 seconds on a modern computer with an SSD. Misspelling HTML attributes or your CSS classes or jQuery or Angular syntax is stupid. It doesn't make you a better developer, it makes you a silly person who wastes time.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Browser Link&lt;/h3&gt;

&lt;p&gt;Browser Link is a real-time, two-way connection between Visual Studio and all connected browsers. It's only attached when you're running locally, in debug, but it applies to any and all connected browser, including emulators.&lt;/p&gt;

&lt;p&gt;You may have seen demos that showed the browsers refreshing based on changes in the editor, and I'll agree that's pretty cool. But it's really just the start. It's a two-way connection, and it's built for extensiblity. That means you can write extensions that push information from your running application (in IE, Chrome, a mobile emulator, etc.) back to Visual Studio. Mads and team have showed off some demonstrations where they enabled edit mode in the browser which updated the source HTML back on the browser. It's also possible to look at how the rendered HTML performs, check for compatibility issues, watch for unused CSS classes, the sky's the limit.&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Blogs/ASP-NET-Site-Videos/Visual-Studio-2013-Web-Editor-Features-Browser-Link/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;h3&gt;New HTML editor&lt;/h3&gt;

&lt;p&gt;The previous HTML editor had a lot of old code that didn't allow for improvements. The team rewrote the HTML editor to take advantage of the new(ish) extensibility features in Visual Studio, which then allowed them to &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/09/30/html-editing-features-in-visual-studio-2013-rc.aspx"&gt;add in all kinds of features&lt;/a&gt; - things like CSS Class and ID IntelliSense (so you type style=&amp;quot;&amp;quot; and get a list of classes and ID's for your project), smart indent based on how your document is formatted, JavaScript reference auto-sync, etc.&lt;/p&gt;

&lt;p&gt;Here's a 3 minute tour from Mads Kristensen.&lt;/p&gt;
&lt;iframe style="height: 540px; width: 960px" src="http://channel9.msdn.com/Blogs/ASP-NET-Site-Videos/Visual-Studio-2013-Web-Editor-Features-HTML-Editor/player?w=960&amp;amp;h=540" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;h3&gt;Integrated Windows Azure Web Site creation and publishing&lt;/h3&gt;

&lt;p&gt;The &lt;a href="http://manage.windowsazure.com"&gt;Windows Azure portal&lt;/a&gt; is good as websites go, but it's another step to have to go to the portal to create a site, then download the publish profile, then import it into my site. It's like ten clicks or something and it just gets really fatiguing and sometimes I need a nap.&lt;/p&gt;

&lt;p&gt;They've updated the Server Explorer in Visual Studio 2013 so I can just right-click on the Windows Azure node to create a site. Then when I'm publishing, I can directly import the site publish profile and go. That means I can create a new Windows Azure Web Site, with a free 20 MB SQL Database, and publish it to Windows Azure all without leaving Visual Studio. That's really nice.&lt;/p&gt;

&lt;p&gt;&lt;a title="2013-10-17_15h56_26" href="http://www.flickr.com/photos/36836555@N00/10336195204/"&gt;&lt;img border="0" alt="2013-10-17_15h56_26" src="http://farm6.static.flickr.com/5504/10336195204_4ef39abec8_b.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More about that on this post: &lt;a href="http://blogs.msdn.com/b/webdev/archive/2013/09/11/creating-new-windows-azure-web-site-from-visual-studio-2013-rc.aspx"&gt;Creating New Windows Azure Web Site from Visual Studio 2013 RC&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Lots more Visual Studio web dev features&lt;/h3&gt;

&lt;p&gt;That's just a sampling - there's a ton of great features for JavaScript editing, CSS editing, publishing, and Page Inspector (which shows real-time rendering of your page inside Visual Studio). &lt;a href="http://www.asp.net/visual-studio"&gt;Here are some more short videos&lt;/a&gt; showing those features.&lt;/p&gt;

&lt;p&gt;Lots, lots more&lt;/p&gt;

&lt;p&gt;Okay, that's just a summary, and it's still quite a bit. Head on over to &lt;a href="http://asp.net/vnext"&gt;http://asp.net/vnext&lt;/a&gt; for more information, and download Visual Studio 2013 now to get started!&lt;/p&gt;</description><pubDate>Thu, 17 Oct 2013 21:36:03 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/jongalloway/top-things-web-developers-should-know-about-the-visual-studio-2013-release</guid><category>ASP.NET</category><category>ASP.NET MVC</category><category>ASP.NET Web API</category><category>Visual Studio</category></item></channel></rss>