Friday, 6 October 2017

Creating and Deploying .Net core application in Windows/Linux/Mac


 Hello friends, I have just learned .Net Core last week and created a Web API application in windows and deployed the same as standalone in windows, ubuntu, and Mac. It worked without any issue on all three platforms, so I thought of writing my first blog on creating a simple Web API application using dotnet CLI(Command-Line Interface) and visual studio in windows and deploying them on all other platforms.



Let's get started........

Creating a sample WEB API project:

First, we will install .net core 2.0.0 in our windows system
Go to link: https://www.microsoft.com/net/core 
Download .Net Core SDK for windows and install by executing the dotnet-SDK-2.0.0(downloaded file name)
Now check if it's installed with version 2.0.0 by running command “dotnet –version” in cmd.


Check dotnet core version

We can create dotnet core application using dotnet core cli, visual studio code or visual studio



To create sample Web API project using dotnet core CLI:

1.Open a command prompt and create a folder name which you want to be your application name and move to that folder directory using below commands.

    D:\  mkdir SampleWebApi

    D:\ cd SampleWebApi

    D:\SampleWebApi\

2. Now create project using command: dotnet new webapi


      



Navigate to the folder to verify the project got created.




Congrats.....Your sample web api got created using dotnet cli.
new: it is used to create a new project
webapi: it is the template for creating sample web api project

To know detail about different template use command  dotnet new help





You can also create an empty project and implement web API controller.


Running the application :

Restore package: dotnet restore
Build:    dotnet build
Run:  dotnet run

You can directly type dotnet run to build and run the application.





The application started and listening on default port 5000.

Here application is using default web server called Kestrel of Asp.NET Core.
Kestrel is a cross-platform web server for ASP.NET Core based on libuv, a cross-platform asynchronous I/O library. Kestrel is the web server that is included by default in ASP.NET Core project templates.

For more detail on Kestrel go to https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Let's create the same using visual studio 2017 :

1.Open visual studio 2017
2.File->New Project
3.Select Asp.Net Core Web Application under.Net Core project templates.
4.Give a project and solution name say SampleWebApi





5. Select WebApi as the project type and click Ok.







Congrats...project got created.




Running the application using visual studio :

First, rebuild the solution by right clicking on solution and click Rebuild Solution.

Running the Application:

1. You can click on Run button with the IISExpress option selected.




It is the lightweight version of IIS used by developers to develop and test application.

2. You can also run on kestrel webserver just by changing from IIS express to the application name from dropdown tool next to start button.






Now you can test your api from browser or postman: http://localhost:5000/api/values
The default port is 5000 for the kestrel. IIS express may run on a different port or you can change the port if you want.


Modify the Program.cs to use specific url by adding   .UseUrls("http://localhost:5001")

public static IWebHost BuildWebHost(string[] args) =>

            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://localhost:5001")
                .Build();



There are other ways to too like passing using command line arguments or creating a hosting.json.
and setting the content as

{

"server": "Microsoft.AspNetCore.Server.Kestrel",
"server.urls": "http://localhost:5050"

}

For details please visit: https://github.com/aspnet/KestrelHttpServer/issues/639




Till now we have created and run sample application using dotnet core Cli and Visual Studio 2017.


Let's Start with Deployment.....


Framework Dependent Deployment:


Framework dependent deployment relies on the presence of .NET Core on the target system.
Your application which you want to deploy will only contain its own code and third-party libraries which are not part of .NET Core libraries. It included.dll files which can be launched using dotnet utility command.

E.g dotnet SampleWebApi.dll

Publishing the application using dotnet cli

Debug mode :

D:\SampleWebApi> dotnet publish

Release mode:

D:\SampleWebApi> dotnet publish -c release

You can also specify output folder

D:\SampleWebApi> dotnet publish -o "D:\publish" -c release


Now navigate to specific folder where your app is published, and copy the folder to the target machine where you want to run say Linux, windows, ubuntu.
Run the application by typing below given command using cmd or bash

dotnet SampleWebApi.dll

Publish the application using Visual Studio

1. Right-click the project and click on publish
2. Create a publish profile and select the publish output folder destination for your app.




3. Click on publish button.



Your app is published successfully.

Now you can copy the publish output folder and move the target machine where you want to deploy.
This deployment requires.Net Core installed on target machine.
Now navigate to the folder using cmd or bash and run dotnet SampleWebApi.dll

Self-Contained Deployment:


Self-Contained deployment does not rely on the presence of .NET Core library on the target system.
Your application will contain all components along with.Net Core libraries and runtime.
It includes an executable file with application name and .dll file.

To run the executable on windows simply double click the .exe, say SampleWebApi.exe

To create a standalone application first decide which target machine you want the app to run and then add the <RuntimeIdentifier> tag under <PropertyGroup> section of your .csproj file.




Please check the different runtime id for target machine in the below link.




Edit your application .csproj and add the below  <RuntimeIdentifier> to target windows 10,

Mac Os and Ubuntu 14.04


 <PropertyGroup>
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64,ubuntu.14.04-x64</RuntimeIdentifiers>
  </PropertyGroup>

After that run the below command to build an application for each target machine.

dotnet publish -c Release -r win10-x64 for windows 10 platform
dotnet publish -c Release -r ubuntu.14.04 for Ubuntu 14.04
dotnet publish -c Release -r osx.10.10-x64 for Mac Os

This creates the Release version of your app for each target platform. The resulting files are placed in a subdirectory named publish that's in a subdirectory of your project's .\bin\Release\netcoreapp2.0 <runtime_identifier> subdirectory. Note that each subdirectory contains the complete set of files (both your app files and all .NET Core files) needed to launch your app.


Publish using Visual Studio 2017:


1. First add the above <RuntimeIdentifiers> in .csproj and build the application
2. Right click the solution and click on publish. Create a publish profile if not created.

3. Click settings link.
4. Go to settings tab and choose the target machine and click on save.







5. Now the application got published to the location you choose or default location

\SampleWebApi\bin\Release\netcoreapp2.0\win10-x64


Running application without .NET Core installed: 

Windows :
Double-click the executable file which got created say SampleWebApi.exe in publish folder of win10-x64 runtime folder.

Ubuntu :
Copy the file to Ubuntu machine.

First, give the file or folder executable permission using command chmod +x file
Than run using ./file


E.g:  chmod +x SampleWebApi    (file in the Ubuntu.14.04 publish folder)

       ./SampleWebApi

The application will start running








If you get an error saying: libunwind.so.8: cannot open shared object file: No such file or directory. Please install libunwind8 using below command and again run.


sudo apt-get install libunwind8





Mac OSX:
First, give the file or folder executable permission using command chmod +x file
Than run using ./file

E.g:  chmod +x SampleWebApi    (file in the osx.10.10-x64 publish folder)

       ./SampleWebApi

The application will start running.


 Hope you all will be able to create sample WebApi application and deploy the same in different platform using dotnet core. If you find any difficulties please feel free to comment and I will try to resolve.


Here is the download link for source code :