A functional ASP.NET Core micro web framework for building rich web applications.
Read this blog post on functional ASP.NET Core for more information.
Windows | Linux |
---|---|
- About
- Getting Started
- Documentation
- Sample applications
- Benchmarks
- Building and developing
- Contributing
- Nightly builds and NuGet feed
- Blog posts
- Videos
- License
- Contact and Slack Channel
Giraffe is an F# micro web framework for building rich web applications. It has been heavily inspired and is similar to Suave, but has been specifically designed with ASP.NET Core in mind and can be plugged into the ASP.NET Core pipeline via middleware. Giraffe applications are composed of so called HttpHandler
functions which can be thought of a mixture of Suave's WebParts and ASP.NET Core's middleware.
If you'd like to learn more about the motivation of this project please read my blog post on functional ASP.NET Core (some code samples in this blog post might be outdated today).
Giraffe is intended for developers who want to build rich web applications on top of ASP.NET Core in a functional first approach. ASP.NET Core is a powerful web platform which has support by Microsoft and a huge developer community behind it and Giraffe is aimed at F# developers who want to benefit from that eco system.
It is not designed to be a competing web product which can be run standalone like NancyFx or Suave, but rather a lean micro framework which aims to complement ASP.NET Core where it comes short for functional developers. The fundamental idea is to build on top of the strong foundation of ASP.NET Core and re-use existing ASP.NET Core building blocks so F# developers can benefit from both worlds.
You can think of Giraffe as the functional counter part of the ASP.NET Core MVC framework.
The easiest way to get started with Giraffe is by installing the giraffe-template
package, which adds a new template to your dotnet new
command line tool:
dotnet new -i "giraffe-template::*"
Afterwards you can create a new Giraffe application by running dotnet new giraffe
.
For more information about the Giraffe tempalte please visit the official giraffe-template repository.
Install the Giraffe NuGet package:
PM> Install-Package Giraffe
Create a web application and plug it into the ASP.NET Core middleware:
open Giraffe
let webApp =
choose [
route "/ping" >=> text "pong"
route "/" >=> htmlFile "/pages/index.html" ]
type Startup() =
member __.ConfigureServices (services : IServiceCollection) =
// Register default Giraffe dependencies
services.AddGiraffe() |> ignore
member __.Configure (app : IApplicationBuilder)
(env : IHostingEnvironment)
(loggerFactory : ILoggerFactory) =
// Add Giraffe to the ASP.NET Core pipeline
app.UseGiraffe webApp
[<EntryPoint>]
let main _ =
WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build()
.Run()
0
Instead of creating a Startup
class you can also add Giraffe in a more functional way:
open Giraffe
let webApp =
choose [
route "/ping" >=> text "pong"
route "/" >=> htmlFile "/pages/index.html" ]
let configureApp (app : IApplicationBuilder) =
// Add Giraffe to the ASP.NET Core pipeline
app.UseGiraffe webApp
let configureServices (services : IServiceCollection) =
// Add Giraffe dependencies
services.AddGiraffe() |> ignore
[<EntryPoint>]
let main _ =
WebHostBuilder()
.UseKestrel()
.Configure(Action<IApplicationBuilder> configureApp)
.ConfigureServices(configureServices)
.Build()
.Run()
0
For more information please check the official Giraffe documentation.
There is a few sample applications which can be found in the /samples
folder:
Sample | Description |
---|---|
GoogleAuthApp | Demonstrates how Google Auth can be used with Giraffe. |
IdentityApp | Demonstrates how ASP.NET Core Identity can be used with Giraffe. |
JwtApp | Demonstrates how JWT tokens can be used with Giraffe. |
SampleApp | Generic sample application showcasing multiple features such as file uploads, cookie auth, model binding and validation, etc. |
The web service https://buildstats.info uses Giraffe to build rich SVG widgets for Git repositories. The application runs as a Docker container in the Google Container Engine (see CI-BuiltStats on GitHub for more information).
More sample applications will be added in the future.
Currently Giraffe has only been tested against a simple plain text route and measured the total amount of handled requests per second. The latest result yielded an average of 79093 req/s over a period of 10 seconds, which was only closely after plain Kestrel which was capable of handling 79399 req/s on average.
Please check out Jimmy Byrd's dotnet-web-benchmarks for more details.
Giraffe is built with the latest .NET Core SDK.
You can either install Visual Studio 2017 which comes with the latest SDK or manually download and install the .NET SDK 2.0.
After installation you should be able to run the .\build.ps1
script to successfully build, test and package the library.
The build script supports the following flags:
-IncludeTests
will build and run the tests project as well-IncludeSamples
will build and test the samples project as well-All
will build and test all projects-Release
will build Giraffe with theRelease
configuration-Pack
will create a NuGet package for Giraffe and giraffe-template.-OnlyNetStandard
will build Giraffe only targeting the NETStandard1.6 framework
Examples:
Only build the Giraffe project in Debug
mode:
PS > .\build.ps1
Build the Giraffe project in Release
mode:
PS > .\build.ps1 -Release
Build the Giraffe project in Debug
mode and also build and run the tests project:
PS > .\build.ps1 -IncludeTests
Same as before, but also build and test the samples project:
PS > .\build.ps1 -IncludeTests -IncludeSamples
One switch to build and test all projects:
PS > .\build.ps1 -All
Build and test all projects, use the Release
build configuration and create all NuGet packages:
PS > .\build.ps1 -Release -All -Pack
In order to successfully run the build script on Linux or macOS you will have to install PowerShell for Linux or Mac.
Additionally you will have to install the latest version of Mono and execute the ./build.sh
script which will set the correct FrameworkPathOverride
before subsequently executing the ./build.ps1
PowerShell script.
Currently the best way to work with F# on .NET Core is to use Visual Studio Code with the Ionide extension. Intellisense and debugging is supported with the latest versions of both.
Help and feedback is always welcome and pull requests get accepted.
- First open an issue to discuss your changes
- After your change has been formally approved please submit your PR against the develop branch
- Please follow the code convention by examining existing code
- Add/modify the
README.md
as required - Add/modify unit tests as required
- Please document your changes in the upcoming release notes in
RELEASE_NOTES.md
- PRs can only be approved and merged when all checks succeed (builds on Windows and Linux)
When contributing to this repository, please first discuss the change you wish to make via an open issue before submitting a pull request. For new feature requests please describe your idea in more detail and how it could benefit other users as well.
Please be aware that Giraffe strictly aims to remain as light as possible while providing generic functionality for building functional web applications. New feature work must be applicable to a broader user base and if this requirement cannot be sufficiently met then a pull request might get rejected. In the case of doubt the maintainer might rather reject a potentially useful feature than adding one too many. This measure is to protect the repository from feature bloat and shall not be taken personally.
When making changes please use existing code as a guideline for coding style and documentation. For example add spaces when creating tuples ((a,b)
--> (a, b)
), annotating variable types (str:string
--> str : string
) or other language constructs.
Examples:
let someHttpHandler:HttpHandler =
fun (ctx:HttpContext) next -> task {
// Some work
}
should be:
let someHttpHandler : HttpHandler =
fun (ctx : HttpContext) (next : HttpFunc) ->
task {
// Some work
}
If you intend to add or change an existing HttpHandler
then please update the README.md
file to reflect these changes there as well. If applicable unit tests must be added or updated and the project must successfully build before a pull request can be accepted.
The develop
branch is the main and only branch which should be used for all pull requests. A merge into develop
means that your changes are scheduled to go live with the very next release, which could happen any time from the same day up to a couple weeks (depending on priorities and urgency).
Only pull requests which pass all build checks and comply with the general coding guidelines can be approved.
If you have any further questions please let me know.
You can file an issue on GitHub or contact me via https://dusted.codes/about.
All official Giraffe packages are published to the official and public NuGet feed.
Unofficial builds (such as pre-release builds from the develop
branch and pull requests) produce unofficial pre-release NuGet packages which can be pulled from the project's public NuGet feed on AppVeyor:
https://ci.appveyor.com/nuget/giraffe
If you add this source to your NuGet CLI or project settings then you can pull unofficial NuGet packages for quick feature testing or urgent hot fixes.
Please be aware that unofficial builds have not gone through the scrunity of offical releases and their usage is on your own risk.
- Functional ASP.NET Core
- Functional ASP.NET Core part 2 - Hello world from Giraffe
- Evolving my open source project from a one man repository to an OSS organisation
- Extending the Giraffe template with different view engine options
- Announcing Giraffe 1.0.0
- Giraffe 1.1.0 - More routing handlers, better model binding and brand new model validation API
- Carry On! … Continuation over binding pipelines for functional web (by Gerard)
- A Functional Web with ASP.NET Core and F#'s Giraffe (by Scott Hanselman)
- Build a web service with F# and .NET Core 2.0 (by Phillip Carter)
- Giraffe brings F# functional programming to ASP.Net Core (by Paul Krill from InfoWorld)
- JSON Web Token with Giraffe and F# (by David Sinclair)
- WebSockets with Giraffe and F# (by David Sinclair)
If you have blogged about Giraffe, demonstrating a useful topic or some other tips or tricks then please feel free to submit a pull request and add your article to this list as a reference for other Giraffe users. Thank you!
- Getting Started with ASP.NET Core Giraffe (by Ody Mbegbu)
- Nikeza - Building the Backend with F# (by Let's Code .NET)
If you have any further questions feel free to reach out to me via any of the mentioned social media on https://dusted.codes/about or join the #giraffe
Slack channel in the Functional Programming Slack Team. Please use this link to request an invitation to the Functional Programming Slack Team if you don't have an account registered yet.