Scott Hanselman

Exploring a minimal WebAPI with ASP.NET Core

July 26, '16 Comments [2] Posted in ASP.NET | ASP.NET Web API
Sponsored By

They are still working on the "dotnet new" templates, but you can also get cool templates from "yo aspnet" usingn Yeoman. The generator-aspnet package for Yeoman includes an empty web app, a console app, a few web app flavors, test projects, and a very simple Web API application that returns JSON and generally tries to be RESTful.

yo aspnet

The startup.cs is pretty typical and basic. The Startup constructor sets up the Configuration with an appsettings.json file and add a basic Console logger. Then by calling "UseMvc()" we get to use all ASP.NET Core which includes both centralized routing and attribute routing. ASP.NET Core's controllers are unified now, so there isn't a "Controller" and "ApiController" base class. It's just Controller. Controllers that return JSON or those that return Views with HTML are the same so they get to share routes and lots of functionality.

public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.UseMvc();
}
}

Then you can make a basic controller and use Attribute Routing to do whatever makes you happy. Just by putting [HttpGet] on a method makes that method the /api/Values default for a simple GET.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace tinywebapi.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}

// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}

// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}

// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}

// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
}

If we run this with "dotnet run" and call/curl/whatever to http://localhost:5000/api/Values we'd get a JSON array of two values by default. How would we (gasp!) add XML as a formatting/serialization option that would respond to a request with an Accept: application/xml header set?

I'll add "Microsoft.AspNetCore.Mvc.Formatters.Xml" to project.json and then add one method to ConfigureServices():

services.AddMvc()
        .AddXmlSerializerFormatters();

Now when I go into Postman (or curl, etc) and do a GET with Accept: application/xml as a header, I'll get the same object expressed as XML. If I ask for JSON, I'll get JSON.

 Postman is a great way to explore WebAPIs

If I like, I can create my own custom formatters and return whatever makes me happy. PDFs, vCards, even images.

Next post I'm going to explore the open source NancyFx framework and how to make minimal WebAPI using Nancy under .NET Core.


Sponsor: Thanks to Aspose for sponsoring the feed this week! Aspose makes programming APIs for working with files, like: DOC, XLS, PPT, PDF and countless more.  Developers can use their products to create, convert, modify, or manage files in almost any way. Aspose is a good company and they offer solid products. Check them out, and download a free evaluation!

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Making YouTube videos look sharp and professional on a budget

July 22, '16 Comments [19] Posted in Musings
Sponsored By

My team is doing some videos to show off some features in Visual Studio. Most of my videos or YouTubes are screencasts so the video quality of the people parts aren't a huge deal. I REALLY try to make my audio sound good but I've been somewhat lax on the video side, usually just using a webcam. While the Logitech 930e is amazing as webcams go, it's not really "pro." It looks good but it still looks and feels like a webcam in both field of view and depth of field.

image

I went looking for videos that had the look and feel I wanted and asked those folks that I admired how they did it.

I always love the way my friend Chescaleigh's YouTube videos look. They are clear and in focus, with amazing lighting and the background is "blown." That means there is a shallow depth of field with just Franchesca in focus and the background is a somewhat blurry.

Franchesca's videos are very professional

Franchesca pointed me to the Canon T3i DSLR HD camera. This is not just a nice still camera but also a very competent HD Video Camera that puts out fantastic 1080p video directly to an SD Card along with the ability to use alternate lenses. It also has options you can add on later like a remote control for focusing and starting/stopping recording.

The trick with the T3i is that it's a little older and you can find them for as little as $200-$250 on Craigslist. I've seen them cheap on Amazon as well. That makes them reasonable for a budget but again, the results look AMAZING.

I also love this video by Rachel Weil doing an overview Visual Studio Code. She steps it up with an interesting background and razor sharp focus. Her audio is also fantastic.

Rachel adds this Canon EF 50mm lens to her Canon DSLR to get a really tight focus. I haven't bought this lens yet but it's on my Amazon wishlist for the future.

Rachel's video is top notch

Good audio is so important. I tried cheap lavaliere microphones but I find I get the best results with a condenser mic held just out of frame. I like the Samson C01U but you can get decent USB Mics for <$50. Record your video and audio in separate files, and before you start talking *CLAP* very loud to make a spike in your audio, then you can line up your audio and video/audio files in your editor like iMovie or Movie Maker. Then mute the audio in your main audio/video file so you'll be hearing the high quality audio from your good mic and the high quality video from your camera.

Lining up video and audio

Finally, you need GOOD LIGHTING. ZOMG it matters so much. Even if you ignore all these tips and just use a webcam, get a nice light. Maria from my team recommended this CowboyStudio Dual Mount Brackets to let me mount a mic and lights to my camera, then I picked up this FANTASTIC 160 LED Power Panel. It's perfect because it's dimmable and includes color filters for getting different color temperatures or a diffuse effect.

image

