Configuring EntityFramework for .NET Core

I will try to show some real example of .net core way of configuring Entity Framework Code First in this article. Microsoft documentation shows some examples, but the solution there creates one DbContext and stores it in DI container.

Downsize of that solution is that you cannot dispose container obtained from DI.

Better solution is to create a Factory class, store it as Singleton into Di container and create DbContext with this service.

public class MyDataContextFactory : IDataContextFactory
{
const string ConnectionStringName = "MyDbConn";
IConfigurationRoot configuration;
public DataContextFactory(IConfigurationRoot Configuration)
{
configuration = Configuration;
}
public DataContext Create()
{
var optionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(
configuration.GetConnectionString(ConnectionStringName));
return new MyDataContext(optionsBuilder.Options);
}
}

Also, for this class, we would create interface IMyDataContextFactory, which will look like this:

public interface IMyDataContextFactory
{
MyDataContext Create();
}

The meat of this class is the method Create, which reads from Configuration the Db connection string and creates particular instance of DbContext. In my case called MyDataContext. I am passing Sql connection string read from configuration.

The class is taking IConfigurationRoot as only parameter, so that it could read from .Net Core Configuration. This is usually appsettings.json, but its up to your application.

Configuration and registration of the service

When you look to your Program.cs, you can see it configured like for example this:

public class Program
{
public static IConfigurationRoot Configuration { get; set; }
public static void Main(string[] args = null)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
/// and so on...

Please notice Configuration is – when created to class member.
The next step is to add Factory method to .Net core dependency injection container. In the Startup.cs file, locate your existing ConfigureServices, which is used for these things and add our line for example to end of it:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Register MyDataContextFactory here
services.AddSingleton(
new DataContextFactory(Configuration));
}

How to use it in Controllers

The use is then similar to other Net Core DI services. We need to add our factory interface to particular Controller constructor, to get injected by DI automatically. It will look like this:

