NancyFX: .NET Web Framework

NancyFXWorking in the .NET ecosystem can feel very insular.  Especially if you work in the enterprise.  At the very beginning of my career in software development (circa late ’90s), I was generally using more open tooling and languages.  The atmosphere in those communities had (past tense) a much different feeling than it does in the .NET community.

Most developers that are in .NET can feel the changes that have been occurring recently.  There has been a bigger wave of alternative and open source software awareness within .NET.  However, I still don’t think that the .NET community at large are even aware of some of the great open source libraries and frameworks.

 ASP.NET MVC / Web Api

If you were starting new web project in .NET, I think it’s safe to say that most would automatically choose ASP.NET MVC or Web Api.  There may be legitimate reasons for doing so, such as you or your team having exiting knowledge of those frameworks.

However, NancyFX is a great alternative that is very mature, simple and has great documentation.

NancyFX

Nancy is a lightweight web framework.  It’s really that simple.

At its heart it provides a really easy way to create HTTP services.  That means you could be generating and returning HTML using the MVC pattern or creating services returning JSON.  You are not forced into either or into any heavy configuration. You are simply creating endpoints using HTTP verbs.

Getting Started

In my code examples, I’m going to be using my Self Host ASP.NET Demo application, which is currently demos how to use Katana (Owin) Self Host, Middleware, File Server and Topshelf.

I’m going to extend this project to include Nancy.

First let’s install Nancy from Nuget

Install-Package Nancy

For my example, I’m also going to need to Install the Nancy.Owin Package because my self host application uses the Katanta Owin Implementation with HttpListener.

Install-Package Nancy.Owin

Now that we have our packages installed, in your Startup class, use the new IAppBuilder.UseNancy() extension method.

Simplest Example

My intent for this blog post is simply to get people looking at Nancy as an alternative.  I can’t show you all all the wonderful features in one easy to digest post.  In posts to come I’m going to cover many different topics related to Nancy.  However, for this post I want to provide the simplest possible example of creating an HTTP endpoint using the GET verb.

Similar to ASP.NET MVC or Web Api, you will create a class that extends another.  For Nancy, we create a class that extends the NancyModule.  It is in this class were we define the routes and the endpoint implementation.   In my example above, I’ve created a HTTP GET route to /nancy/demo.  Since my self host application is running on localhost:8080, this translates to http://localhost:8080/nancy/demo.

Here are the results:

NancyFX

As you might expect, Nancy has automatically converted my .NET string array to JSON without any configuration.

Features

As I mentioned, I plan on going over in detail many features of Nancy and why you may want to use it.  But to get you interested a bit more, here are a few key points.

  • Model Binding
  • Built in IoC Container (Support for almost all others)
  • Easy Testing
  • Content Negotiation
  • View Engines (including Razor Support)
  • Multiple Hosting Options (Katana/Owin, ASP.NET HttpHandler, more)
  • Mono Support

Please take a few moments and check out the great docs over on Github.

Source Code

GithubThe source code for this demo is available on Github.

OWIN/Katana Series

If you want more information about OWIN/Katana, please take a look at my other series of posts.

  1. How to Self Host ASP.NET Web Api

  2. Self Host ASP.NET Web Api as a Windows Service

  3. ASP.NET Self Host Static File Server

  4. How to create Katana Middleware

How-To Create Katana Middleware

PipelineWhat I love about Katana (OWIN Implementation) is the ability to add functionality through the request pipeline.  In this post I’m going to extend my ASP.NET Self Host Web Api application by demonstrating how you can create your own Katana Middleware.

What’s OWIN Middleware?

OWIN specification defines middleware as:

Middleware – Pass through components that form a pipeline between a server and application to inspect, route, or modify request and response messages for a specific purpose.

Katana IAppBuilder.Use

There are couple different ways you can create your own middleware.  The simplest is to call the IAppBuild.Use method in your Startup class.

For our example, we are going to add a Product to the response header.

context is of type IOwinContextnext is of Func<Task>

IOwinContext contains the Request, Response, Environment and other properties you can access to manipulate the request or response.

Middleware Type

Another way to create middlware is by creating your own class that extends and overrides the OwinMiddleware base class.

For this example, we are going to add a MachieName to the response header.

In order to include our new middleware class into the pipleline, you must call the IAppBuilder.Use in your Startup class, but this time specifying the type of our class.

Notice we aren’t passing an instance of our CustomMiddlware but just the type.

Startup Class

After adding our two new middlware that are adding headers to the response, here is what our Startup class now looks like.

Now when I run the application and make a HTTP call to http://localhost:8080, the headers returned are:

owin

Source Code

GithubThe source code for this demo is available on Github.

OWIN/Katana Series

If you want more information about OWIN/Katana, please take a look at my other series of posts.

  1. How to Self Host ASP.NET Web Api

  2. Self Host ASP.NET Web Api as a Windows Service

  3. ASP.NET Self Host Static File Server

ASP.NET Self Host Static File Server

Continuing in my Owin and Katana series of blog posts, I’m going to demo an ASP.NET Self Host Static File Server. If you have not seen my previous posts in this series, I’ve covered how to self host a Web Api application and how to use Topshelf to debug and run as a windows service.

The wonderful thing about the shift to Owin and Katana with ASP.NET is middleware.

Katana has a file server implementation that you can plugin to your application startup pipeline in order to serve static files either on a filesystem or from embedded resources.

Middleware

The first thing we will do with our demo application is install the Owin StaticFiles middlware into our project.

Install-Package Microsoft.Owin.StaticFiles

The simplest possible configuration is to call IAppBuilder.UseFileServer(true).  This will enable directory browsing of files from the current location of the executable.

When running our demo application, this results in showing us the directory listing when we pass thru our Web API routes without a match.

staticfiles1

Now this isn’t very useful but it displays the simplicity of different Owin middlewares that are available.

UseFileServer has several different overloads:

Name Description
System_CAPS_pubmethodSystem_CAPS_static UseFileServer(IAppBuilder)

Enable all static file middleware (except directory browsing) for the current request path in the current directory.

System_CAPS_pubmethodSystem_CAPS_static UseFileServer(IAppBuilder, Boolean)

Enable all static file middleware on for the current request path in the current directory.

System_CAPS_pubmethodSystem_CAPS_static UseFileServer(IAppBuilder, FileServerOptions)

Enable all static file middleware with the given options

System_CAPS_pubmethodSystem_CAPS_static UseFileServer(IAppBuilder, String)

Enables all static file middleware (except directory browsing) for the given request path from the directory of the same name

For our demo application, we are going to create our File Server to serve files from an Assets directory that lives in the same location as our executable.

Now when we browse we see the files within the Assets directory.

staticfiles2

Content Type Provider

The Katana FileServer only serves known content types.  If you try and browse to a file that is not a known content type, it will return a 404.

In my example above, I’ve added a data.json file.  Odd to me was that a json file is not a known content type.  In order to serve json files, we must create our own content type provider and add our mappings.

Now we need to specify our CustomContentProvider in our FileServerOptions.

Source Code

GithubThe source code for this demo is available on Github.