I feel like the result is very close to the look I wanted and looks much more professional given a reasonable budget. Again, if you keep your equipment module (mic, camera, lenses, stands, lights, etc) you can improve your setup, as I have, as you have the cash.

image

How do YOU make videos that look sharp? Let me know in the comments.


Sponsor: Do you deploy the same application multiple times for each of your end customers? The team at Octopus have been trying to take the pain out of multi-tenant deployments. Check out their 3.4 beta release.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Windows 10 "Developer Mode"

July 20, '16 Comments [93] Posted in Win10
Sponsored By

imageThe new Windows 10 update coming in a few weeks. It's called Windows 10 "Anniversary Edition" (I would have just called it 10.1, because, I dunno, monotonically increasing numbers and all, but whatever) and it has a LOT of really nice refinements.

Windows 10 is continuously updated and has been a few times since release, but this most recent one adds a lot of cool stuff like support for Bash on Ubuntu for Developers. For some folks who say they "wait for version 3" - this coming update is that version 3.

One thing I've noticed - and I'm personally rooting for - is a specific section in Windows Settings that seems to be getting some more love. I'm hoping we (developers and power users) will see some real investment here. If you agree after reading this post, sound off in the comments and maybe someone at Microsoft will notice and agree.

If you go to the Settings app on these newer Windows 10 builds, you'll notice "For Developers" as a new menu item. Now, to be clear, I'm reading into this and likely adding meaning where there may not be, but I love this. It's a formal place in the operating system where I can TELL IT THAT I AM A DEVELOPER. 

I can say "I want this machine to be in developer mode."

image

Under Developer Mode in the Insiders' Builds there is a nice collection of developer and power-user related settings brought together under one roof. What's great about this is that you already know these settings. As a developer you likely install Windows and then immediately go around to Windows Explorer, the Registry, and a bunch of other places to tweak Windows to how you work as a developer.

For example, Windows Explorer. Non-technical parent doesn't need to see Hidden Files or have the Full Path in the Title Bar. But I DO, and those settings are all in one place.

image

Seriously, the "Full path in the title bar" thing is super useful. I used to say "that should be the default." Now I realize that it shouldn't be. It should be the default for Developers.

image

There's other options as well for Remote Desktop, PowerShell, and remote diagnostics.

image

Today this new Developer Mode settings page looks like a nice collection of conveniences, but I really think it's got amazing potential, again as a formal declaration that I am a developer.

In the future I'd love to see (totally brainstorming here as I am not in the Windows department) a quick way to turn on Bash on Ubuntu on Windows 10, or quickly download VSCode or Visual Studio Community, get .NET Core, install Python, install mobile device emulators, install SysInternals or prep my system for remote debugging.

What do YOU think?


Sponsor: Do you deploy the same application multiple times for each of your end customers? The team at Octopus have been trying to take the pain out of multi-tenant deployments. Check out their 3.4 beta release.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Exploring dotnet new with .NET Core

July 18, '16 Comments [31] Posted in ASP.NET | ASP.NET MVC | DotNetCore | Open Source
Sponsored By

I'm very enjoying the "dotnet" command line. Mostly I do "dotnet new" and then add to the default Hello World app with the Visual Studio Code editor. Recently, though, I realized that the -t "type" and -l "lang" options are there and I wasn't use them. I think they are a little awkward, in that you have to:

dotnet new -t Web

when I think it should be more like dotnet new [type] as in

dotnet new web

What do you think? I find the -t a little heavy. I like the idea of "web" being empty, and "web/mvc" or "web/webapi" having more fleshed out stuff. Even "web/angular," you get the idea. Sound off in the comments. Regardless, there's cool templating tooling coming, I hear, but for now there's more there than I realized.

Of course, there's the default "dotnet new" which is a Hello World console app with a program.cs and project.json. In the future I think it will just run the app, and you'll have to do something like -v verbosity to get the details that we don't usually need to see.

