Two weeks ago, I had an amazing opportunity to be at Microsoft Build Conference in San Francisco as an attendee thanks to my amazing company Redgate. The experience was truly unique and amount of people I have met there was huge. A bit late but I would like to share my experience about the conference with you in this post by highlighting what has happened and giving you my personal takeaways. You can also check out my tweets for the Build conference.
Announcements
There were bunch of big and small announcements throughout the conference from Microsoft. Some of these were highlighted during two keynotes and some other announcements were spread to three days. I tried to capture all of them here but it's very likely I missed some of them (mostly the small ones):
- Running Bash on Ubuntu on Windows has been announced. This is not something like Cygwin or anything. It basically runs Ubuntu on Windows without the Unix kernel. So, the things we all love like apt-get works as you expect it to work. This is a new developer feature included in a Windows 10 "Anniversary" update which is coming soon (as they say). You can watch Running Bash on Ubuntu on Windows video, check Windows Command Line Improvements session from Build 2016 or Scott Hanselman's Channel 9 interview on Linux Command Line on Windows.
- Xamarin in Visual Studio is now available at no extra cost. Xamarin will be in every edition of Visual Studio, including the widely-available Visual Studio Community Edition, which is free for individual developers, open source projects, academic research, education, and small professional teams. You can also read Mobile App Development made easy with Visual Studio and Xamarin post up on VS blog.
- There is now an iPhone simulator on Windows which comes with Xamarin. This still requires a Mac to build the project AFAIK.
- Mono Project is now part of the .NET Foundation and is now under MIT License.
- Visual Studio 2015 Update 2 RTM has been made available to public. You can read more about this on VS Blog.
- Visual Studio "15" Preview has been made available to public. This is different than VS 2015 and has a very straight forward install experience. I recommend watching The Future of Visual Studio session or The Future of Visual Studio Channel 9 live interview from Build 2016 or read Visual Studio “15” Preview Now Available blog post if you want to learn more.
- Related to both VS 2015 Update 2 and VS 15 Preview, see What’s New for C# and VB in Visual Studio post on .NET Blog. You will see mostly features that ReSharper had for long time now.
- Microsoft announced its Bot Framework.
- The HoloLens SDK and emulator is now live.
- Cognitive Services has been announced. This service is exposing several machine learning algorithms as a service and allows you to hook them into your apps through several HTTP based APIs like Computer Vision API. Some portions of this service was known as Project Oxford which was the codename. Try out https://www.captionbot.ai/ which is built on top of these APIs.
- Azure Service Fabric has stepped outside the preview and is now GA. Microsoft has given a lot of attention to this service throughout the conference, including the keynote (starting from 0:52:42). You can also check out Azure Service Fabric for Developers and Building MicroServices with Service Fabric sessions from Build 2016 for more deep info on this.
- Virtual Machine Scale Sets is now GA.
- Azure released a new service called Azure Functions. Azure Functions introduces an event driven, compute-on-demand experience that builds on Azure’s market leading PaaS platform. This is Azure's offering which is very similar to AWS Lambda. You can read Introducing Azure Functions blog post and Introducing Azure Functions session from Build 2016 for more info.
- Several announcements has been made for DocumentDB, Microsoft’s hosted NoSQL offering on Azure.
-
- Protocol support for MongoDB: Applications can now easily and transparently communicate with DocumentDB using existing, community supported Apache MongoDB APIs and drivers. The DocumentDB protocol support for MongoDB is now in preview. This is a very strategic move to make up for the lack of standalone local installation option which is the most wanted feature for DocumentDB.
- Global databases: DocumentDB global databases are now available in preview, visit the sign-up page for more information.
- Updated pricing and scale options.
- Azure IoT Starter Kits have been released. There were many other stuff on IoT part. You can see the official post on Azure Blog for them.
- Power BI Embedded has been made available as a preview service.
- Announcing the publication of Parse Server with Azure Managed Services
- Announcing the .NET Framework 4.6.2 Preview
- Windows 10 Anniversary SDK is bringing exciting opportunities to developers
Sessions
Here is the list of sessions I have attended:
- First Day Keynote
- The Future of Visual Studio: It was a great session to watch even if there were demo failures, which were understandable considering the state of the product. Debugging on Ubuntu through VS Preview 15 was my favorite of the session.
- What's New in TypeScript?: It's always interesting and useful to watch Andres talking about languages. On this session, the part where he talk about non-nullable support on TypeScript was really beneficial.
- Building Resilient Services: Learning Lessons from Azure with Mark Russinovich: This is like a tradition for build. Mark Rus. talked about architectural and design decisions on Azure platform, mostly driven from real use cases.
- Second Day Keynote
- .NET Overview: Very valuable session to understand the future of .NET.
- Introducing ASP.NET Core 1.0: Very basic intro on ASP.NET Core 1.0. It is useful to watch if you have no idea what is coming up on ASP.NET Core 1.0. Check the docs, too.
- Enhancing Your Application with Machine Learning Through APIs
- Visual Studio 2015 Extensibility: Mads Kristensen has built a VS extension, properly open sourced it and published it on the stage: https://github.com/madskristensen/FileDiffer
- Azure Data Lake and Azure Data Warehouse: Applying Modern Practices to Your App: This was a really vague, hard-to-follow session but I plan to watch it again. I find messaging on Data Lake a bit confusing.
- Deploying ASP.NET Core Applications: Enjoyed this a lot, Dan laid out several cases in terms of deployment of ASP.NET Core applications.
As much as I wanted to attend some other sessions, I missed some of them mostly due to clashes with other sessions. Luckily recordings for all Build 2016 sessions are available up on Channel 9. Here is my list of sessions to catch up:
- The Future of C#: This was really entertaining and informative to watch and see what the future of C# might bring.
- Building Apps in Azure Using Windows and Linux VMs: Really good overall picture on the current state of Azure IaaS
- Cross-Platform Mobile with Xamarin
- Delivering Applications at Scale with DocumentDB, Azure's NoSQL Document Database
- Microsoft Cognitive Services: Build smarter and more engaging experiences
- Windows 10 IoT Core: From Maker to Market
- Setting the Stage: The Application Platform in Windows Server 2016
- Introducing Azure Functions
- ASP.NET Core Deep Dive into MVC
- Advanced Analytics with R and SQL
- Using the Right Networking API for Your UWP App
- SQL Database Technologies for Developers
- Building Applications Using the Azure Container Service
There were also many good Channel 9 Live interviews. You can find them here. Here is a personal list of a few which are worth listening to:
- Anders Live
- Jeffrey Snover on Azure Stack, Powershell, and Nano Server
- The Future of .NET Languages
- Linux Command Line on Windows
- The Future of Visual Studio
- Moving Forward with ASP.NET
- Docker Tooling for Visual Studio and ASP.NET Core
- Xamarin Live
- Mark Russinovich Live
- Data Science on Azure
- International Space Station Project
Personal Takeaways
All in all it has been a great conference and as stated, I am still catching up on the stuff that I have missed. Throughout the conference, I have picked up a few key points and I want to end the post with those:
- I have seen more from Microsoft to make developers lives easier and more productive by enabling new tools (Bash on Ubuntu on Windows), supporting multiple platforms (Service Fabric to run on every environment including AWS, on-premises, Azure Stack and preview of Service Fabric on Linux), open sourcing more (some parts of Xamarin have gone open source) and making existing paid tools available for free (Xamarin is now free).
- Microsoft is more focused on getting their existing services together and trying to give a cohesive ecosystem for developers. Service Fabric, Cognitive Services, Data Lake is a few examples of this.
- .NET Core and CoreCLR is approaching to finalization for v1. After RC2, I don't suppose there will be much more features added or concepts changing.
- I think this is the first time I have seen stabilization on client Apps story for Microsoft. Universal Windows Platform (UWP) was the focus on this area this year and it was the same on previous year.
- I am absolutely happy to see Microsoft abandoning Windows Phone day by day. There was no direct sessions on it during the conference.
- There were more steps towards making software to manage people's lives in a better way. Skype Bot Framework was one of these steps.
- Microsoft (mostly Azure group) invests on IoT solutions heavily. Azure Functions and new updates on Azure IoT Suite are just a few signs of this.
- Azure Resource Manager (ARM) and ARM templates are getting a lot of love from Microsoft and it's the way they push forward. They even build new services on Azure on top of this.
We have a lot of hosting options with ASP.NET 5 under different operating systems and under different web servers like IIS. Filip W has a great blog post on Running ASP.NET 5 website under IIS. Here, I want to show you how it would look like to expose ASP.NET 5 through NGINX, provide a simple load balancing mechanism running locally and orchestrate this through Docker Compose.
sweet, finally! #aspnet5 + #nginx + #docker + #dockercompose and simple load balancing :) https://t.co/YnJamDubIS pic.twitter.com/pBOWDDnVHR
— Tugberk Ugurlu (@tourismgeek) January 16, 2016
It is not like we didn't have these options before in .NET web development world. To give you an example, you can perfectly run an ASP.NET Web API application under mono and expose it to outside world behind NGINX. However, ASP.NET 5 makes these options really straight forward to adopt.
The end result we will achieve here will have the below look and you can see the sample I have put together for this here:
ASP.NET 5 Application on RC1
For this sample, I have a very simple APS.NET 5 application which gives you an hello message and lists the environment variables available under the machine. The project structure looks like this:
tugberk@ubuntu:~/apps/aspnet-5-samples/nginx-lb-sample$ tree . ├── docker-compose.yml ├── docker-nginx.dockerfile ├── docker-webapp.dockerfile ├── global.json ├── nginx.conf ├── NuGet.Config ├── README.md └── WebApp ├── hosting.json ├── project.json └── Startup.cs
I am not going to put the application code here but you can find the entire code here. However, there is one important thing that I want to mention which is the server URL you will expose ASP.NET 5 application through Kestrel. To make Docker happy, we need to expose the application through "0.0.0.0" rather than localhost or 127.0.0.1. Mark Rendle has a great resource on this explaining why and I have the following hosting.json file which also covers this issue:
{ "server": "Microsoft.AspNet.Server.Kestrel", "server.urls": "http://0.0.0.0:5090" }
Running ASP.NET 5 Application under Docker
The next step is to run the ASP.NET 5 application under Docker. With the ASP.NET Docker image on Docker Hub, this is insanely simple. Again, Mark Rendle has three amazing posts on ASP.NET 5, Docker and Linux combination as Part 1, Part 2 and Part 3. I strongly encourage you to check them out. For my sample here, I have the below Dockerfile (reference to the file):
FROM microsoft/aspnet:1.0.0-rc1-update1 COPY ./WebApp/project.json /app/WebApp/ COPY ./NuGet.Config /app/ COPY ./global.json /app/ WORKDIR /app/WebApp RUN ["dnu", "restore"] ADD ./WebApp /app/WebApp/ EXPOSE 5090 ENTRYPOINT ["dnx", "run"]
That's all I need to be able to run my ASP.NET 5 application under Docker. What I can do now is to build the Docker image and run it:
docker build -f docker-webapp.dockerfile -t hellowebapp . docker run -d -p 5090:5090 hellowebapp
The container now running in a detached mode and you should be able to hit the HTTP endpoint from your host:
From there, you do whatever you want to the container. Rebuild it, stop it, remove it, so and so forth.
NGINX and Docker Compose
Last pieces of the puzzle here are NGINX and Docker Compose. For those of who don't know what NGINX is: NGINX is a free, open-source, high-performance HTTP server and reverse proxy. Under production, you really don't want to expose Kestrel to outside world directly. Instead, you should put Kestrel behind a mature web server like NGINX, IIS or Apache Web Server.
There are two great videos you can watch on Kestrel and Linux hosting which gives you the reasons why you should put Kestrel behind a web server. I strongly encourage you to check them out before putting your application on production in Linux.
Docker Compose, on the other hand, is a completely different type of tool. It is a tool for defining and running multi-container Docker applications. With Compose, you use a Compose file (which is a YAML file) to configure your application’s services. This is a perfect fit for what we want to achieve here since we will have at least three containers running:
- ASP.NET 5 application 1 Container: An instance of the ASP.NET 5 application
- ASP.NET 5 application 2 Container: Another instance of the ASP.NET 5 application
- NGINX Container: An NGINX process which will proxy the requests to ASP.NET 5 applications.
Let's start with configuring NGINX first and make it possible to run under Docker. This is going to very easy as NGINX also has an image up on Docker Hub. We will use this image and tell NGINX to read our config file which looks like this:
worker_processes 4;
events { worker_connections 1024; }
http {
upstream web-app {
server webapp1:5090;
server webapp2:5090;
}
server {
listen 80;
location / {
proxy_pass http://web-app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
This configuration file has some generic stuff in it but the most importantly, it has our load balancing and reverse proxy configuration. This configuration tells NGINX to accept requests on port 80 and proxy those requests to webapp1:5090 and webapp2:5090. Check out the NGINX reverse proxy guide and load balancing guide for more information about how you can customize the way you are doing the proxying and load balancing but the above configuration is enough for this sample.
There is also an important part in this NGINX configuration to make Kestrel happy. Kestrel has an annoying bug in RC1 which has been already fixed for RC2. To work around the issue, you need to set "Connection: keep-alive" header which is what we are doing with "proxy_set_header Connection keep-alive;" declaration in our NGINX configuration.
Here is what NGINX Dockerfile looks like (reference to the file):
FROM nginx COPY ./nginx.conf /etc/nginx/nginx.conf
You might wonder at this point about what webapp1 and webapp2 (which we have indicated inside the NGINX configuration file) map to. These are the DNS references for the containers which will run our ASP.NET 5 applications and when we link them in our Docker Compose file, the DNS mapping will happen automatically for container names. Finally, here is what out composition looks like inside the Docker Compose file (reference to the file):
webapp1: build: . dockerfile: docker-webapp.dockerfile container_name: hasample_webapp1 ports: - "5091:5090" webapp2: build: . dockerfile: docker-webapp.dockerfile container_name: hasample_webapp2 ports: - "5092:5090" nginx: build: . dockerfile: docker-nginx.dockerfile container_name: hasample_nginx ports: - "5000:80" links: - webapp1 - webapp2
You can see under the third container definition, we linked previously defined two containers to NGINX container. Alternatively, you may want to look at Service Discovery in context of Docker instead of linking.
Now we have everything in place and all we need to do is to run two docker-compose commands (under the directory where we have Docker Compose file) to get the application up and running:
docker-compose build docker-compose up
After these, we should see three containers running. We should also be able to hit localhost:5000 from the host machine and see that the load is being distributed to both ASP.NET 5 application containers:
Pretty great! However, this is just sample for demo purposes to show how simple it is to have an environment like this up an running locally. This probably provides no performance gains when you run all containers in one box. My next step is going to be to get HAProxy in this mix and let it do the load balancing instead.
I had the pleasure of attending CodeMash this year to give two talks. The conference was generally good, there were lots of people from the several parts of the World and I got to meet a lot of smart and amazing people.
I only had a chance to attend the last two days of the conference and during those days, I attended several talks and missed bunch of good ones (and there are no recordings which makes me sad):
- Docker in production? Done that, what’s next?
- The Code Behind the Vulnerability
- From Power Chords to Power of Models: Insights from History of Rock Music via Machine Learning
- From Developer to Manager
- Introducing the new ASP.NET Authorization and Data Protection Stacks
- Fun with Mind Reading: Using EEG and Azure Machine Learning to Perform Lie Detection
- Cloud Design Patterns for Scalability and Performance
- Got Documents? An exploration of document databases in software architecture.
- Cross-Platform Desktop Apps with Electron
I learnt some new things in every sessions which is a great feeling. Especially, the Jennifer Marsman’s session on combination of EEG + Machine Learning + Lie Detection was absolutely mind-blowing to watch. I don’t think I have blinked during the entire session :)
Here are a few things I took away from the conference by attending sessions and talking to people:
- Polyglot persistence is a general topic of interest and people are leaning towards this road.
- People try to apply or understand Microservices and its benefits.
- Docker makes the above two approaches easy to adopt and people are aware of that.
- Lots of concern around how to move to ASP.NET 5, especially to .NET Core.
- Machine learning opens up a lot of interesting possibilities for IoT products and service based solutions.
- Migrations based approach is definitely a must to have on the DLM process.
Lots of these are nice to see since they validated some of my thoughts and confirmed that I am on the right track. Some of them gave me new excitements and it didn’t take long to accept the challenges :)
Late but better than never :) #RaspberryPi pic.twitter.com/s5Yz0hnx4x
— Tugberk Ugurlu (@tourismgeek) January 10, 2016
The best part of the conference was that I had a chance to meet lots of new people and put a face on some that I have known through Twitter like Matt Johnson, Barry Dorrans, Darrel Miller and lots of other amazing people.
As mentioned in my previous post, I gave two talks on ASP.NET 5 and Database Lifecycle Management. I made sure that the resources I have shown are available online. CodeMash organizers maintain a GitHub repository for resources of all the sessions. I have put ASP.NET 5 talk resources and DLM talk resources there, too.
ASP.NET 5: Getting Your Cheese Back
Slides for this talk are available under my Speaker Deck account.
You can also find the samples I used during the session under the aspnet-5-samples GitHub repository (permalink to the version used during the presentation). I also showed another sample which made use of Docker and Docker Compose: ModernShopping.
Database Lifecycle Management: Getting it Right
Again, slides for this talk is also available under my Speaker Deck account.
The demo application I have used during the session is available here (permalink to the version used during the presentation).
Conclusion
Overall, it was a great experience to be there. I want to thank CodeMash organizers for inviting me to speak at the conference. It was a really valuable opportunity for me to stand in front of that amazing crowd. I also want to thank Redgate and for covering my travel expenses and sparing me for the time of the conference. I want to emphasize again that Redgate is an amazing company to be part of!
Redgate has several opportunities that might fit you. I highly encourage you to check them out.
I want to end this post with a reference to a tweet which shows the message David Neal gave at the end of his talk (which was the last talk of CodeMash):
Nice ending to the conf #codemash pic.twitter.com/dYrkC9Fq0h
— Tugberk Ugurlu (@tourismgeek) January 8, 2016
I have been following ASP.NET 5 development from the very start and it has been an amazing experience so far. This new platform has seen so many changes both on libraries and concepts throughout but the biggest of all is about to come. The new command line tools that ASP.NET 5 brought to us like dnx and dnu will vanish soon. However, this doesn’t mean that we won’t have a command line first experience. Concepts of these tools will be carried over by a new command line tool: dotnet CLI.
Note that dotnet CLI is not even a beta yet. It’s very natural that some of the stuff that I show below may change or even be removed. So, be cautious.
Scott Hanselman gave an amazing introduction to this tool in his blog post. As indicated in that post, new dotnet CLI tool will give a very similar experience to us compared to other platforms like Go, Ruby, Python. This is very important because, again, this will remove another entry barrier for the newcomers.
You can think of this new CLI tool as combination of following three in terms of concepts:
- csc.exe
- msbuild.exe
- nuget.exe
Of course, this is an understatement but it will help you get a grasp of what that tools can do. One other important aspect of the tool is to be able to bootstrap your code and execute it. Here is how:
In order to install dotnet CLI tool into my Ubuntu machine, I just followed the steps on the Getting Started guide for Ubuntu.
Step one is to create a project structure. My project has two files under "hello-dotnet" folder. Program.cs:
using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
project.json:
{ "version": "1.0.0-*", "compilationOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.Runtime": "1.0.1-beta-*", "System.IO": "4.0.11-beta-*", "System.Console": "4.0.0-beta-*", "System.Runtime": "4.0.21-beta-*" }, "frameworks": { "dnxcore50": { } } }
These are the bare essentials that I need to get something outputted to my console window. One important piece here is the emitEntryPoint bit inside the project.json file which indicates that the module will have an entry point which is the static Main method by default.
The second step here is to restore the defined dependencies. This can be done through the "dotnet restore" command:
Finally, we can now execute the code that we have written and see that we can actually output some text to console. At the same path, just run "dotnet run" command to do that:
Very straight forward experience! Let’s just try to compile the code through "dotnet compile" command:
Notice the "hello-dotnet" file there. You can think of this file as dnx which can just run your app. It’s basically the bootstrapper just for your application.
So, we understand that we can just run this thing:
Very nice! However, that’s not all! This is still a .NET application which requires a few things to be in place to be executed. What we can also do here is to compile native, standalone executables (just like you can do with Go).
Do you see the "--native" switch? That will allow you to compile the native executable binary which will be specific to the acrhitecture that you are compiling on (in my case, it’s Ubuntu 14.04):
"hello-dotnet" file here can be executed same as the previous one but this time, it’s all machine code and everything is embedded (yes, even the .NET runtime). So, it’s very usual that you will see a significant increase in the size:
This is a promising start and amazing to see that we have a unified tool to rule them all (famous last words). The name of the tool is also great, it makes it straight forward to understand based on your experiences with other platforms and seeing this type of command line first architecture adopted outside of ASP.NET is also great and will bring consistency throughout the ecosystem. I will be watching this space as I am sure there will be more to come :)
Resources
Attending a developer conference is an amazing way to start a new year. I love conferences because it’s where I learn the most. I am a believer of experience driven life and the conferences is the best place where you can learn about other people’s experiences and different cultures. 2016 will start for me with CodeMash, a unique event that will educate developers on current practices, methodologies, and technology trends in a variety of platforms and development languages such as Java, .NET, Ruby, Python and PHP. The conference will be held in Sandusky, Ohio between 5th and 8th of January, 2016. I will be talking about two topics at the conference and both of those talks will be held on the last day of the conference, 8th of January, Friday.
First one is at 08:30 AM: ASP.NET 5: How to Get Your Cheese Back. This is mainly targeted for people who are interested in learning what are the main reasons to adopt ASP.NET 5 and what it will bring to the table. Even if you haven’t done any .NET development before, you will still find a lot of interesting things here as I believe that one of the biggest advantage of the new .NET ecosystem is that there are no big entry barriers for newcommers anymore.
My last talk is going to be on DLM (Database Lifecycle Management), at 11:00 AM: Database Lifecycle Management: Getting it Right. If you are working with an RDBMS in your daily job and want to automate the release process of the changes, you will definitely find something valuable in this talk. I will be mainly giving the examples for SQL Server changes by using DLM Automation Suite tools but this talk is not about tools and SQL Server. It’s all about concepts and challenges of managing the lifecycle of the database schema.
Unfortunately, I will be able to only attend the last two days of the conference but that’s better than nothing. I am so excited about the conference and if you are going to be there, ping me (through Twitter, LinkedIn, etc.) to have a chat and meet. See you there :)

