I am trying to learn the Owin and Katana architecture from http://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection. I tried using the OwinStartup as the class level attribute and was not able to do that since its at the assembly level. I feel strange why its restricted at the assembly level.
Best How To :
Pretty much what milan said in the comment. It's mainly for performance purposes because scanning for assembly-level attributes is fairly quick compared to getting a list of all the types in an assembly (there could be thousands, tens of thousands, or perhaps more) and then getting all the attributes for every type in the assembly.
So, in some reasonable type of application there might be 50 assemblies, each with let's say an average of 200 types. It's faster to scan the assembly-level attributes 50 times compared to scanning the type-level attributes 50*200 = 10,000 times.
Also, scanning types causes a lot of other stuff to happen, such as type resolution, which can cause failures. Systems such as ASP.NET MVC and Web API (among others) look for all types in all referenced assemblies and they have to do a lot of trickery to make that work (though they have good reason to do so).