C:\Users\scott\Desktop\test\console>dotnet run
Project console (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling console for .NETCoreApp,Version=v1.0

Compilation succeeded.
0 Warning(s)
0 Error(s)

Time elapsed 00:00:01.1591124

Hello World!

You can add -l (lang) to it and "dotnet new -l F#" and get an F# Console app rather than a C# one:

C:\Users\scott\Desktop\test\fsharp>dotnet run fabu!
Project fsharp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Hello World!
[|"fabu!"|]

C:\Users\scott\Desktop\test\fsharp>type Program.fs
// Learn more about F# at http://fsharp.org

open System

[<EntryPoint>]
let main argv =
printfn "Hello World!"
printfn "%A" argv
0 // return an integer exit code

There's also "dotnet new -t lib" which is super basic and gives you a quick new project with a Class1 and an Empty Method. Not so useful, but good to know.

You can also "dotnet new -t xunittest" to make a new test project. Nice that this is built-in! Now I just "dotnet test" after a "dotnet restore" and I get test results!

xUnit.net .NET CLI test runner (64-bit win10-x64)
Discovering: testing
Discovered: testing
Starting: testing
Finished: testing
=== TEST EXECUTION SUMMARY ===
testing Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0.146s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.

Side Note: If the folder name of the project is the same as one of the dependencies, it can confuse the resolver. For example, I did my new test project in a folder creatively named "XUnit." This is also the name of a dependency. I got the error: Errors in C:\Users\scott\Desktop\test\xunit\project.json Cycle detected:  xunit (>= 1.0.0) -> xunit (>= 2.1.0) -> xunit (>= 2.1.0). Note that 1.0.0 there. That's my project, which is 1.0.0. Solution? Rename my project's containing folder.

There's ASP.NET Core Hello World, which is "dotnet new -t Web." This will give you a nice simple ASP.NET Core app with some simple defaults that's setup for bower, gulp, and npm usage. I anticipate we'll see varying levels of what folks consider "complete."

yo aspnet: dotnet new -t web isn't the only way to make a new ASP.NET Core project from the command line (CLI). You can also use the Yeoman generator or "yo aspnet" to make very interesting projects, as well as create your own generators. In fact, Steve Sanderson has some impressive generators like his "aspnet-spa" generator for making Angular, React, and Knockout Single Page Apps (SPA) with ASP.NET Core.

image

All these generators work on Windows, Mac, and Linux, of course. I believe the intent is to reconcile them all such that Visual Studio proper and Visual Studio Code via the CLI will all get the same "File | New Project" results. Visual Studio will still be more "visual" but everything you can do in one world can and should be possible in another.


Sponsor: Big thanks to Redgate for sponsoring the feed this week. Have you got SQL fingers? Try SQL Prompt and you’ll be able to write, refactor, and reformat SQL effortlessly in SSMS and Visual Studio. Find out more!

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Self-care matters: Pay yourself first

July 14, '16 Comments [50] Posted in Musings
Sponsored By

My sonI was meeting with a mentee today and she was commenting how stressed out she was. Overwhelmed with work, email, home, life, dinners, the news, finances...you know. LIFE. I am too. You likely are as well.

We spent about on the phone talking about how to make it better and it all came down to self-care. Sometimes we all need to be reminded that we matter. It's OK to take a moment and be selfish. You are the center of your universe and it's important to take time for yourself - to appreciate your value.

Depending on your personality type, you may give so much of yourself to your family, your work, your family and friends that you forget what's at the core! You! If you don't take care of yourself then how will you take care of everyone else?

This may seem obvious to you. If it does, that's cool. Click away. But sometimes obvious things need to be said and for my mentee and I, today, we needed to hear this and we needed a plan.

Here's some of our ideas.

  • Cancel a meeting.
    • Maybe cancel two. If you look at your day with absolute dread, is there a ball that you can drop safely? Perhaps ask a coworker if they can handle it for you?
  • Pay yourself first
    • Finances are a stressor for everyone. My wife and I used to argue about little $5 debit card things because they not only added up but they filled up the register, were hard to track, and generally distracted us from important stuff like the rent. Now we get an allowance. I don't use a credit card, I have a certain amount of cash each week (we get the same amount). I can buy Amazon Gift Cards or iTunes cards, I can eat at Chipotle whenever, or buy an Xbox game. Now when an Xbox game shows up she is interested in hearing about the game, not sweating how it was purchased. Pay yourself first.
  • Setup Formal Me-Time
    • Once a week my wife and I have a day off. From each other, from the family, just...off. I leave at 5pm and come back late. She does the same. Sometimes I see a movie, sometimes I walk around the mall, sometimes I code or play Xbox. The point is that it's MY TIME and it's formal. It's boxed and it's mine. And her time is hers. You shouldn't have to steal an hour when you're super stressed. PAY yourself an hour, up front.
    • We also do a weekly date night. Always. Gotta prioritize. I hate hearing "we haven't seen a movie or had a dinner in years...you know, kids." Nonsense. Get a sitter from the local uni and pay yourself first with TIME.
  • Self-care
    • Schedule a massage. Have your nails done (everyone should do their nails at least once). Get a haircut. Dance. Clean your office. Sleep. Do whatever it is that feeds your spirit.
  • Say no
    • Sometimes "No. I just can't right now." is enough to stop an email thread or a something when you feel you just can't. Drop the ball. Life is somewhat fault tolerant. Use your judgment of course, but truly, unless your software is saving babies, maybe take a break. Even an hour or a "mental health day" helps me no burn out.

Do you pay yourself first? Do you need to be reminded that you deserve health and happiness? Let me know in the comments.


Sponsor: Big thanks to Redgate for sponsoring the feed this week. Have you got SQL fingers? Try SQL Prompt and you’ll be able to write, refactor, and reformat SQL effortlessly in SSMS and Visual Studio. Find out more!

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.