CheapWindowsHosting.com | SEO plays an essential role in online marketing for businesses. It makes it possible for company websites to have access to constantly flowing internet traffic. SEO involves strategic methods that are used to boost search engine rankings for sites. It is among the most popular and effective online marketing strategies that help businesses become more profitable.
Search engine optimization is based on how people use search engines to carry out their online searches when looking for information. Optimizing a website requires HTML code editing which facilitates the use of certain keywords and phrases in relation to the site. With billions of searches of carried out on a monthly basis, it is important for company websites to be well optimized.
A majority of online users depend on search engine rankings and they usually restrict their viewing to the initial results when searching for certain terms. The higher the ranking for your site is, the more internet traffic you will be able to receive from users who rely on search engines. The best way to make sure that your website is optimized is by hiring an SEO expert.
Advertising and marketing are integral aspects of successfully running any type of business. They give you the opportunity to attract new customers and create awareness about your products or services. Higher search engine rankings for your site allow you to take advantage of cost effective advertising opportunities that your online business needs.
SEO can be complicated and dynamic, which is why you need a specialist who can help you with your company site by incorporating various factors such as keywords and content.
Online marketing campaigns that are based on SEO yield the best results. Search engines consider social media when determining rankings. A strong presence on social media will go a long way towards making your SEO progressive. As online usage continues to advance, it is important to incorporate aspects such as high search engine ranking and strong social media presence that will enable you to draw more quality traffic.
Your business requires a high level of online visibility because the internet enables you to reach more people than ever before. People all over the world use the internet each day. Almost 80% of people use the internet regularly and the number of internet users continues to rise steadily. With several existing users and more new users every other minute, you need to be able to reach these people.
SEO gives you the online visibility that you need to promote your brand and business. The internet gives you liberty to say as much as you want about what you offer on various platforms. It eases interaction with your customers and gives potential customers the chance to find and reach you with ease. SEO is necessary for continually strengthening and maintaining your online presence.
CheapWindowsHosting.com | Looking for the Best & Cheap Windows Hosting for MediaWiki 1.26.2? Following are top recommendation based 99% existing satisfied clients feedback. We selected upon plan features, server availability, support availability and true editorial experience.
MediaWiki 1.26 is the current stable MediaWiki version.
New hooks
ASPHostPortal.com | The top recommended MediaWiki 1.26.2 Hosting Provider. Cheap and affordable Hosting features including:
HostForLIFE.eu | Professional MediaWiki Hosting Provider & fully ASP.NET support. We can easily deploy the most popular ASP.NET, CMS & Blog system such as BlogEngine, DotNetNuke. The best ASP.NET hosting feature including :
UKWindowsHostASP.NET | The best and cheap MediaWiki Hosting Provider & fully ASP.NET support. One of top and recommended ASP.NET Hosting Providers ! ASP.NET Hosting feature plan including:
UKWindowsHostASP.NET
It’s the configuration in IIS for your websites. The best flexible option is Full Trust that you don’t worry the websites cannot run successfully in the shared web host. And the balanced option between security and flexibility is Medium if you’re experienced on MediaWiki debugging, deployment and you’re sensitive on the security and server reliability.
The control panel should be easy to configure asp.net stuff such as .net versions switch, trust level management and script map etc.
They are consider more about the supported SQL Server version and limitation. The preferred SQL Server is 2008 however most of web hosts support Express edition only. Actually it’s completely enough for websites hosted with shared web hosting.
No matter if you’re asp.net newbie or developer, you can’t avoid bothering the hosting support. 24 x 7 live support is always expected.
CheapWindowsHosting.com | Cheap and affordable windows hosting. In this tutorial we will learn about Logging database operations in Entity Framework and handling Exceptions.
Entity Framework (EF) is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects. It eliminates the need for most of the data-access code that developers usually need to write.
If you are using the EF6 and want to log the database operations, analyze them, then, this is the right place for you.
When I was developing one WebApi project, what I was searching for is an output each query performed by Entity framework should be logged with time. Also, exception if there is any. So, in this section, you will learn how to log commands and queries to the database generated by Entity framework.
There are two ways using code
using (MyDatabaseEntities context = new MyDatabaseEntities()) { context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); // query the database using EF here. }
This will log the database operations in the output window. What it does is it writes the operations performed byEntityFramework
to the output window. It gives awesome traces.
Have a look :
This uses the IDbCommandInterceptor
Interface. This is in-built in Entity framework 6
.
Note: This is available in
Entityframework 6 and later.
Interface looks like this:
namespace System.Data.Entity.Infrastructure.Interception { /// <summary> /// An object that implements this interface can be registered with /// <see cref="T:System.Data.Entity.Infrastructure.Interception.DbInterception"/> to /// receive notifications when Entity Framework executes commands. /// /// </summary> /// /// <remarks> /// Interceptors can also be registered in the config file of the application. /// See http://go.microsoft.com/fwlink/?LinkId=260883 /// for more information about Entity Framework configuration. /// /// </remarks> public interface IDbCommandInterceptor : IDbInterceptor { /// <summary> /// This method is called before a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteNonQuery"/> or /// one of its async counterparts is made. /// /// </summary> /// <param name="command">The command being executed.</param> /// <param name="interceptionContext"> /// Contextual information associated with the call.</param> void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext); /// <summary> /// This method is called after a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteNonQuery"/> or /// one of its async counterparts is made. /// The result used by Entity Framework can be changed by setting /// <see cref= /// "P:System.Data.Entity.Infrastructure.Interception.DbCommandInterceptionContext`1.Result"/>. /// /// </summary> /// /// <remarks> /// For async operations this method is not called until after the async task has completed /// or failed. /// /// </remarks> /// <param name="command">The command being executed.</param> /// <param name= /// "interceptionContext">Contextual information associated with the call.</param> void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext); /// <summary> /// This method is called before a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteReader(System.Data.CommandBehavior)"/> or /// one of its async counterparts is made. /// /// </summary> /// <param name="command">The command being executed.</param> /// <param name="interceptionContext">Contextual information associated with the call. /// </param> void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext); /// <summary> /// This method is called after a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteReader(System.Data.CommandBehavior)"/> or /// one of its async counterparts is made. /// The result used by Entity Framework can be changed by setting /// <see cref= /// "P:System.Data.Entity.Infrastructure.Interception.DbCommandInterceptionContext`1.Result"/>. /// /// </summary> /// /// <remarks> /// For async operations this method is not called until after the async task has completed /// or failed. /// /// </remarks> /// <param name="command">The command being executed.</param> /// <param name="interceptionContext"> /// Contextual information associated with the call.</param> void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext); /// <summary> /// This method is called before a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteScalar"/> or /// one of its async counterparts is made. /// /// </summary> /// <param name="command">The command being executed.</param> /// <param name="interceptionContext"> /// Contextual information associated with the call.</param> void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext); /// <summary> /// This method is called after a call to /// <see cref="M:System.Data.Common.DbCommand.ExecuteScalar"/> or /// one of its async counterparts is made. /// The result used by Entity Framework can be changed by setting /// <see cref= /// "P:System.Data.Entity.Infrastructure.Interception.DbCommandInterceptionContext`1.Result"/>. /// /// </summary> /// /// <remarks> /// For async operations this method is not called until after the async task has completed /// or failed. /// /// </remarks> /// <param name="command">The command being executed. /// </param><param name="interceptionContext"> /// Contextual information associated with the call.</param> void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext); } }
Let’s derive this interface to the DatabaseLogger
class.
FYI, I have added my log information into database. You may insert into file, Excel, anything you want.
You need not worry about the methods Interface
itself is very self explanatory. It has 6 methods, which you can see I have derived and check comments to understand each scenario.
//this file is used to log the database operations it checks //the query execution time and than insert if it takes more than one second. //to disable it remove its registry from TeamPassDbContext default constructor public class DatabaseLogger : IDbCommandInterceptor { static readonly ConcurrentDictionary<DbCommand, DateTime> MStartTime = new ConcurrentDictionary<DbCommand, DateTime>(); public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { //executed state Log(command, interceptionContext); } public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { //executing state OnStart(command); } public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { //reader executed state Log(command,interceptionContext); } public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { //reader executing state OnStart(command); } private static void Log<T>(DbCommand command, DbCommandInterceptionContext<T> interceptionContext) { DateTime startTime; TimeSpan duration; //Removing from dictionary and calculating time MStartTime.TryRemove(command, out startTime); if (startTime != default(DateTime)) { duration = DateTime.Now - startTime; } else duration = TimeSpan.Zero; const int requestId = -1; var parameters = new StringBuilder(); foreach (DbParameter param in command.Parameters) { parameters.AppendLine(param.ParameterName + " " + param.DbType + " = " + param.Value); } var message = interceptionContext.Exception == null ? $"Database call took {duration.TotalSeconds.ToString("N3")} sec. RequestId {requestId} \r\nCommand:\r\n{parameters + command.CommandText}" : $"EF Database call failed after {duration.TotalSeconds.ToString("N3")} sec. RequestId {requestId} \r\nCommand:\r\n{parameters.ToString() + command.CommandText}\r\nError:{interceptionContext.Exception} "; //Ignoring some queries which runs perfectly if (duration.TotalSeconds>1 || message.Contains("EF Database call failed after ")) { //The time taken is more or it contains error so adding that to database using (DbContext dbContext = new DbContext()) { //using error model class Error error = new Error { TotalSeconds = (decimal)duration.TotalSeconds, Active = true, CommandType = Convert.ToString(command.CommandType), CreateDate = DateTime.Now, Exception = Convert.ToString(interceptionContext.Exception), FileName = "", InnerException = interceptionContext.Exception == null ? "" : Convert.ToString(interceptionContext.Exception.InnerException), Parameters = parameters.ToString(), Query = command.CommandText, RequestId = 0 }; //Adding to database dbContext.Errors.Add(error); dbContext.SaveChanges(); } //var errorFileUrl = ; //File.WriteAllLines(, message); } } public void ScalarExecuted (DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { //Log and calculate after executed Log(command, interceptionContext); } public void ScalarExecuting (DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { //adding to dictionary when executing OnStart(command); } private static void OnStart(DbCommand command) { //adding to dictionary when executing MStartTime.TryAdd(command, DateTime.Now); } }
Now, I am registering this class to dbcontext
. What it does is, It tells entity framework to use this class for logging database operations.
public DbContext(): base("name=connectionstring") { //TODO remove this when don't need to log anything DbInterception.Add(new DatabaseLogger()); }
Everything is set up now. You can make an Error
model class like this. (This is the code-first model class.)
public class Error { [Key] [Required] public int ErrorId { get; set; } public string Query { get; set; } public string Parameters { get; set; } public string CommandType { get; set; } public decimal TotalSeconds { get; set; } public string Exception { get; set; } public string InnerException { get; set; } public int RequestId { get; set; } public string FileName { get; set; } public DateTime CreateDate { get; set; } public bool Active { get; set; } }
You can see the error logs here
Technically, there are many approaches to log your database operations. But, I think this should be centralized to reduce the load. That is why I used this approach.