Text to speech utility

We all become lazy sometimes when we get long emails. But at the same time we had to listen to them as the mail contains important information.

If I tell about myself, then I grasp fast if someone speaks to me instead of reading something which is very long. And after talking with different people they had the same feelings.

That is why I thought to make something which takes text as input and speaks whatever is given as text and I created a project.

So now the problem is solved! If you have got a long mail but not in mood to read till end then just open this utility -> copy and paste all mail content into this utility -> Click on speak. It will read it out your whole email.

It is not only useful in above example, but it can be useful in many cases.

Utility looks like below:

text

It is available here.

If anyone wants the code then just contact me, I will provide.

Happy coding.

 

 

 

MVC6 (.Net core) applications are self hosted : Optional IIS integration

All ASP.NET Core applications are self-hosted.

Yes you read it right!

So does it mean IIS is not required?

Yes, I mean we can host MVC6 application even without IIS.

Wow…but How?

I assume you have already downloaded .Net core from here.

Next step would be to create sample MVC6 project.

For now you can directly clone it from Github by below commands:

git clone git@github.com:aspnet/cli-samples.git
cd cli-samples\HelloMvc

Then we would restore and run the project as below:

dotnet restore
dotnet run 

That is it!

Now navigate to localhost:5000 in your web browser and you can see your application hosted there.

You must be wondering how it happened?

You can check it by yourself in code.

Open Program.cs class and you can see below code there:

public class Program
{
    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .AddEnvironmentVariables(prefix: "ASPNETCORE_")
            .Build();

        var host = new WebHostBuilder()
            .UseConfiguration(config)
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration() //// Here IIS integration is optional
            .UseStartup()
            .Build();

        host.Run();
    }
}

As you can see in above comments, IIS integration is optional in .Net core.

Happy coding!

WebListener : A Windows HTTP server for ASP.NET Core

Special thanks to Mr.Tom Dykstra from Microsoft for suggesting some points for this post.

Web Listener is now available on Nuget.

First of all, what is Web Listener?

Web Listener is one of the servers of .Net core.

ASP.NET Core is completely decoupled from the web server environment that hosts the application. ASP.NET Core supports hosting in IIS and IIS Express, and self-hosting scenarios using the Kestrel and WebListener HTTP servers.

As per the .Net team says

WebListener is a Windows HTTP server built on the Http.Sys kernel mode driver. It exposes a number of Http.Sys features previously only availabe in IIS.

Fine, but when should we use Web Listener?

If you are on Windows and  if you want to expose your server directly to the internet. Because Kestrel is not certified for direct exposure.

Or you need any of the features listed below:

  • Windows Authentication
  • Port sharing
  • HTTPS with SNI
  • HTTP/2 over TLS (Windows 10)
  • Direct file transmission
  • Response caching

It is also Recommended for edge deployment because it’s built on the existing Http.Sys HTTP stack. Http.Sys is mature technology that protects against many kinds of attacks. Kestrel is newer, hasn’t had a chance to develop as many protective features yet.

NOTE: Please note that it is Not compatible with ASP.NET Core Module, so can’t be used with IIS even if you wanted to.

Example scenario:

  • Can use Kestrel for internal micro service to micro service communications on private network (kestrel faster), should use WebListener for directly externally facing micro service layer.
  • If a cluster is not on a closed private virtual network, should use WebListener for the inter-service communication as they are open to other things contacting them on their “internal” ports.

Great, and what are Supported Windows versions?

  • Windows 7 and Windows Server 2008 R2 and later

So, How to get it via Nuget?

You can get it using below command:

webl

Great, What to do after getting it from Nuget?

You can use it in code as shown below:

public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseWebListener(options =>
                {
                    options.ListenerSettings.Authentication.Schemes = AuthenticationSchemes.NTLM;
                    options.ListenerSettings.Authentication.AllowAnonymous = false;
                })
                .UseStartup()
                .Build();

            host.Run();
        }

Awesome, anything extra needed to use WebListener?

Yes, below are few points I got from Mr.Tom Dykstra:

 

Happy coding!

JPEG decoder for .NET Core

Some of you might already know that there is “currently” not any built in default JPEG decoder class for .NET Core since System.Drawing (except for System.Drawing.Primitives) is currently not present as a Nuget package.

So is there any way of DECODING JPEG pictures on .NET Core for some server side processing?

Yes certainly there is!

All you need to do is to download a Nuget package called ImageProcessor 2.4.4 which you can find here for full .NET Framework

Is it available for .Net Core?

Yes it is! It is only on MyGet for the time being. That is hosted here.

Any type supported apart from JPEG?
Yes.

Encoding/decoding of image formats (plugable):
1. Jpeg (Includes Subsampling. Progressive writing required)
2. Bmp (Read: 32bit, 24bit, 16 bit. Write: 32bit, 24bit just now)
3. Png (Read: Rgb, Rgba, Grayscale, Grayscale + alpha, Palette. Write: Rgb, Rgba, Grayscale, 4. Grayscale + alpha, Palette) Needs interlaced decoding #379
5. Gif (Includes animated)

Some of basic samples are as below:

Sample 1:

// resizing and filter (grayscale)
using (FileStream stream = File.OpenRead(“foo.jpg”))
using (FileStream output = File.OpenWrite(“bar.jpg”))
{
Image image = new Image(stream);
image.Resize(image.Width / 2, image.Height / 2)
.Grayscale()
.Save(output);
}