- .net
- .NET Core
- Algorithms
- Architecture
- ASP.Net
- ASP.NET 5
- ASP.NET Core
- ASP.NET MVC
- ASP.NET vNext
- ASP.NET Web API
- Assignments
- async
- Autofac
- Azure
- Azure Search
- Azure Storage
- Azure Web Apps
- Bash
- Blob Storage
- Blogging
- Business
- C#
- Caching
- Career
- Code Review
- Cognitive Services
- Concurrency
- Congress & Convention Tourism
- Continious Delivery
- Continuous Delivery
- Continuous Integration
- Data Structures
- DbContext
- Deployment
- Deployments
- Dexter
- DLM
- Docker
- Docker Compose
- eCommerce
- Elasticsearch
- Entity Framework
- Excel
- Facts & Figures
- Geek Talks
- Git
- GitHub
- Graph
- gulp
- Hosting
- HTTP
- Identity
- IIS
- IoT
- IT Stuff
- JavaScript
- JQuery
- Katana
- Linux
- Lucene.NET
- Machine Learning
- Microsoft
- Microsoft Azure
- Microsoft Office
- Microsoft SQL Server
- MongoDB
- MS SQL
- MvcScaffolding
- MVP
- Neo4j
- NGINX
- nodejs
- NuGet
- OAuth
- Octopus Deploy
- OWIN
- Polyglot Persistance
- PowerShell
- Programming
- Projects
- Random
- RavenDB
- Razor
- React
- Redis
- Redux
- Roslyn
- Scaling
- Search
- Security
- SemVer
- SignalR
- Software
- Software Development
- Software Engineer
- SQL Injection
- SQL Release
- SQL Server
- Tech Guys
- Time Saviour
- Tips
- Tourism
- Tourism Business
- TourismGeek
- TPL
- Travis CI
- tugberkugurlu.com
- TV Series
- Unit Testing
- UNWTO
- UX
- Visual Basic
- Visual Studio
- WCF Web API
- Web
- Web Application
- Web.Config
- Windows 8
- Windows Azure
- Windows Live Writer
- Windows Server AppFabric
- xUnit