public class ValueController : Controller
{
private IMyDataContextFactory myDataContextFactory;
public ValueController(IMyDataContextFactory myDataContextFactory)
{
this.myDataContextFactory=myDataContextFactory;
}
// and so on

And use is then very simple, for example in same controller I can have method like:

public class ValueController : Controller
{
// ...
[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
using (var context = dataContextFactory.Create())
{
var item = context.TodoItems.FirstOrDefault(t => t.Id == id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}
// ...

So it is, hopefully this will help someone.

Thanks for reading.

Queueing items to ThreadPool

The simplicity of this approach is astonishing. And it was in .net since .net 4, but our eyes are not always looking in the direction we should.

ThreadPool.QueueUserWorkItem

The method is offering overload with Action delegate and argument. Actually the argument is significant. If it is blocking function it will Queue the new action only when it stops blocking.

Thus the simple http server can only be:

while(true) {
   ThreadPool.QueueUserWorkItem(Process, listener.GetContext());    
 }

void Process(object o)
 {    var context = o as HttpListenerContext;
    // process request and make response
}

We are waiting until someone connects. And yes it only processes maximally pool-size amount of concurrent connections. But that is another story I think. I wanted to share the beauty of this solution.

Inspiration was from
https://codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server
https://stackoverflow.com/questions/9034721/handling-multiple-requests-with-c-sharp-httplistener

Inspecting Wix Managed Custom Actions

logo-black-hollow-xs

Wix Toolset allows creating .net managed Custom actions for the Windows Installers. Windows Installer only supports

Custom Actions in .exe, VBScript, JScript and .dll

The tool which marshals std call to native dll function into managed code is called Deployment Tools Foundation (DTF).

image

When you open an Msi with managed CA in Orca, you will see it as a native .dll in Binary table. You can also notice WixCA binary attachment named after your binary , which basically encapsulates all DTF code which extracts managed CA.

For example your binary in a .wxs file:

<Binary Id=”CustomActionBinary” SourceFile=”$(var.CA.TargetDir)$(var.CA.TargetName).CA.dll”/>

If you export your binary as .dll and open it in Dependency Walker you will see your Custom Action name as exported function in .dll

image

The CA binary is actually created by MakeSfxCA, which is actually attaching all CA managed binaries and WixCA in a .dll as Windows Cab file.

For example 7Zip can extract cabinet files to actual content:

image

And here is how it looks in ILSpy

image

Testing HTTP 2.0 in a browser

You most probably already know how the good old buddy HTTP works. Its very simple, very straightforward and also very old. After some evolution, started by Google with SPDY, we currently have draft of a IETF standard for v 2.0 of this protocol, called also HTTP/2. All this evolution was driven by the desire to make web page loading faster and eventually to reduce the data amounts downloaded on our phones.

The best way is to try. The http2 Implementations tracking page shows that there is a Microsoft implementation, revealing a HTTP/2 supporting server url at:

https://h2duo.cloudapp.net/

Also, the current Firefox Nightly can be enabled to support this version. The steps to enable Http/2 in it are to open about:config and switch these two to true:

  • network.http.spdy.enabled.http2draft
  • security.ssl.enable_alpn

When enabled in FF Nightly, you can navigate to

https://h2duo.cloudapp.net/Mux

Which is a page showing one of HTTP/2 advantages called Multiplexing, which is ability to download large amount of resources simultaneously. The testing page should load he left image much faster. Also when you look at the request, you will see HTTP 2.0, like on following screen.

http2Server

ManualResetEvent vs AutoResetEvent

I want to signal all of my threads waiting for WaitHandle and move them from the Wait Queue to Ready Queue.

There is a small, but significant difference between these two. The main difference comes from the names, when in AutoResetEvent signales (releases) one thread, waiting in the Wait queue and then automatically returns to non-signaled state. Strictly said:
AutoResetEvent will pick and signal just for one thread of more waiting threads.

In the other hand, using ManualResetEvent, you have much more control over the situation. When some thread (producer) will signal (Set), all waiting threads are signaled (released) and enqued to the Ready Queue. Which means they continue from their Wait command.
In this situation you are getting more control in your hands to pick up, which of the waiting threads should take the resource, or process some workitem. The rest of threads can be put in consequent waiting if needed.

Example:

I have a bunch of threads, which are waiting for signal.

First lets try what happens with AutoResetEvent:

image
Clearly shows how just first thread is signalled

ManualResetEvent example

image
This looks much better, all the waiting threads received the signal

And finally, the code which produced this:

class Program
    {
        static ManualResetEvent mre;
        static void Main(string[] args)
        {
            mre = new ManualResetEvent(false);
            var maxT = 3;
            var threads = new List();
            for (int i = 0; i < maxT; i++)
			{
                var t1 = new Thread(Program.T1Proc);
                t1.Start(i);
                threads.Add(t1);
			}
            Thread.Sleep(1000);
            Console.WriteLine("Sleeping for 1 sec");
            Thread.Sleep(1000);
            Console.WriteLine("Setting..");
            mre.Set();
            Console.ReadLine();
        }
        static void T1Proc(object state)
        {
            Console.WriteLine(" thread " + state + " waiting");
            bool received = mre.WaitOne(5000);
            if (received)
                Console.WriteLine(" thread " + state + " received signal");
            else
                Console.WriteLine(" thread " + state + " not received signal");
        }
    }

How to reset OpenWrt root password

It turned out that after few months of using my OpenWrt properly, I have completelly lost my root password and couldn’t connect to my router’s OpenWrt LuCi.

Fortuantelly, OpenWrt has a failsafe mode, where you can set things back up.

How to get to OpenWrt Failsafe mode:

  1. Reset the router
  2. Wait for the DMZ light (Second left light started blinking)
  3. Hold Router reset button for 2 seconds
  4. Connect your’r PC‘s Ethernet Cable to Router’s WAN port (You cannot access Failsafe when connected to any of LAN ports
  5. Set your PC IP Address to 192.168.1.2, NetMask to 255.255.255.0, GW to 192.168.1.1
  6. ipOpen Telnet connection to 192.168.1.1
  7. openwrt_failsafeType mount_root to mount your Router’s FS to Read/Write mode
  8. Type passwd to change root password
  9. openwrt_passwdSwich your LAN Ethernet cable from WAN port on Router back to some LAN one
  10. Restart the router

Deploying Express.js on Cloud9

Express.js (and probably most of other servers on Cloud 9) are being shielded by Cloud9 proxy. You usually cannot access them directly.
Anyway, according the Cloud9’s helping artice Can I use Cloud9 to do X the solution is following:
Start the ExpressJS to listen on Local IP and Local PORT, which are available, to start Express to listen use this:


// Cloud9 specific - needs to use defined port to listen
console.log("Starting to listen. ")

app.listen(process.env.PORT, process.env.IP);

You can then start Express.js normally like:

node myserver.js

I am starting server usually in new terminal window in Cloud9 and use bottom mini-terminal for tests, like:

markcz@demo-project:~/597752 (master) $ wget http://$IP:$PORT/getangularusers
--2013-09-11 07:06:12-- http://127.4.253.1:8080/getangularusers
Connecting to 127.4.253.1:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14 [text/html]
Saving to: “getangularusers.1”

100%[==============>] 14 –.-K/s in 0s

2013-09-11 07:06:12 (1.08 MB/s) – “getangularusers.1” saved [14/14]

Which successfully downloaded the response from private binding fine.

To test public available uri, you can easily open web browser using following format:
http://projectname.username.c9.io

My rest GET api path is /getangularusers and in my case it is publicised as
http://demo-project.markcz.c9.io/getangularusers

You cannot go inside C9 on different port then standard 80. And its being redirected to your local binding.

Please notice, that I am talking about standard HTTP port (80), in preview, you can get direct links to files hosted on Cloud9, but these are NOT your HTML pages hosted on a web server (Express).

 

 

I am going to describe in next article how to conigure static routing in Express to host your HTML files.

Summary:

1. Use Cloud9 predefined IP and PORT to point where Express is going to listen

2. To access from outside of Cloud9, use standard HTTP on 80, and with 3rd domain like hostname
(like http://demo-project.markcz.c9.io/getangularusers)