Sample 2: Accessing Pixels

Image image = new Image(400, 400);
using (PixelAccessor<Color, uint> pixels = image.Lock())
{
pixels[200, 200] = Color.White;
}

You can find more advantages of this Nuget package here.

Thanks James Jackson-South for building this.

Happy coding!

Dependency Injection in MVC 1.0(ASP.NET Core)

Please note that below post would be more clear for those who already know what Dependency injection is.

As we all know that things has been little changed in .Net core and things has also been changed the way we suppose to register all of our services that we are going to use as DI.

Suppose you have one HomeController and in that controller you want to inject a service let us say MyService.

In controller it would look like as it was used to :

public HomeController(IMyServcie myService)
{

}

And in a class library called MyService, it would look like as below:

public class MyService : IMyService
{
private readonly IMyRepository _myRepository;

public MyService(IMyRepository myRepository)
{
_myRepository = myRepository;
}
…….
}

You can even inject services into views using @inject. I have already written post on that which is here.

So now you might be wondering like where should we register this.

ConfigurationServices is your composition root so that’s where you register you services.

So it would be as below:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

// Add application services.
services.AddScoped<IMyService, MyService >();
}

Okay so above scenario is ideal scenario but you might be having some questions as below:

  • What if you have some of your code written outside of your MVC application?.
  • Also what if you do not want to bloat the ConfigurationServices method with lots of AddScoped lines of code for other layers like Repository layer and Service layer?
  • What to do if I need to do in my other layers (Repository and Service) to first register them here (both are .NET Core class library projects) and then wire those containers into the parent container?

For that you just need to create different Extension methods in different layers which targets IServiceCollection as below:

public static IServiceCollection AddMyServices(this IServiceCollection services) {
services.AddMyRepositories();
services.AddScoped<IMyService, MyService>();
//…add other services
}

And in Repository layer it would have a extension method as below:

public static IServiceCollection AddMyRepositories(this IServiceCollection services) {
services.AddScoped<IMyRepository, MyRepository>();
//…add other Repositories
}

And now you could just as easily call the AddMyRepositories() in the AddMyServies extension method as opposed to the main project itself:

public void ConfigureServices(IServiceCollection services) {
//…other code

services.AddMyServices();

//…other code
}

That is it!

Happy coding!

JSON with camel case in MVC

70fdb0e6-22bd-11e6-82c0-9eee1813955a

 

Yes, the wait is over.

I have heard it manytimes why MVC does not support Camel Case serialization. As workaround people used to use ServiceStack or Json.NET.

But as per recent announcement, MVC 1.0.0 now serializes JSON with camel case names by default.

How?

Before it was something like below:

public class Person
{
  public int Id { get; set; }
  public string FullName { get; set; }
}

Would serialize to:

{“Id”:1,”Name”:”Neel Bhatt”}

Now after changes, it would automatically convert it to camel case as below:

{“id”:1,”fullName”:”Neel Bhatt”} //// Not the first letter here

How to add in MVC?

Well MVC 1.0.0 gifts you this functionality  within services.AddMvc()

And in case if You want the old PascalCase behavior then you just need to add below lines into your services.AddMvc() of startup.cs class:

services

.AddMvc()

.AddJsonOptions(options =>

options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Please note that it is purely configurable and if you do not wish to use this then just write above line of code in startup.cs.

Happy coding!

 

 

Moq in Asp .Net core

UPDATE on 15th October 2016:

Moq for .Net core is now available on Nuget and you can get it via below command:

nug

It means the setting mentioned below are not required now.

UPDATE on 20th October 2016:

Moq Nuget version 4.6.38-alpha worksfor .Net core- but e.g. 4.5.3 doesn’t work, that complains that Moq 4.5.3 supports net45 and one or more packages are incompatible with .NETCoreApp V1.0.

See this post for more information.

Old Post:

I was messing around a bit for Unit testing in .Net core and I suddenly remembered about mocking, and thus I decided to use Moq which is the most popular .Net mocking framework.

After few attempts I got below error while compiling:

ASP.NET Core 5.0 error CS0246: The type or namespace name ‘Moq’ could not be found (are you missing a using directive or an assembly reference?)

After searching more on this, I wondered that Moq is not supported by .Net core!!!!!

Though I thought it is not possible as Moq is very popular among developers.

After searching more, I found that ASP.NET team from Microsoft have created a special version of Moq for internal usage.

You need to add special source to your Nuget package manager to be able to locate development version of packages by .Net team.

URL of sources where you could find this packet is here

Ok, but how to use it?

There are currently several ways to use it.

First of all Register a Moq dependencies in project.json:

"dependencies": {
        "xunit": "2.2.0-beta2-build3300",
        "dotnet-test-xunit": "2.2.0-preview2-build1029",
        "moq": "4.6.38-alpha"
    }

Now for Nuget, you can perform any of below steps:

  • Configure a new NuGet feed to be able to reference the moq.netcore package
  • You can Create a NuGet.config file in project home directory.

If you have decided to create Nuget.config file then add below line of codes in that:

<?xml version="1.0" encoding="utf-8"?>
    
        
            <add key="AspNetVNext" value="https://www.myget.org/F/aspnetcidev/api/v3/index.json" />
            <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
        packageSources>
configuration>

And if you have decided to configure a new Nuget feed then make sure configuration matches with below configurations:

03-armen-shimoon-aspnet-contrib

That is it!

Now you can use Moq with Asp .Net core.

Happy coding!