How to profile and analyze your application performance with Visual Studio 2015

I ran into a couple of good MSDN resources while looking into how to analyze your applications performance and see possible bottlenecks. Here is what I found:

https://blogs.msdn.microsoft.com/visualstudio/2016/02/15/analyze-cpu-memory-while-debugging/

https://blogs.msdn.microsoft.com/visualstudioalm/2015/07/20/performance-and-diagnostic-tools-in-visual-studio-2015/

https://blogs.msdn.microsoft.com/visualstudioalm/2015/10/29/profile-your-cpu-in-the-debugger-in-visual-studio-2015/

https://blogs.msdn.microsoft.com/visualstudioalm/2015/04/29/diagnosing-event-handler-leaks-with-the-memory-usage-tool-in-visual-studio-2015/

https://blogs.msdn.microsoft.com/vcblog/2015/10/21/memory-profiling-in-visual-c-2015/

 

SharePoint 2013 EMail Alerts with wrong URLs under extended zones

I had to make a fix to the problem described in the title above. Basically the issue is that if you have an extended zone and you are initiating an alert from you SharePoint environment in the E-Mail.

There is the following solution which works perfectly:

https://timpanariuovidiu.wordpress.com/2014/06/23/sharepoint-2013-alerts/

http://blogs.msdn.com/b/sharepointdeveloperdocs/archive/2007/12/14/how-to-customizing-alert-emails-using-ialertnotificationhandler.aspx

The sample above works just fine. I did had to make an addition to the code because it was not taking into consideration the headers and the wrong URL there. Here is my version. It is rather similar:



public class CustomAlertHandler : IAlertNotifyHandler
 {
 public bool OnNotification(SPAlertHandlerParams ahp)
 {
 try
 {
 using (SPSite site = new SPSite(ahp.siteUrl + ahp.webUrl))
 {
 using (SPWeb spWeb = site.OpenWeb())
 {
 SPAlert a = ahp.a;

 if (a.Properties.ContainsKey("siteurl"))
 {
 string siteNewURL = a.Properties["siteurl"];

 string siteOldURL = ahp.siteUrl;

 ahp.body = ahp.body.Replace(siteOldURL, siteNewURL);

 ahp.siteUrl = siteNewURL;
// My Addition for the header URL
 if (ahp.headers["x-sharing-config-url"] != null && !String.IsNullOrEmpty(siteNewURL) && !String.IsNullOrEmpty(siteOldURL))
 ahp.headers["x-sharing-config-url"] = ahp.headers["x-sharing-config-url"].ToLower().Replace(System.Web.HttpUtility.UrlEncode(siteOldURL).Replace(".", "%2e"), System.Web.HttpUtility.UrlEncode(siteNewURL).Replace(".", "%2E"));
 }

 string to = ahp.headers["to"].ToString();

 string subject = ahp.headers["subject"].ToString();

 SPUtility.SendEmail(spWeb, ahp.headers, ahp.body);
 }
 }
 return true;
 }
 catch (Exception ex)
 {
 return false;
 }
 }
 }


Additionally to the code above which needs to be deployed from a solution package you also need to create a custom alert template based on the SharePoint alerttemplates.xml in C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\XML.

In the XML within the properties tags you needs to add your assemble reference:

<NotificationHandlerAssembly>AlertHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d59ecf2a3bd66904</NotificationHandlerAssembly>

<NotificationHandlerClassName>AlertHandler.Class1</NotificationHandlerClassName>

<NotificationHandlerProperties></NotificationHandlerProperties>

Then do the following steps:

Run the following command next:
stsadm -o updatealerttemplates -filename “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\XML\customalerttemplates.xml” -url “Your site URL”

Run iisreset on each server of the farm.

Restart the SharePoint timer services on each server in the farm.

Check out the links above for more info on how to create a custom alert.

How to use: Azure Service Bus – Notification hub, Azure hosted SignalR Hub with .NET clients, Android clients and web JavaScript clients

Huh that is a looong title for a blog post :). It is easier for me to write these all in one post since they are related the code in this case. So here I go, bear with me, it’s going to be alot of stuff and code.

The codes and examples here are from the own personal technology workbench project hosted in Azure. More code and examples how these features and functionality work can be found here.

I will go in the following order with the topics covered in this post:

  • Notification Hub
    • Setting up the Azure Service Bus – Notification Hub
    • Connecting with a .NET Client and sending messages
    • Connecting and listening to messages with an Android device client
  • SignalR Hub
    • Setting up a Azure hosted SignalR hub
    • Connecting and listening to activities with the following clients:
      • Connecting with the .NET Client
      • Connecting with the JavaScript client
      • Connecting with the Android client

Notification Hub

Some links to get you started:

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-android-get-started-push/

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-android-push-notifications-app-users/

Setting up the Azure Service Bus – Notification Hub

I wont go into much details here. Microsoft has done a great job documenting these steps, I recommend you go to the following link and follow the first part of these instructions:

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-android-get-started-push/

What you will need for my code example is a Google Developer account and a API Key from google to be able to send and receive GCM messages to Android devices. Of course you will also need a Azure account to be able to create the notification hub.

Add the following Nugget package:

Microsoft Azure Service Bus

Connecting with a .NET Client and sending messages

The code below will connect from a .NET Client to the Notification Hub. This is done in the class constructor. At the moment this code can only send GCM messages to Android devices. Note that these operations are asynchronous.

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessTrackerLibrary/ServiceBus/NotificationGateway.cs

But you could use a "central" hub from where to send these messages which will handle sending messages to different devices through a WebAPI:
https://github.com/lionadi/MyFitnessTracker/tree/master/FitTrackerHubCentral
https://github.com/lionadi/MyFitnessTracker/blob/master/FitTrackerHubCentral/FitTrackerHubCentral/Controllers/NotificationsController.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Notifications;

namespace MyFitnessTrackerLibrary.ServiceBus
{
    // TODO: Replace this with a connection to the notification central hub, do not sent message directly from here in the future!!!!
    public class NotificationGateway
    {
        private NotificationHubClient hub = null;
        private static NotificationGateway _notificationGateway;
        public NotificationGateway()
        {

            hub = NotificationHubClient.CreateClientFromConnectionString(MyFitnessTrackerLibrary.Globals.MyFitAppSettings.NotificationHubConnectionString, MyFitnessTrackerLibrary.Globals.MyFitAppSettings.NotificationHubName);

        }

        ~NotificationGateway()
        {

        }

        public async Task<NotificationOutcome> SendMessage(string message)
        {
            var toast = "{ \"data\" : {\"message\":\"" + "From : " + message + "\"}}";
            return await hub.SendGcmNativeNotificationAsync(toast);
        }

        public static NotificationGateway GetInstance()
        {
            if(_notificationGateway == null)
            {
                _notificationGateway = new NotificationGateway();
            }

            return _notificationGateway;
        }
    }
}

Connecting and listening to messages with an Android device client

The Android side is a bit more complicated and annoying. You have to do more work here.

At the first you need two Microsoft java libraries to be able to connect to a notification hub:

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/libs/notification-hubs-0.4.jar

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/libs/notifications-1.0.1.jar

After this you need to add them to your Android Studio gradle file:

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/build.gradle

dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile 'com.android.support:appcompat-v7:21.0.3'
 compile 'com.google.android.gms:play-services:6.5.87'
 compile 'com.google.code.gson:gson:2.3.1'
 compile files('libs/signalr-client-sdk.jar')
compile files('libs/notifications-1.0.1.jar')
compile files('libs/notification-hubs-0.4.jar')
 compile files('libs/Java-WebSocket-1.3.0.jar')
 compile project(':signalr-client-sdk-android-release')
}

 Please remember to follow these instructions to setup your Android Studio project in a correct manner, more details here:

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-android-get-started-push/

http://azure.microsoft.com/fi-fi/documentation/articles/notification-hubs-aspnet-backend-android-notify-users/

The most important piece of code is the class named MyHandler in this case which will handle your notifications once your device is registered to the notification hub:

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/MyHandler.java


package com.example.adriansimionescu.myfitnessandroidapp;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import com.microsoft.windowsazure.notifications.NotificationsHandler;

public class MyHandler extends NotificationsHandler {
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
    Context ctx;

    static public MainActivity mainActivity;

    @Override
    public void onReceive(Context context, Bundle bundle) {
        ctx = context;
        String nhMessage = bundle.getString("message");

        sendNotification(nhMessage);
        mainActivity.DialogNotify("Received Notification",nhMessage);
    }

    private void sendNotification(String msg) {
        mNotificationManager = (NotificationManager)
                ctx.getSystemService(Context.NOTIFICATION_SERVICE);

        PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
                new Intent(ctx, MainActivity.class), 0);

        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(ctx)
                        .setContentTitle("Notification Hub Demo")
                        .setStyle(new NotificationCompat.BigTextStyle()
                                .bigText(msg))
                        .setContentText(msg);

        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }
}</pre>
<pre>

You also need a class that will register you device to the notification hub:
https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/RegisterClient.java

 


package com.example.adriansimionescu.myfitnessandroidapp;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Set;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

public class RegisterClient {
    private static final String PREFS_NAME = "ANHSettings";
    private static final String REGID_SETTING_NAME = "ANHRegistrationId";
    private String Backend_Endpoint;
    SharedPreferences settings;
    protected HttpClient httpClient;
    private String authorizationHeader;

    public RegisterClient(Context context, String backendEnpoint) {
        super();
        this.settings = context.getSharedPreferences(PREFS_NAME, 0);
        httpClient =  new DefaultHttpClient();
        Backend_Endpoint = backendEnpoint + "/api/register";
    }

    public String getAuthorizationHeader() {
        return authorizationHeader;
    }

    public void setAuthorizationHeader(String authorizationHeader) {
        this.authorizationHeader = authorizationHeader;
    }

    public void register(String handle, Set<String> tags) throws ClientProtocolException, IOException, JSONException {
        String registrationId = retrieveRegistrationIdOrRequestNewOne(handle);

        JSONObject deviceInfo = new JSONObject();
        deviceInfo.put("Platform", "gcm");
        deviceInfo.put("Handle", handle);
        deviceInfo.put("Tags", new JSONArray(tags));

        int statusCode = upsertRegistration(registrationId, deviceInfo);

        if (statusCode == HttpStatus.SC_OK) {
            return;
        } else if (statusCode == HttpStatus.SC_GONE){
            settings.edit().remove(REGID_SETTING_NAME).commit();
            registrationId = retrieveRegistrationIdOrRequestNewOne(handle);
            statusCode = upsertRegistration(registrationId, deviceInfo);
            if (statusCode != HttpStatus.SC_OK) {
                Log.e("RegisterClient", "Error upserting registration: " + statusCode);
                throw new RuntimeException("Error upserting registration");
            }
        } else {
            Log.e("RegisterClient", "Error upserting registration: " + statusCode);
            throw new RuntimeException("Error upserting registration");
        }
    }

    private int upsertRegistration(String registrationId, JSONObject deviceInfo)
            throws UnsupportedEncodingException, IOException,
            ClientProtocolException {
        HttpPut request = new HttpPut(Backend_Endpoint+"/"+registrationId);
        request.setEntity(new StringEntity(deviceInfo.toString()));
        request.addHeader("Authorization", "Basic "+authorizationHeader);
        request.addHeader("Content-Type", "application/json");
        HttpResponse response = httpClient.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();
        return statusCode;
    }

    private String retrieveRegistrationIdOrRequestNewOne(String handle) throws ClientProtocolException, IOException {
        if (settings.contains(REGID_SETTING_NAME))
            return settings.getString(REGID_SETTING_NAME, null);

        HttpUriRequest request = new HttpPost(Backend_Endpoint+"?handle="+handle);
        request.addHeader("Authorization", "Basic "+authorizationHeader);
        HttpResponse response = httpClient.execute(request);
        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
            Log.e("RegisterClient", "Error creating registrationId: " + response.getStatusLine().getStatusCode());
            throw new RuntimeException("Error creating Notification Hubs registrationId");
        }
        String registrationId = EntityUtils.toString(response.getEntity());
        registrationId = registrationId.substring(1, registrationId.length()-1);

        settings.edit().putString(REGID_SETTING_NAME, registrationId).commit();

        return registrationId;
    }
}

After all these steps and setups you can finally go to your activity and add the following pieces of codes to fire up the connection and start listening to messages:
https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/MainActivity.java

import com.microsoft.windowsazure.messaging.*;
import com.microsoft.windowsazure.notifications.NotificationsManager;

// Define this properties in you activity class</pre>
<pre>private RegisterClient registerClient;
private String SENDER_ID = "";
private GoogleCloudMessaging gcm;
private NotificationHub hub;
private String HubName = "fittracker";
private String HubListenConnectionString = "";</pre>
<pre>
@SuppressWarnings("unchecked")
private void registerWithNotificationHubs() {
 new AsyncTask() {
 @Override
 protected Object doInBackground(Object... params) {
 try {
 String regid = gcm.register(SENDER_ID);
 DialogNotify("Registered Successfully", "RegId : " +
 hub.register(regid).getRegistrationId());
 } catch (Exception e) {
 DialogNotify("Exception",e.getMessage());
 return e;
 }
 return null;
 }
 }.execute(null, null, null);
}

/**
 * A modal AlertDialog for displaying a message on the UI thread
 * when theres an exception or message to report.
 *
 * @param title Title for the AlertDialog box.
 * @param message The message displayed for the AlertDialog box.
 */
public void DialogNotify(final String title,final String message)
{
 final AlertDialog.Builder dlg;
 dlg = new AlertDialog.Builder(this);

 runOnUiThread(new Runnable() {
 @Override
 public void run() {
 AlertDialog dlgAlert = dlg.create();
 dlgAlert.setTitle(title);
 dlgAlert.setButton(DialogInterface.BUTTON_POSITIVE,
 (CharSequence) "OK",
 new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
 }
 });
 dlgAlert.setMessage(message);
 dlgAlert.setCancelable(false);
 dlgAlert.show();
 }
 });
}</pre>
<pre>

So the first function will register you device and the next one will create a notification with a message in your device. Next you create the connection with this piece of code:


<pre>MyHandler.mainActivity = this;
NotificationsManager.handleNotifications(this, SENDER_ID, MyHandler.class);
gcm = GoogleCloudMessaging.getInstance(this);
hub = new NotificationHub(HubName, HubListenConnectionString, this);
registerWithNotificationHubs();</pre>

Notice how you pass your activity instance you the myhandler class. This is important.

And that’s it :D. Simple yet alot of work. Luckily Microsoft has made a good job documenting these steps. If in trouble don’t hesitate to look up on some documentation.

SignalR Hub

Implementing SignalR on the .NET side is rather easy BUT there is so much automation that it simply feel weird :). Everything seems to work if you just follow the instuctions but as I noticed one you poke around custom authentication and authorization you can really mess thing up. For example I wanted to add to my SignalR hun web project EDM mapping to a database or a custom authentication, well I made the mistake of choosing to use Entity Framework version 6.0 which uses a different version of Newtonsoft.json library which caused all sorts of problems. Another issue which I ran into was that I create a connection identification by client ID to be able to notify the client devices and services of changes within my system. At one point I did a simple mistake of forgeting to pass on the identification information which lead to weird errors on the client side browser such as IE and Chrome. The errors had nothing to do with the fact that the connection failed on the server side because the user ID was missing. The browsers expressed errors related to CORS which made no sense since I configured CORS support. So just be careful.Setting up a

Azure hosted SignalR hub

Start by looking at this source:

http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

To host my SignalR hub in Azure I simply created an empty web application and followed the instructions in the link above. Sample code:

https://github.com/lionadi/MyFitnessTracker/blob/master/SignalRGateway/SignalRGateway/ChatHub.cs

https://github.com/lionadi/MyFitnessTracker/blob/master/SignalRGateway/SignalRGateway/index.html

Also include the following SignalR nuget package:

Microsoft ASP .NET SignalR (to be able to host)

Microsoft ASP .NET Cross-Origin Support

Windows Azure Storage

Lets look at bit more closely at the ChartHub:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using SignalRGateway.AzureTableStorage;
using System.Configuration;

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using MyFitnessTrackerLibrary.Globals;

namespace SignalRGateway
{
 public class ChatHub : Hub
 {

 public void Send(string name, string message)
 {
 // Call the broadcastMessage method to update clients.
 var queryResult = this.SendMessageTo(name, message);
 foreach (var entity in queryResult)
 {
 Clients.Client(entity.RowKey).broadcastMessage(name, message);
 }
 }

 public void IsDataUpdateRequiredForWeb(string name, bool isRequired, string message)
 {
 var queryResult = this.SendMessageTo(name, message);
 foreach (var entity in queryResult)
 {
 Clients.Client(entity.RowKey).isDataUpdateRequiredForWeb(name, isRequired, message);
 }
 Clients.All.isDataUpdateRequiredForWeb(name, isRequired, message);
 }

 public void IsDataUpdateRequiredForMobileClient(string name, bool isRequired, string message)
 {
 var queryResult = this.SendMessageTo(name, message);
 foreach (var entity in queryResult)
 {
 Clients.Client(entity.RowKey).isDataUpdateRequiredForMobileClient(name, isRequired, message);
 }
 }

 private List<ConnectionEntity> SendMessageTo(String who, String message)
 {
 //var name = Context.User.Identity.Name;
 var name = this.GetConnectionUser();

 if (!String.IsNullOrEmpty(name))
 {
 var table = GetConnectionTable();

 // Notice that the partition keys are stored in azure storage as lower case
 var query = new TableQuery<ConnectionEntity>()
 .Where(TableQuery.GenerateFilterCondition(
 "PartitionKey",
 QueryComparisons.Equal,
 who.ToLowerInvariant()));

 var queryResult = table.ExecuteQuery(query).ToList();
 if (queryResult.Count == 0)
 {
 Clients.Caller.showErrorMessage("The user is no longer connected.");
 }
 else
 {
 // Load only once the host application connections to display the data there
 if(queryResult.Count(o=>o.PartitionKey.Equals(Constants.SignalR_HostApplicationUserName.ToLowerInvariant())) <= 0)
 queryResult.AddRange(this.SendMessageTo(Constants.SignalR_HostApplicationUserName, message));

 return queryResult;
 }
 }

 return new List<ConnectionEntity>();
 }

 // This assumes that "normmaly" all others clients than the host SignalR web application (this app) will use header named as username for user identification. The SignalR web app will user querystring.
 private String GetConnectionUser()
 {
 var name = Context.Headers[Constants.SignalR_HeaderID_Username];

 if (String.IsNullOrEmpty(name))
 {
 name = Context.QueryString[Constants.SignalR_HeaderID_Username];
 }
 if (String.IsNullOrEmpty(name))
 return null;

 // Notice that the partition keys are stored in azure storage as lower case
 return name.ToLowerInvariant();
 }

 public override Task OnConnected()
 {
 //var name = Context.User.Identity.Name;
 var name = this.GetConnectionUser();

 if(!String.IsNullOrEmpty(name))
 {
 var table = GetConnectionTable();
 var created = table.CreateIfNotExists();

 var entity = new ConnectionEntity(
 name.ToLower(),
 Context.ConnectionId);
 var insertOperation = TableOperation.InsertOrReplace(entity);
 table.Execute(insertOperation);
 }

 return base.OnConnected();
 }

 public override Task OnDisconnected(bool stopCalled)
 {
 //var name = Context.User.Identity.Name;
 var name = this.GetConnectionUser();

 if (!String.IsNullOrEmpty(name))
 {
 var table = GetConnectionTable();

 var deleteOperation = TableOperation.Delete(
 new ConnectionEntity(name, Context.ConnectionId) { ETag = "*" });
 table.Execute(deleteOperation);
 }

 return base.OnDisconnected(stopCalled);
 }

 private CloudTable GetConnectionTable()
 {

 var storageAccount =
 CloudStorageAccount.Parse(
 MyFitnessTrackerLibrary.Globals.MyFitAppSettings.AzureTableStorageConnectionString);
 var tableClient = storageAccount.CreateCloudTableClient();
 var table = tableClient.GetTableReference("connection");

 return table;
 }
 }
}

In my code example connections are stored and managed in Azure Table Storage(check the link below how to create one):
http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/

When you connect to the hub you will enter the OnConnected() function. Here my implementation seeks for the username header value or QueryString username value(this is to just go around a problem in JavaScript client which I did not want to spend to much time on). After this we connect to the Azure Table Storage and add a new connection to the table.

When disconnecting the reverse is done to the Azure Storage Table.

The GetConnectionTable() function will open a connection to the storage table(check from azure management web console for your connection data).

The SignlarR has threee function which will send information to listening clients based on connection IDs:

  • Send
  • IsDataUpdateRequiredForWeb
  • IsDataUpdateRequiredForMobileClient

The SendMessageTo() function is used to get all of the connection for a user name which needs to be notified of updates.

The code is pretty simple an easy. Microsoft has done a great job documenting this: http://www.asp.net/signalr

Last thing which I recommend to do is to configure CORS support:

https://github.com/lionadi/MyFitnessTracker/blob/master/SignalRGateway/SignalRGateway/Startup.cs


// Branch the pipeline here for requests that start with "/signalr"
 app.Map("/signalr", map =>
 {
 // Setup the CORS middleware to run before SignalR.
 // By default this will allow all origins. You can
 // configure the set of origins and/or http verbs by
 // providing a cors options with a different policy.
 map.UseCors(CorsOptions.AllowAll);
 var hubConfiguration = new HubConfiguration
 {
 // You can enable JSONP by uncommenting line below.
 // JSONP requests are insecure but some older browsers (and some
 // versions of IE) require JSONP to work cross domain
 // EnableJSONP = true
 };
 // Run the SignalR pipeline. We're not using MapSignalR
 // since this branch already runs under the "/signalr"
 // path.
 map.RunSignalR(hubConfiguration);
 });

Simply copy&paste the code above to get it to work but notice that it will allow requests from all possible connections.
http://www.asp.net/signalr/overview/security/introduction-to-security#csrf

Connecting and listening to activities with the following clients:

You will need to import the following libraries in Visual Studio to get you clients to work on SignalR:

Microsoft ASP .NET SignalR .NET Client

Microsoft ASP .NET SignalR JavaScript Client

Connecting with the .NET Client

The .NET Client code is pretty easy to understand:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR.Client;
using System.Threading.Tasks;
using MyFitnessTrackerLibrary.ServiceBus;
using MyFitnessTrackerLibrary.Globals;

namespace MyFitnessTrackerLibrary.SignalRLogic
{
 public class HubGateway
 {

 private String hubLocation = MyFitAppSettings.SignalRHubHostLocation;
 private static HubGateway _hubGateway = null;
 private String hubProxyName = MyFitAppSettings.SignalRHubProxy;
 private IHubProxy hubProxy = null;
 private HubConnection hubConnection = null;
 private String sourceID = "NO ID";

 public IHubProxy HubProxyPoint
 {
 get { return this.hubProxy; }
 }

 public String SourceID
 {
 get
 {
 return this.sourceID;
 }

 set

 {
 this.sourceID = value;
 }
 }

 public HubGateway()
 {
 hubConnection = new HubConnection(this.hubLocation);
 hubProxy = hubConnection.CreateHubProxy(hubProxyName);
 }

 ~HubGateway()
 {
 this.Stop();
 }

 public async Task SendNormalMessage(String name, String message)
 {
 await this.Start(name);
 await this.HubProxyPoint.Invoke("Send", name, message + " #Source ID: " + this.sourceID);
 }

 public async Task IsDataUpdateRequiredForWeb(String name, bool isRequired, String message)
 {
 await this.Start(name);
 await this.HubProxyPoint.Invoke("IsDataUpdateRequiredForWeb", name, isRequired, message + " #Source ID: " + this.sourceID);
 await NotificationGateway.GetInstance().SendMessage("New data was added. Your UI is updated/updating.");
 }

 public async Task IsDataUpdateRequiredForMobileClient(String name, bool isRequired, String message)
 {
 await this.Start(name);
 await this.HubProxyPoint.Invoke("IsDataUpdateRequiredForMobileClient", name, isRequired, message + " #Source ID: " + this.sourceID);
 await NotificationGateway.GetInstance().SendMessage("New data was added. Your UI is updated/updating.");
 }

 public static HubGateway GetInstance()
 {
 if( _hubGateway == null)
 {
 _hubGateway = new HubGateway();
 }

 return _hubGateway;
 }

 public async Task Start(String userName)
 {
 if (hubConnection.State == ConnectionState.Disconnected)
 {
 if(!this.hubConnection.Headers.ContainsKey(Constants.SignalR_HeaderID_Username))
 this.hubConnection.Headers.Add(new KeyValuePair<string, string>(Constants.SignalR_HeaderID_Username, userName));

 await hubConnection.Start();
 }
 }

 public void Stop()
 {
 hubConnection.Stop();
 }
 }
}

The important part in this code in when you call the Invoke() function to invoke in the SignalR hub the needed function and notify registered clients of updates.

The second important part is the Start() function. We add the username data in the connection, this way the hub knows where to send the messages/updates requests. Yes I know there is a bug in the code above, only one user will receive messages from this piece of code. I haven’t got around to fix this in my original project but it’s a simple matter.

Connecting with the JavaScript client

</pre>
<pre>
var connection = $.hubConnection(Constants.SignalRGatewayLocation);
 connection.qs = { "username": CookieHelper.UserName };
 var contosoChatHubProxy = connection.createHubProxy(Constants.SignalRHubProxyName);

 contosoChatHubProxy.on(Constants.SignalRHubMethod_IsDataUpdateRequiredForWeb, function (name, isRequired, message) {
 // Html encode display name and message.
 var encodedName = $('<div />').text(name).html();
 //var encodedMsg = $('<div />').text("isDataUpdateRequiredForWeb is Update Required: " + isRequired + " Message: " + message).html();
 var encodedMsg = $('<div />').text("Updating UI. New data from the mobile app.").html();
 // Add the message to the page.
 $('#notifications').append('<ul><li><strong>' + encodedName
 + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li></ul>');
 highChartsController.LoadProperChartByUserSelection();
 });

 connection.start()
 .done(function () {
 console.log('Now connected, connection ID=' + connection.id
 );
 })
 .fail(function () {
 console.log('Could not connect');
 });

The code above is rather simple. You create a connection, define the hub name, register to a function on the SignalR hub and start the connection.
The only “weird” part is that the username is passed in the QueryString and not in the header. This was due to a problem which I could not fix and had to go around. There might be a better solution out there.

Connecting with the Android client

Now here comes the hard part. Getting SignalR to work on android was a pain in the but :). Lots of weird problems and lack or proper documentation.

To start with you will need this library downloaded and compiled in Android Studio(or some other Java development tool you are using).

https://github.com/SignalR/java-client

You also might need the following library:

http://java-websocket.org/

Then a good place to go next would be:

https://whathecode.wordpress.com/2014/03/20/getting-started-with-the-java-signalr-sdk/

BUT the example above did not work for me as it was stated in the example. Here what I had to do:

Add to your Android project these libraries:

signalr-client-sdk.jar

Java-WebSocket-1.3.0.jar

signalr-client-sdk-android-release.aar

The following libraries can be added from Android Studio UI: File -> Project Structure. Then add a new library from the plus icon and in the new popup select the “import .JAR or .AAR Package”.

Your gradle file should look something like this:

dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile 'com.android.support:appcompat-v7:21.0.3'
 compile 'com.google.android.gms:play-services:6.5.87'
 compile 'com.google.code.gson:gson:2.3.1'
 compile files('libs/signalr-client-sdk.jar')
compile files('libs/notifications-1.0.1.jar')
compile files('libs/notification-hubs-0.4.jar')
 compile files('libs/Java-WebSocket-1.3.0.jar')
 compile project(':signalr-client-sdk-android-release')
}

The next step is to start to create a background service in Android that will be able to communicate with your desired activity.

We Start this by defining a interface which is implemented in the activity:

https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/ServiceCallbacks.java


package com.example.adriansimionescu.myfitnessandroidapp;

public interface ServiceCallbacks {
    void updateUI();
}</pre>
<pre>// To implement it in your activity:</pre>
<pre>public class MainActivity extends ActionBarActivity implements ServiceCallbacks {
...
}

Next we create the background service:
https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/SignalRService.java


package com.example.adriansimionescu.myfitnessandroidapp;

import android.app.IntentService;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import java.util.concurrent.ExecutionException;

import microsoft.aspnet.signalr.client.SignalRFuture;
import microsoft.aspnet.signalr.client.hubs.HubConnection;
import microsoft.aspnet.signalr.client.hubs.HubProxy;
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler1;
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler2;
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler3;
import microsoft.aspnet.signalr.client.transport.ClientTransport;
import microsoft.aspnet.signalr.client.transport.ServerSentEventsTransport;

public class SignalRService extends Service {

    // Binder given to clients
    private final IBinder binder = new LocalBinder();
    // Registered callbacks
    private ServiceCallbacks serviceCallbacks;

    // Class used for the client Binder.
    public class LocalBinder extends Binder {
        SignalRService getService() {
            // Return this instance of MyService so clients can call public methods
            return SignalRService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setCallbacks(ServiceCallbacks callbacks) {
        this.serviceCallbacks = callbacks;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Toast.makeText(this, "Service Start", Toast.LENGTH_LONG).show();

        String server = Constants.SignalRGateway;
        HubConnection connection = new HubConnection(server);
        connection.getHeaders().put("username", UserDataContainer.LoginData.userName);
        HubProxy proxy = connection.createHubProxy(Constants.SignalRHubName);

        //SignalRFuture<Void> awaitConnection = connection.start();

// This was added to get around a websocket problem with Android devices to the SignalR hub hosted in Azure
        ClientTransport transport = new ServerSentEventsTransport(connection.getLogger());

        SignalRFuture<Void> awaitConnection = connection.start(transport);
        try {
            awaitConnection.get();
            proxy.subscribe(this );
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //--------------------------------------------------------------------------------
    }

    public void Send( String name, String message )
    {
        final String fmessage = message;
        final String fname = name;

    }

    public void IsDataUpdateRequiredForMobileClient( String name, boolean isRequired, String message ) {
        final String fmessage = message;
        final String fname = name;
        final boolean fisrequired = isRequired;
        if (serviceCallbacks != null) {
            serviceCallbacks.updateUI();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}

There are a few important function.

onBind() => Use this to bind the actual instance of the service from your activity
setCallbacks() => use this to create a connection to the activity class interface so that we can call a desired method in the activity when a singalr message is received.

To bind to the SignalR function and message you need to define methods that use the same names as in the hub.
IsDataUpdateRequiredForMobileClient() and Send()

After the connection in made you need to call the subscribe method in the proxy class and pass the service class as a parameter. This will allow the binding between the defined methods above with the one in the SignalR hub.

The last part of the puzzle is that we call the interface function updateUI() which will trigger the same function in the activity to trigger and allow you to perform something in the activity.

Then all you have to do is to create the service instance in the activity, bind it and start it:
https://github.com/lionadi/MyFitnessTracker/blob/master/MyFitnessAndroidApp/app/src/main/java/com/example/adriansimionescu/myfitnessandroidapp/MainActivity.java

private SignalRService signalRService;</pre>
<pre>@Override
protected void onStart() {
    super.onStart();
    // Bind to LocalService

        Intent intent = new Intent(this, SignalRService.class);
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    // Do this to avoid starting multiple service, only one is needed
    if(this.signalRService == null) {
        this.startService(intent);
    }
}

@Override
protected void onStop() {
    super.onStop();

    // Unbind from service
    if (bound) {
        this.signalRService.setCallbacks(null); // unregister
        unbindService(serviceConnection);
        bound = false;
    }
}

/** Callbacks for service binding, passed to bindService() */
private ServiceConnection serviceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder service) {
        // cast the IBinder and get MyService instance
        SignalRService.LocalBinder binder = (SignalRService.LocalBinder) service;
        signalRService = binder.getService();
        bound = true;
        signalRService.setCallbacks(MainActivity.this); // register
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        bound = false;
    }
};

/* Defined by ServiceCallbacks interface */
@Override
public void updateUI() {
// update your UI here
}

In the OnStart() and OnStop() functions we bind and start the service.

In the serviceConnection class instance we do the actual binding and notice how the code maps the activity to the service to be able to call the updateUI() function below.

 

The End

Huh, a long post but I hope you got the idea how to use notification hub, azure table storage and singnalr to communicate between different service and devices in different manner. SignalR is pretty cool what you can do with it. Especially with games and backend stuff. Cool 🙂

Lessons learned from WebAPI and MVC Implementations

My Notes on a painful journey to learn, make and publish a Azure hosted MVC, Sinlge-Page application, Android client app and a WebAPI working with-one another. Software technology can be real pain in the ass!!!

JSON and Self referencing loop

If you get the following error:

Self referencing loop detected for property ‘your model’ with type ‘System.Data.Entity.DynamicProxies

Solution:

Loop Reference handling in Web API

My Solution:

I used [JsonIgnore] attribute to tell the proper inheritance to JSON serialization.

using Newtonsoft.Json;

public partial class Set
{
public Set()
{
this.Exercises = new HashSet<Exercise>();
}

public long Id { get; set; }
public string Name { get; set; }
public string UserId { get; set; }

public virtual ICollection<Exercise> Exercises { get; set; }
}

public partial class ExerciseRecord
{
public long Id { get; set; }
public double Record { get; set; }
public System.DateTime Date { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public long ExerciseId { get; set; }

[JsonIgnore]
public virtual Exercise Exercise { get; set; }
}

public partial class Exercise
{
public Exercise()
{
this.ExerciseAttributes = new HashSet<ExerciseAttribute>();
this.ExerciseRecords = new HashSet<ExerciseRecord>();
}

public long Id { get; set; }
public string Name { get; set; }
public double Target { get; set; }
public long SetId { get; set; }
[JsonIgnore]
public virtual Set Set { get; set; }
public virtual ICollection<ExerciseAttribute> ExerciseAttributes { get; set; }
public virtual ICollection<ExerciseRecord> ExerciseRecords { get; set; }
}

 

MVC loads older script files

This is due to browser script caching. The easiest solution for this is to set the browser which you are using to debug to retrieve the newest versions of web page content on each time you visit a webpage.

Missing Key definition from Model when creating a controller

You might get an error like this: EntityType ‘your type’ has no key defined. Define the key for this EntityType.

To fix such problems simply add this namespace definitions:

using System.ComponentModel.DataAnnotations;

And then define in your data model a key like this:

public class ColumnDataHighChart
{
[Key]
public int ID { get; set; }
public String Title { get; set; }
public String SubTitle { get; set; }
public IList<String> xAxisCategories { get; set; }
public String yAxisTitle { get; set; }
public IList<SeriesDataHighChart> Series { get; set; }

}

 

Intercepting web requests

 

I have two ways of doing this:

  1. A delegation handler
  2. Or an action filter for a controller.

Delegation handler

DelegatingHandler Class

Sample code:

public class AuthHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
// Call the inner handler.
var response = await base.SendAsync(request, cancellationToken);
return response;
}
}

Action filter for a controlle

Notice that for MVC and Web API there are two different sets of action filter definitions:

http://msdn.microsoft.com/en-us/library/system.web.http.filters.actionfilterattribute(v=vs.118).aspx

http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute(v=vs.118).aspx

MVC Sample:

public class AuthenticationActionFilterHelper : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
{
if (SessionHelper.LoggedInUser<AspNetUser>(HttpContext.Current.User.Identity.Name) == null)
{
//SessionHelper.UserSessionID = user.Id;
AspNetUsersController aspUserCon = new AspNetUsersController();
var sessionUser = aspUserCon.GetUser(HttpContext.Current.User.Identity.Name);
//SessionHelper.UserSessionID = user.UserName;
SessionHelper.LoggedInUser<AspNetUser>(sessionUser, sessionUser.UserName);
}
}
}

}

WebAPI Sample:

public class AuthenticationActionFilterHelper : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
}

public override System.Threading.Tasks.Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, System.Threading.CancellationToken cancellationToken)
{
return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);
}

public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
{
if (SessionHelper.LoggedInUser<AspNetUser>(HttpContext.Current.User.Identity.Name) == null)
{
//SessionHelper.UserSessionID = user.Id;
AspNetUsersController aspUserCon = new AspNetUsersController();
var sessionUser = aspUserCon.GetUser(HttpContext.Current.User.Identity.Name);
//SessionHelper.UserSessionID = user.UserName;
SessionHelper.LoggedInUser<AspNetUser>(sessionUser, sessionUser.UserName);
}
}
}

public override System.Threading.Tasks.Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{
return base.OnActionExecutingAsync(actionContext, cancellationToken);
}
}

 

Lambda Expression “Magic” 🙂

Retrieve distinct parent from child elements

As the title suggests I needed to retrieve the parent from a multilevel data set:

 

First I needed to get the child elements and in this exmaple it is assumed that you have the child elements retrieved.

Once you have the child elements it is time to get the distinct parent elements. for this I needed a way to group the distinct parent from the child elements. Here are my steps:

  • Get child elements:

ExerciseRecordsController exerciseRecordsController = new ExerciseRecordsController();
var exerciseRecordsData = exerciseRecordsController.GetExerciseRecords().Where(er => er.Date > startDate && er.Date < endDate && er.Exercise.Set.UserId.ToLower().CompareTo(this.user.Id.ToLower()) == 0);

  • Define a custom extension named “DistinctBy”

public static class LambdaExtensions
{
public static IEnumerable<t> DistinctBy<t>(this IEnumerable<t> list, Func<t, object> propertySelector)
{
return list.GroupBy(propertySelector).Select(x => x.First());
}
} Original code from: http://www.elevenwinds.com/linq-distinctby-with-lambda-expression-parameter

  • Apply the new extension on the data set

var setsData = exerciseRecordsData.DistinctBy(o => o.Exercise.SetId).Select( o => o.Exercise.Set);

How to create/populate a collection with data with an unknown data type

You may ask yourself why would anyone needs this? Well I do not why would others needs this but I came into a situation where I needed this.

I had a solution where I needed to be able to create data from a back-end server WebAPI to a JS HighCharts JS library without knowing what kind of data I would be processing, also I wanted to have the possibility to extend the back-end code so that it can return any kind of data to the client and let the client figure out what to do with the data.

So how to do this?

In a human language it goes something like this: Use LINQ in your code to go through the data set, select your data and return it as and array of objects, then create a new collection by passing to the constructor your processed data as an array of objects. Ofcourse your collection must store objects as well. The data type information is going to be stored because every class in C# is a descendant of the Object class.

public class SeriesDataHighChart
{
[Key]
public long ID { get; set; }
public String Name { get; set; }
public IList<object> Data { get; set; }
}

 

// One series corresponds to one set and data for each month
SeriesDataHighChart seriesData = new SeriesDataHighChart();

seriesData.ID = chartSet.Id;
seriesData.Name = chartSet.Name;
var seriesMonthsActivityCountData = (from monthActivityCount in chartSet.ChartSetMonthsData
select new object[] { monthActivityCount.ActivityCount as object });
seriesData.Data = new List<object>(seriesMonthsActivityCountData.ToArray());

hsData.Series.Add(seriesData);

 

You could also return an array of more complex object such as a key value pairs:

var sd = from d in unparsedData
select new object[] { d.Key as object, d.Value as object };

newSeries.Data = new Data(sd.ToArray());

Avoiding “Sequence contains no elements” exception in object initializers

If you have something like this in your code:

chartExercise.ChatMonthsData.Add(new ChartExerciseMonthData
{
ActivityCount = exercise.ExerciseRecords.Where(m => m.Date.Month == month && m.Date >= startDate && m.Date <= endDate).Count(),
StartDate = DateTime.Now.StartOfMonth(month),
EndDate = DateTime.Now.EndOfMonth(month),
MonthRecordAverage = exercise.ExerciseRecords.Where(m => m.Date.Month == month && m.Date >= startDate && m.Date <= endDate).Average(a => a.Record)

});

 

The Average lambda expression will throw the above exception error message because the Where clause may return Zero elements back(Notice that for example the Count expression will not throw a similar exception).

To fix(go around the problem, yes there might be other solutions but this was mine at the moment 🙂 ) I created an anonymous function that checks if there are elements returned by the clause and only then perform the Average operation on the elements. The solution is highlighted with the green color.

chartExercise.ChatMonthsData.Add(new ChartExerciseMonthData
{
ActivityCount = exercise.ExerciseRecords.Where(m => m.Date.Month == month && m.Date >= startDate && m.Date <= endDate).Count(),
StartDate = DateTime.Now.StartOfMonth(month),
EndDate = DateTime.Now.EndOfMonth(month),
MonthRecordAverage = new Func<double>(() => {
double averageRecord = 0;
var exerciseRecordByDateRange = exercise.ExerciseRecords.Where(m => m.Date.Month == month && m.Date >= startDate && m.Date <= endDate);
if (exerciseRecordByDateRange.Count() > 0)
averageRecord = exerciseRecordByDateRange.Average(a => a.Record);

return (averageRecord);
})()
});

 Get the count for a complex data structure/hierarchy, tree like

A rather simple implementation, choose to retrieve any records inside your main records set with a where:

set.Exercises.Where(o => o.ExerciseRecords.Any(m => m.Date.Month == month)).Count()

Update Azure SQL Database via SQL Server management studio and Generated scripts

  1. Mouse second button on database > Taskas > Generate Scripts > Choose your objects (Chose objects view) > Select “Advanced” button, then in the “Script for the database engine type” select option Windows Azure SQL Database
  2. Next open the database connection with management studio to your Azure SQL Database.
  3. Create a new empty database
  4. Open a new query windows and simply add the generated script to this window and run the script against the new empty database. This will create the structure and data if you selected so.

After deploying your WebAPI you get a following error when accessing your database data “There is already an open DataReader associated with this Command which must be closed first.”

To fix this error simply add the following to your connection strings used in your web api in Azure MultipleActiveResultSets=true.

Enable WebAPI Cross-Origin Resource Sharing (CORS)

You might run into problems after deploying your WebAPI to Azure and trying to access your api from different origins. Here is a solution:

http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En

Summary of the article above: Install the following nuget package in your WebAPI project: Microsoft.AspNet.WebApi.Cors

In your webapiconfig add the following(in green):

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

var cors = new EnableCorsAttribute(“*”, “*”, “*”);
config.EnableCors(cors);

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
name: “DefaultApi”,
routeTemplate: “api/{controller}/{id}”,
defaults: new { id = RouteParameter.Optional }
);

config.MessageHandlers.Add(new Handler.AuthHandler());
}
}

Next add the following to your ApplicationOAuthProvider.GrantResourceOwnerCredentials function:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add(“Access-Control-Allow-Origin”, new[] { “*” });
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
//SessionHelper.UserSessionID = user.Id;
AspNetUsersController aspUserCon = new AspNetUsersController();
var sessionUser = aspUserCon.GetUser(user.Id);
//SessionHelper.UserSessionID = user.UserName;
SessionHelper.LoggedInUser<AspNetUser>(sessionUser, user.UserName);
if (user == null)
{
context.SetError(“invalid_grant”, “The user name or password is incorrect.”);
return;
}

ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
CookieAuthenticationDefaults.AuthenticationType);

AuthenticationProperties properties = CreateProperties(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);

}

Notice that these changes may have undesired effects. Find out if these are suitable to your needs.

Good to Know: Windows Azure and Web Services functionality

Hi,

Here is my knowledge source listing for Windows Azure and Web Services functionality. Hope it helps someone:

Accessing Data
ADO.NET http://msdn.microsoft.com/en-us/library/e80y5yhx(v=vs.110).aspx
.NET Framework Data Providers http://msdn.microsoft.com/en-us/library/a6cd7c08(v=vs.110).aspx
ADO.NET Entity Data Model Designer http://msdn.microsoft.com/en-us/library/vstudio/cc716685(v=vs.100).aspx
ADO.NET Entity Data Model Designer http://msdn.microsoft.com/en-us/library/vstudio/cc716685(v=vs.100).aspx
ADO.NET Entity Data Model Tools http://msdn.microsoft.com/en-us/library/vstudio/bb399249(v=vs.100).aspx
Advanced using OData in .NET: WCF Data Services http://www.codeproject.com/Articles/135490/Advanced-using-OData-in-NET-WCF-Data-Services
ASP.NET Application State Overview http://msdn.microsoft.com/en-us/library/ms178594.aspx
ASP.NET Session State Overview http://msdn.microsoft.com/en-us/library/ms178581.aspx
CacheDependency Class http://msdn.microsoft.com/en-us/library/system.web.caching.cachedependency.aspx
CacheItemPolicy Class http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy(v=vs.110).aspx
CacheItemPriority Enumeration http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitempriority.aspx
ChangeMonitor Class http://msdn.microsoft.com/en-us/library/system.runtime.caching.changemonitor(v=vs.110).aspx
Code First to an Existing Database http://msdn.microsoft.com/en-us/data/jj200620.aspx
CommandType Enumeration http://msdn.microsoft.com/en-us/library/system.data.commandtype(v=vs.110).aspx
Configuring Parameters and Parameter Data Types http://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx
Create Database Wizard (Master Data Services Configuration Manager) http://technet.microsoft.com/en-us/library/ee633799.aspx
DataAdapter Class http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.aspx
DataAdapter.AcceptChangesDuringFill Property http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.acceptchangesduringfill(v=vs.110).aspx
DataContractAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx
DataSet Class http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx
DataSet Class http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx
DataTable Class http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx
DbContext Class http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx
DBContext vs ObjectContexts http://www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx
DbContext.SaveChanges Method http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.savechanges(v=vs.113).aspx
DbContext.Set<TEntity> Method http://msdn.microsoft.com/en-us/library/gg696521(v=vs.113).aspx
DbDataAdapter.Fill Method (DataSet) http://msdn.microsoft.com/en-us/library/zxkb3c3d(v=vs.110).aspx
DbDataAdapter.Update Method (DataSet) http://msdn.microsoft.com/en-us/library/at8a576f(v=vs.110).aspx
Demystifying Entity Framework Strategies: Loading Related Data (Eager Loading,  Lazy Loading, Explicitly Loading) http://msdn.microsoft.com/en-us/magazine/hh205756.aspx
EdmEntityTypeAttribute Class http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.edmentitytypeattribute(v=vs.110).aspx
EF Designer TPT Inheritance http://msdn.microsoft.com/en-us/data/jj618293.aspx
Entity Data Model Wizard http://msdn.microsoft.com/en-us/library/vstudio/bb399247(v=vs.100).aspx
Entity Framework http://msdn.microsoft.com/en-US/data/ef
Entity Framework – Database First http://msdn.microsoft.com/en-us/data/jj206878.aspx
Entity Framework (EF) Documentation http://msdn.microsoft.com/en-us/data/ee712907.aspx
Entity Framework 5: Controlling automatic query compilation http://blogs.msdn.com/b/stuartleeks/archive/2012/06/12/entity-framework-5-controlling-automatic-query-compilation.aspx
Entity Framework- Code First to a New Database http://msdn.microsoft.com/en-us/data/jj193542.aspx
EntityCommand Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entitycommand.aspx
EntityConnection Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection(v=vs.110).aspx
EntityObject Class http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject(v=vs.110).aspx
EntityTransaction Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entitytransaction.aspx
How to: Use Lazy Loading to Load Related Objects http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx
HttpContext.Cache Property http://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache(v=vs.110).aspx
Improve Performance with Entity Framework 5 http://devproconnections.com/entity-framework/improve-performance-entity-framework-5
IsolationLevel Enumeration http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx
LINQ (Language-Integrated Query) http://msdn.microsoft.com/en-us/library/bb397926.aspx
LINQ to Entities: Basic Concepts and Features http://www.codeproject.com/Articles/246861/LINQ-to-Entities-Basic-Concepts-and-Features
LINQ to Objects http://msdn.microsoft.com/en-us/library/bb397919.aspx
LINQ to XML [from BPUEDev11] http://msdn.microsoft.com/en-us/library/bb387098.aspx
LINQ to XML Overview http://msdn.microsoft.com/en-us/library/bb387061.aspx
Loading Related Entities (Eager Loading,  Lazy Loading, Explicitly Loading) http://msdn.microsoft.com/en-us/data/jj574232.aspx
Model-First in the Entity Framework 4 http://msdn.microsoft.com/en-us/data/ff830362.aspx
ObjectCache Class http://msdn.microsoft.com/en-us/library/vstudio/system.runtime.caching.objectcache
ObjectContext Class http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext(v=vs.110).aspx
ObjectContext management http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.contextoptions(v=vs.110).aspx
ObjectQuery Class http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery(v=vs.110).aspx
ObjectQuery.ToTraceString Method http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring(v=vs.110).aspx
ObjectQuery<T> Class http://msdn.microsoft.com/en-us/library/bb345303(v=vs.110).aspx
Object-relational impedance mismatch http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch
OData protocol http://www.odata.org/
Open Data Protocol by Example http://msdn.microsoft.com/en-us/library/ff478141.aspx
Plain Old CLR Object(POCO) http://en.wikipedia.org/wiki/Plain_Old_CLR_Object
Precompiling LINQ Queries http://msdn.microsoft.com/en-us/magazine/ee336024.aspx
Queries in LINQ to Entities http://msdn.microsoft.com/en-us/library/vstudio/bb399367(v=vs.100).aspx
Relational database management system http://en.wikipedia.org/wiki/Relational_database_management_system
Retrieving Data Using a DataReader http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx
SerializableAttribute Class http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx
SQL Server Connection Pooling (ADO.NET) http://msdn.microsoft.com/en-us/library/vstudio/8xx3tyca%28v%3Dvs.100%29
SqlCommand Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx
SqlCommand.CommandText Property http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtext(v=vs.110).aspx
SqlCommand.ExecuteReader Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereader(v=vs.110).aspx
SqlCommand.ExecuteScalar Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx
SqlConnection Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx
SqlConnectionStringBuilder Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx
SqlDataAdapter Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx
SqlDataReader Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx
SqlDataReader.Read Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx
SqlParameter Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx
SqlTransaction Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx
System.Data.EntityClient Namespace http://msdn.microsoft.com/en-us/library/system.data.entityclient(v=vs.110).aspx
System.Data.SqlClient Namespace http://msdn.microsoft.com/en-us/library/System.Data.SqlClient(v=vs.110).aspx
System.Transactions Namespace http://msdn.microsoft.com/en-us/library/system.transactions.aspx
System.Xml Namespaces http://msdn.microsoft.com/en-us/library/gg145036(v=vs.110).aspx
Table-per-Type vs Table-per-Hierarchy Inheritance http://blog.devart.com/table-per-type-vs-table-per-hierarchy-inheritance.html
The ADO.NET Entity Framework Overview http://msdn.microsoft.com/en-us/library/aa697427(v=vs.80).aspx
TransactionScope Class http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
Understanding ASP.NET View State http://msdn.microsoft.com/en-us/library/ms972976.aspx
Understanding Service-Oriented Architecture http://msdn.microsoft.com/en-us/library/aa480021.aspx
Update Model Wizard (Entity Data Model Tools) http://msdn.microsoft.com/en-us/library/vstudio/cc716705(v=vs.100).aspx
Using the DbContext API http://msdn.microsoft.com/en-us/data/gg192989.aspx
Using the REST Interface http://msdn.microsoft.com/en-us/library/ff798339.aspx
Walkthrough: Mapping Table-per-Hierarchy Inheritance in Dynamic Data http://msdn.microsoft.com/en-us/library/dd793152.ASPX
WCF Data Services 4.5 http://msdn.microsoft.com/en-us/library/cc668792(v=vs.110).aspx
WCF Data Services Overview http://msdn.microsoft.com/en-us/library/cc668794(v=vs.110).aspx
Working with Datasets in Visual Studio http://msdn.microsoft.com/en-us/library/8bw9ksd6%28v%3Dvs.110%29.aspx
Working with POCO Entities http://msdn.microsoft.com/en-us/library/vstudio/dd456853(v=vs.100).aspx
XElement Class http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx
XML Documents and Data http://msdn.microsoft.com/en-us/library/2bcctyt8(v=vs.110).aspx
XmlDocument Class http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx
XmlReader Class http://msdn.microsoft.com/en-us/library/vstudio/system.xml.xmlreader
XmlWriter Class http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx
XPath Examples http://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx
Designing and implementing WCF Services – Create, Configure, Secure, Consume
<basicHttpBinding> http://msdn.microsoft.com/en-us/library/ms731361(v=vs.110).aspx
<bindings> http://msdn.microsoft.com/en-us/library/ms731399(v=vs.110).aspx
<mexHttpBinding> http://msdn.microsoft.com/en-us/library/aa967390(v=vs.110).aspx
<mexHttpsBinding> http://msdn.microsoft.com/en-us/library/aa967391(v=vs.110).aspx
<mexNamedPipeBinding> http://msdn.microsoft.com/en-us/library/aa967280(v=vs.110).aspx
<netMsmqBinding> http://msdn.microsoft.com/en-us/library/ms731380(v=vs.110).aspx
<protocolMapping> http://msdn.microsoft.com/en-us/library/ee816881(v=vs.110).aspx
<wsHttpBinding> http://msdn.microsoft.com/en-us/library/ms731299(v=vs.110).aspx
Accessing Services Using a WCF Client http://msdn.microsoft.com/en-us/library/ms734691(v=vs.110).aspx
Azure Service Bus http://azure.microsoft.com/en-us/documentation/articles/fundamentals-service-bus-hybrid-solutions/
Basic [WCF Samples] http://msdn.microsoft.com/en-us/library/dd699756(v=vs.110).aspx
BasicHttpBinding Class http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding(v=vs.110).aspx
BinaryMessageEncodingBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binarymessageencodingbindingelement(v=vs.110).aspx
Binding [WCF Samples] http://msdn.microsoft.com/en-us/library/dd699760(v=vs.110).aspx
Chapter 7: Message and Transport Security http://msdn.microsoft.com/en-us/library/ff648863.aspx
Choosing a Message Exchange Pattern http://msdn.microsoft.com/en-us/library/aa751829(v=vs.110).aspx
CompositeDuplexBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.compositeduplexbindingelement(v=vs.110).aspx
Configuration Editor Tool (SvcConfigEditor.exe) http://msdn.microsoft.com/en-us/library/ms732009(v=vs.110).aspx
Configuring Services Using Configuration Files http://msdn.microsoft.com/en-us/library/ms733932(v=vs.110).aspx
Creating the Web Service Proxy http://msdn.microsoft.com/en-us/library/ms155134.aspx
Custom Binding Samples http://msdn.microsoft.com/en-us/library/vstudio/ms751479(v=vs.90).aspx
Custom Bindings http://msdn.microsoft.com/en-us/library/aa347793(v=vs.110).aspx
Data Contract Known Types http://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx
DataContractAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute(v=vs.110).aspx
DataMemberAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute(v=vs.110).aspx
Difference between BasicHttpBinding and WsHttpBinding http://www.codeproject.com/Articles/36396/Difference-between-BasicHttpBinding-and-WsHttpBind
Endpoints: Addresses, Bindings, and Contracts http://msdn.microsoft.com/en-us/library/ms733107(v=vs.110).aspx
EnumMemberAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute(v=vs.110).aspx
Extending Dispatchers http://msdn.microsoft.com/en-us/library/ms734665.aspx
Extensibility [WCF Samples] http://msdn.microsoft.com/en-us/library/dd699779(v=vs.110).aspx
Fault Contract http://msdn.microsoft.com/en-us/library/ms752208(v=vs.110).aspx
Fault Contract – Handling Errors in WCF and A Very Simple WCF Service Implementation http://www.codeproject.com/Articles/376303/Fault-Contract-Handling-Errors-in-WCF-and-A-Very-S
Getting Started Tutorial http://msdn.microsoft.com/en-us/library/ms734712(v=vs.110).aspx
Host WCF in an Azure worker role (CSAzureWCFWorkerRole) https://code.msdn.microsoft.com/windowsazure/CSAzureWCFWorkerRole-38b4e51d
Hosting WCF Services http://www.codemag.com/Article/0701041
How to: Create a Transactional Service http://msdn.microsoft.com/en-us/library/ms730232(v=vs.110).aspx
How to: Create a Windows Communication Foundation Client http://msdn.microsoft.com/en-us/library/ms733133(v=vs.110).aspx
How to: Expose a Metadata Endpoint http://msdn.microsoft.com/en-us/library/azure/ee706721.aspx
How to: Implement a Windows Communication Foundation Service Contract http://msdn.microsoft.com/en-us/library/ms734686(v=vs.110).aspx
How to: Inspect or Modify Messages on the Client http://msdn.microsoft.com/en-us/library/ms733786(v=vs.110).aspx
How to: Set the Security Mode http://msdn.microsoft.com/en-us/library/ms731884(v=vs.110).aspx
How to: Use the ChannelFactory http://msdn.microsoft.com/en-us/library/ms734681(v=vs.110).aspx
IClientMessageInspector Interface http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.110).aspx
IDispatchMessageInspector Interface http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector(v=vs.110).aspx
KnownTypeAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute(v=vs.110).aspx
Message Inspectors http://msdn.microsoft.com/en-us/library/aa717047(v=vs.110).aspx
Message Patterns in WCF Services http://msdn.microsoft.com/en-us/library/ff395349.aspx
Message Security in WCF http://msdn.microsoft.com/en-us/library/ms733137(v=vs.110).aspx
MetadataExchangeBindings Class http://msdn.microsoft.com/en-us/library/System.ServiceModel.Description.MetadataExchangeBindings(v=vs.110).aspx
MtomMessageEncodingBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.mtommessageencodingbindingelement(v=vs.110).aspx
NetMsmqBinding Class http://msdn.microsoft.com/en-us/library/system.servicemodel.netmsmqbinding(v=vs.110).aspx
NetNamedPipeBinding Class http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding(v=vs.110).aspx
OneWayBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.onewaybindingelement(v=vs.110).aspx
OperationBehaviorAttribute Class http://msdn.microsoft.com/en-us/library/system.servicemodel.operationbehaviorattribute(v=vs.110).aspx
OperationContractAttribute Class http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute(v=vs.110).aspx
Programming WCF Security http://msdn.microsoft.com/en-us/library/ms731925(v=vs.110).aspx
Publishing Metadata http://msdn.microsoft.com/en-us/library/aa751951(v=vs.110).aspx
Reliable Sessions Overview http://msdn.microsoft.com/en-us/library/ms733136.aspx
ReliableSessionBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.reliablesessionbindingelement(v=vs.110).aspx
Scenario [WCF Samples] http://msdn.microsoft.com/en-us/library/dd699770(v=vs.110).aspx
Securing and Authenticating a Service Bus Connection http://msdn.microsoft.com/library/azure/dd582773.aspx
SecurityBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.securitybindingelement(v=vs.110).aspx
Service Bus Bindings http://msdn.microsoft.com/library/azure/hh410102.aspx
Service Bus Queues, Topics, and Subscriptions http://msdn.microsoft.com/library/azure/hh367516.aspx
ServiceBehaviorAttribute Class http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute(v=vs.110).aspx
ServiceContractAttribute Class http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute(v=vs.110).aspx
ServiceHost Class http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost(v=vs.110).aspx
ServiceModel Metadata Utility Tool (Svcutil.exe) http://msdn.microsoft.com/en-us/library/aa347733(v=vs.110).aspx
Sessions, Instancing, and Concurrency http://msdn.microsoft.com/en-us/library/ms731193(v=vs.110).aspx
Simplified Configuration http://msdn.microsoft.com/en-us/library/ee358768(v=vs.110).aspx
Simplified Configuration for WCF Services http://msdn.microsoft.com/en-us/library/ee530014(v=vs.110).aspx
SslStreamSecurityBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.sslstreamsecuritybindingelement(v=vs.110).aspx
Status codes http://www.w3.org/Protocols/HTTP/HTRESP.html
System-Provided Bindings http://msdn.microsoft.com/en-us/library/ms730879.aspx
TextMessageEncodingBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.textmessageencodingbindingelement(v=vs.110).aspx
TransactionFlowBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.transactionflowbindingelement(v=vs.110).aspx
Transactions in WCF Services http://msdn.microsoft.com/en-us/library/ff384250.aspx
Types Supported by the Data Contract Serializer http://msdn.microsoft.com/en-us/library/ms731923.aspx
Using Data Contracts http://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx
WCF Configuration Tools http://msdn.microsoft.com/en-us/library/vstudio/hh323723(v=vs.100).aspx
WCF Extensibility – IParameterInspector http://blogs.msdn.com/b/endpoint/archive/2011/04/28/wcf-extensibility-iparameterinspector.aspx
WCF Extensibility: Parameter Inspectors http://cgeers.com/2008/11/09/wcf-extensibility-parameter-inspectors/
Versioning Strategies http://msdn.microsoft.com/en-us/library/ff384251.aspx
Windows Communication Foundation Endpoints http://msdn.microsoft.com/en-us/library/ms733821(v=vs.110).aspx
Windows Communication Foundation Tools http://msdn.microsoft.com/en-us/library/ms732015(v=vs.110).aspx
WindowsStreamSecurityBindingElement Class http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.windowsstreamsecuritybindingelement(v=vs.110).aspx
WSHttpBinding Class http://msdn.microsoft.com/en-us/library/system.servicemodel.wshttpbinding(v=vs.110).aspx
Creating and consuming Web API-based services – Design, Implement, Secure, Host and Manage, Consume
A WebAPI Basic Authentication Authorization Filter http://weblog.west-wind.com/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter
AcceptVerbsAttribute Class http://msdn.microsoft.com/en-us/library/system.web.http.acceptverbsattribute%28v=vs.118%29.aspx
ActionFilterAttribute Class http://msdn.microsoft.com/en-us/library/system.web.http.filters.actionfilterattribute(v=vs.118).aspx
Add Models and Controllers http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-2
Async Streaming in ASP.NET Web API http://blogs.msdn.com/b/henrikn/archive/2012/02/24/async-actions-in-asp-net-web-api.aspx
Asynchronous Programming with Async and Await (C# and Visual Basic) http://msdn.microsoft.com/en-us/library/hh191443.aspx
Authentication and Authorization in ASP.NET Web API http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Basic Authentication in ASP.NET Web API http://www.asp.net/web-api/overview/security/basic-authentication
Content Negotiation in ASP.NET Web API http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation
Cross-Site Request Forgery (CSRF) https://www.owasp.org/index.php/Cross-Site_Request_Forgery
Dependency Injection in ASP.NET Web API 2 http://www.asp.net/web-api/overview/advanced/dependency-injection
Enabling Cross-Origin Requests in ASP.NET Web API 2 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
Enabling CRUD Operations in ASP.NET Web API 1 http://www.asp.net/web-api/overview/older-versions/creating-a-web-api-that-supports-crud-operations
Forms Authentication in ASP.NET Web API http://www.asp.net/web-api/overview/security/forms-authentication
Getting Started with ASP.NET Web API 2 (C#) http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
How to host your web API. http://www.asp.net/web-api/overview/hosting-aspnet-web-api
HTTP Authentication: Basic and Digest Access Authentication http://www.ietf.org/rfc/rfc2617.txt
HttpClient Class http://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.118%29.aspx
HttpClient.GetAsync Method (String) http://msdn.microsoft.com/en-us/library/hh158944(v=vs.118).aspx
HttpMessageHandler Class http://msdn.microsoft.com/en-us/library/system.net.http.httpmessagehandler(v=vs.118).aspx
HttpResponseException Class http://msdn.microsoft.com/en-us/library/system.web.http.httpresponseexception(v=vs.118).aspx
HttpResponseMessage Class http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.118).aspx
Integrated Windows Authentication http://www.asp.net/web-api/overview/security/integrated-windows-authentication
JSON and XML Serialization in ASP.NET Web API http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization
Makecert.exe (Certificate Creation Tool) http://msdn.microsoft.com/en-us/library/bfsktky3.aspx
Media Formatters in ASP.NET Web API 2 http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
Media Formatters in ASP.NET Web API 2 http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
Parameter Binding in ASP.NET Web API http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Preventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks
Preventing CSRF Hacks in ASP.NET WebAPI http://www.dotnetcurry.com/showarticle.aspx?id=890
Routing Service http://msdn.microsoft.com/en-us/library/ee517423(v=vs.110).aspx
Routing Services [WCF Samples] http://msdn.microsoft.com/en-us/library/ee517423(v=vs.110).aspx
synchronous Streaming in ASP.NET WebApi http://weblogs.asp.net/andresv/asynchronous-streaming-in-asp-net-webapi
Using Asynchronous Methods in ASP.NET MVC 4 http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4
WEB API 2 USING ACTIONFILTERATTRIBUTE, OVERRIDEACTIONFILTERSATTRIBUTE AND IOC INJECTION http://damienbod.wordpress.com/2014/01/04/web-api-2-using-actionfilterattribute-overrideactionfiltersattribute-and-ioc-injection/
Working with SSL in Web API http://www.asp.net/web-api/overview/security/working-with-ssl-in-web-api
Deploying web applications and services
Azure Guest OS Releases and SDK Compatibility Matrix http://msdn.microsoft.com/library/azure/ee924680.aspx
Azure Service Definition Schema (.csdef File) http://msdn.microsoft.com/library/azure/ee758711.aspx
Configuring a Web Server for Web Deploy Publishing (Remote Agent) http://www.asp.net/web-forms/overview/deployment/configuring-server-environments-for-web-deployment/configuring-a-web-server-for-web-deploy-publishing-(remote-agent)
Configuring Parameters for Web Package Deployment http://www.asp.net/web-forms/overview/deployment/web-deployment-in-the-enterprise/configuring-parameters-for-web-package-deployment
Configuring Step 1: Install IIS and ASP.NET Modules http://www.iis.net/learn/application-frameworks/scenario-build-an-aspnet-website-on-iis/configuring-step-1-install-iis-and-asp-net-modules
Continuous Delivery for Cloud Services in Azure http://azure.microsoft.com/en-us/documentation/articles/cloud-services-dotnet-continuous-delivery/
Continuous delivery to Azure using Visual Studio Online http://azure.microsoft.com/en-us/documentation/articles/cloud-services-continuous-delivery-use-vso/
Export a Package through IIS Manager http://www.iis.net/learn/publish/using-web-deploy/export-a-package-through-iis-manager
Get Started with Azure Cmdlets http://msdn.microsoft.com/library/azure/jj554332.aspx
Get started with Azure Websites and ASP.NET http://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-get-started/
How to Configure Cloud Services http://azure.microsoft.com/en-us/documentation/articles/cloud-services-how-to-configure/
How to Deploy an Azure Website http://azure.microsoft.com/en-us/documentation/articles/web-sites-deploy/
IIS Information http://www.iis.net/
Installing and Configuring Web Deploy on IIS 7 http://www.iis.net/learn/install/installing-publishing-technologies/installing-and-configuring-web-deploy
Installing NuGet http://docs.nuget.org/docs/start-here/installing-nuget
Manage Deployments in Azure http://msdn.microsoft.com/en-us/library/azure/gg433027.aspx
NetworkConfiguration Schema http://msdn.microsoft.com/library/azure/jj156091.aspx
Nuspec Reference http://docs.nuget.org/docs/reference/nuspec-reference
Package Manager Console Powershell Reference http://docs.nuget.org/docs/Reference/Package-Manager-Console-PowerShell-Reference
Reference for the Web Application Package http://www.iis.net/learn/develop/windows-web-application-gallery/reference-for-the-web-application-package
Shadow Copying Assemblies http://msdn.microsoft.com/en-us/library/ms404279(v=vs.110).aspx
Step 1: Examining the Configuration Files http://msdn.microsoft.com/en-us/library/8f6988ab.aspx
Swap Deployment http://msdn.microsoft.com/en-us/library/azure/ee460814.aspx
Team Build + Web Deployment + Web Deploy + VS 2010 = Goodness http://vishaljoshi.blogspot.nl/2010/11/team-build-web-deployment-web-deploy-vs.html
Web Deploy Command Line Syntax http://technet.microsoft.com/en-us/library/dd569106.aspx
Web Deployment Overview for Visual Studio and ASP.NET http://msdn.microsoft.com/en-us/library/dd394698.aspx
Web.config Transformation Syntax for Web Project Deployment Using Visual Studio http://msdn.microsoft.com/en-us/library/dd465326.aspx
Xcopy http://technet.microsoft.com/en-us/library/cc771254.aspx

Good to know!?: .NET – Accessing, Querying and Manipulating data with Entity Framework

Hi,

I gathered some links and resources on data manipulation with the .NET Framework. Hope this helps and works as a reference card what is available:

ADO.NET http://msdn.microsoft.com/en-us/library/e80y5yhx(v=vs.110).aspx
Entity Framework http://msdn.microsoft.com/en-US/data/ef
Configuring Parameters and Parameter Data Types http://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx
.NET Framework Data Providers http://msdn.microsoft.com/en-us/library/a6cd7c08(v=vs.110).aspx
DataSet Class http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx
Retrieving Data Using a DataReader http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx
Entity Framework – Database First http://msdn.microsoft.com/en-us/data/jj206878.aspx
Entity Framework- Code First to a New Database http://msdn.microsoft.com/en-us/data/jj193542.aspx
ADO.NET Entity Data Model Designer http://msdn.microsoft.com/en-us/library/vstudio/cc716685(v=vs.100).aspx
Entity Data Model Wizard http://msdn.microsoft.com/en-us/library/vstudio/bb399247(v=vs.100).aspx
Create Database Wizard (Master Data Services Configuration Manager) http://technet.microsoft.com/en-us/library/ee633799.aspx
Update Model Wizard (Entity Data Model Tools) http://msdn.microsoft.com/en-us/library/vstudio/cc716705(v=vs.100).aspx
Using the DbContext API http://msdn.microsoft.com/en-us/data/gg192989.aspx
Table-per-Type vs Table-per-Hierarchy Inheritance http://blog.devart.com/table-per-type-vs-table-per-hierarchy-inheritance.html
Relational database management system http://en.wikipedia.org/wiki/Relational_database_management_system
ObjectContext Class http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext(v=vs.110).aspx
DBContext vs ObjectContexts http://www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx
DbContext Class http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx
ObjectContext management http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.contextoptions(v=vs.110).aspx
How to: Use Lazy Loading to Load Related Objects http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx
EntityObject Class http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject(v=vs.110).aspx
EdmEntityTypeAttribute Class http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.edmentitytypeattribute(v=vs.110).aspx
SerializableAttribute Class http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx
DataContractAttribute Class http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx
Entity Framework (EF) Documentation http://msdn.microsoft.com/en-us/data/ee712907.aspx
OData protocol http://www.odata.org/
Open Data Protocol by Example http://msdn.microsoft.com/en-us/library/ff478141.aspx
WCF Data Services Overview http://msdn.microsoft.com/en-us/library/cc668794(v=vs.110).aspx
Using the REST Interface http://msdn.microsoft.com/en-us/library/ff798339.aspx
Understanding Service-Oriented Architecture http://msdn.microsoft.com/en-us/library/aa480021.aspx
WCF Data Services 4.5 http://msdn.microsoft.com/en-us/library/cc668792(v=vs.110).aspx
Advanced using OData in .NET: WCF Data Services http://www.codeproject.com/Articles/135490/Advanced-using-OData-in-NET-WCF-Data-Services
ObjectCache Class http://msdn.microsoft.com/en-us/library/vstudio/system.runtime.caching.objectcache
HttpContext.Cache Property http://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache(v=vs.110).aspx
ASP.NET Application State Overview http://msdn.microsoft.com/en-us/library/ms178594.aspx
ASP.NET Session State Overview http://msdn.microsoft.com/en-us/library/ms178581.aspx
Understanding ASP.NET View State http://msdn.microsoft.com/en-us/library/ms972976.aspx
CacheItemPolicy Class http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy(v=vs.110).aspx
CacheItemPriority Enumeration http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitempriority.aspx
ChangeMonitor Class http://msdn.microsoft.com/en-us/library/system.runtime.caching.changemonitor(v=vs.110).aspx
CacheDependency Class http://msdn.microsoft.com/en-us/library/system.web.caching.cachedependency.aspx
System.Transactions Namespace http://msdn.microsoft.com/en-us/library/system.transactions.aspx
EntityTransaction Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entitytransaction.aspx
EntityCommand Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entitycommand.aspx
EntityConnection Class http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection(v=vs.110).aspx
SqlTransaction Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx
System.Data.EntityClient Namespace http://msdn.microsoft.com/en-us/library/system.data.entityclient(v=vs.110).aspx
IsolationLevel Enumeration http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx
TransactionScope Class http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
System.Xml Namespaces http://msdn.microsoft.com/en-us/library/gg145036(v=vs.110).aspx
XmlWriter Class http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx
XML Documents and Data http://msdn.microsoft.com/en-us/library/2bcctyt8(v=vs.110).aspx
XmlDocument Class http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx
XmlReader Class http://msdn.microsoft.com/en-us/library/vstudio/system.xml.xmlreader
XPath Examples http://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx
LINQ to XML [from BPUEDev11] http://msdn.microsoft.com/en-us/library/bb387098.aspx
LINQ to XML Overview http://msdn.microsoft.com/en-us/library/bb387061.aspx
XElement Class http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx
LINQ (Language-Integrated Query) http://msdn.microsoft.com/en-us/library/bb397926.aspx
DbContext.SaveChanges Method http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.savechanges(v=vs.113).aspx
DbContext.Set<TEntity> Method http://msdn.microsoft.com/en-us/library/gg696521(v=vs.113).aspx
Object-relational impedance mismatch http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch
Loading Related Entities (Eager Loading,  Lazy Loading, Explicitly Loading) http://msdn.microsoft.com/en-us/data/jj574232.aspx
Demystifying Entity Framework Strategies: Loading Related Data (Eager Loading,  Lazy Loading, Explicitly Loading) http://msdn.microsoft.com/en-us/magazine/hh205756.aspx
Precompiling LINQ Queries http://msdn.microsoft.com/en-us/magazine/ee336024.aspx
Entity Framework 5: Controlling automatic query compilation http://blogs.msdn.com/b/stuartleeks/archive/2012/06/12/entity-framework-5-controlling-automatic-query-compilation.aspx
Improve Performance with Entity Framework 5 http://devproconnections.com/entity-framework/improve-performance-entity-framework-5
Queries in LINQ to Entities http://msdn.microsoft.com/en-us/library/vstudio/bb399367(v=vs.100).aspx
LINQ to Entities: Basic Concepts and Features http://www.codeproject.com/Articles/246861/LINQ-to-Entities-Basic-Concepts-and-Features
LINQ to Objects http://msdn.microsoft.com/en-us/library/bb397919.aspx
SqlConnectionStringBuilder Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx
ObjectQuery<T> Class http://msdn.microsoft.com/en-us/library/bb345303(v=vs.110).aspx
ObjectQuery Class http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery(v=vs.110).aspx
ObjectQuery.ToTraceString Method http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring(v=vs.110).aspx
System.Data.SqlClient Namespace http://msdn.microsoft.com/en-us/library/System.Data.SqlClient(v=vs.110).aspx
SqlConnection Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx
SQL Server Connection Pooling (ADO.NET) http://msdn.microsoft.com/en-us/library/vstudio/8xx3tyca%28v%3Dvs.100%29
DataTable Class http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx
DataSet Class http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx
DataAdapter Class http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.aspx
SqlCommand Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx
SqlCommand.CommandText Property http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtext(v=vs.110).aspx
CommandType Enumeration http://msdn.microsoft.com/en-us/library/system.data.commandtype(v=vs.110).aspx
SqlDataAdapter Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx
SqlCommand.ExecuteScalar Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx
SqlCommand.ExecuteReader Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereader(v=vs.110).aspx
SqlDataReader Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx
SqlDataReader.Read Method http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx
DbDataAdapter.Fill Method (DataSet) http://msdn.microsoft.com/en-us/library/zxkb3c3d(v=vs.110).aspx
DbDataAdapter.Update Method (DataSet) http://msdn.microsoft.com/en-us/library/at8a576f(v=vs.110).aspx
DataAdapter.AcceptChangesDuringFill Property http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.acceptchangesduringfill(v=vs.110).aspx
Working with Datasets in Visual Studio http://msdn.microsoft.com/en-us/library/8bw9ksd6%28v%3Dvs.110%29.aspx
SqlParameter Class http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx
EF Designer TPT Inheritance http://msdn.microsoft.com/en-us/data/jj618293.aspx
Walkthrough: Mapping Table-per-Hierarchy Inheritance in Dynamic Data http://msdn.microsoft.com/en-us/library/dd793152.ASPX
Code First to an Existing Database http://msdn.microsoft.com/en-us/data/jj200620.aspx
Model-First in the Entity Framework 4 http://msdn.microsoft.com/en-us/data/ff830362.aspx
ADO.NET Entity Data Model Designer http://msdn.microsoft.com/en-us/library/vstudio/cc716685(v=vs.100).aspx
The ADO.NET Entity Framework Overview http://msdn.microsoft.com/en-us/library/aa697427(v=vs.80).aspx
ADO.NET Entity Data Model Tools http://msdn.microsoft.com/en-us/library/vstudio/bb399249(v=vs.100).aspx
Plain Old CLR Object(POCO) http://en.wikipedia.org/wiki/Plain_Old_CLR_Object
Working with POCO Entities http://msdn.microsoft.com/en-us/library/vstudio/dd456853(v=vs.100).aspx

Good to know!? C# 5.0 Key Features Reference – Part 2

Hi,

This are copy notes from the main key-points found in the MS 70-483 prep book. This might be useful to someone. A checklist of things in C#.

Also check out the exam link and the actual book:

http://www.microsoft.com/learning/en-us/exam-70-483.aspx

Exam Ref 70-483: Programming in C#

Implement multithreading and asynchronous processing
Using multiple threads can improve responsiveness and enables you to make use of multiple processors.
The Thread class can be used if you want to create your own threads explicitly. Otherwise, you can use the ThreadPool to queue work and let the runtime handle things.
A Task object encapsulates a job that needs to be executed. Tasks are the recommended way to create multithreaded code.
The Parallel class can be used to run code in parallel.
PLINQ is an extension to LINQ to run queries in parallel.
The new async and await operators can be used to write asynchronous code more easily.
Concurrent collections can be used to safely work with data in a multithreaded (concurrent access) environment.
Manage multithreading
When accessing shared data in a multithreaded environment, you need to synchronize
access to avoid errors or corrupted data.
 Use the lock statement on a private object to synchronize access to a piece of code.
 You can use the Interlocked class to execute simple atomic operations.
 You can cancel tasks by using the CancellationTokenSource class with a
CancellationToken.
Implement program flow
 Boolean expressions can use several operators: ==, !=, <, >, <=, >=, !. Those operators
can be combined together by using AND (&&), OR (||) and XOR (^).
 You can use the if-else statement to execute code depending on a specific condition.
 The switch statement can be used when matching a value against a couple of options.
56 Chapter 1 Manage program flow
The for loop can be used when iterating over a collection where you know the number of iterations in advance.
A while loop can be used to execute some code while a condition is true; do-while should be used when the code should be executed at least once.
foreach can be used to iterate over collections.
Jump statements such as break, goto, and continue can be used to transfer control to another line of the program.
Create and implement events and callbacks method
 Delegates can be instantiated, passed around, and invoked.
 Lambda expressions, also known as anonymous methods, use the => operator and
form a compact way of creating inline methods.
 Events are a layer of syntactic sugar on top of delegates to easily implement the
publish-subscribe pattern.
 Events can be raised only from the declaring class. Users of events can only remove
and add methods the invocation list.
 You can customize events by adding a custom event accessor and by directly using the
underlying delegate type.
Implement exception handling
 In the .NET Framework, you should use exceptions to report errors instead of error
codes.
 Exceptions are objects that contain data about the reason for the exception.
 You can use a try block with one or more catch blocks to handle different types of
exceptions.
 You can use a finally block to specify code that should always run after, whether or not
an exception occurred.
 You can use the throw keyword to raise an exception.
 You can define your own custom exceptions when you are sure that users of your code
will handle it in a different way. Otherwise, you should use the standard .NET Framework
exceptions.
Create types
 Types in C# can be a value or a reference type.
 Generic types use a type parameter to make the code more flexible.
 Constructors, methods, properties, fields, and indexer properties can be used to create
a type.
 Optional and named parameters can be used when creating and calling methods.
 Overloading methods enable a method to accept different parameters.
 Extension methods can be used to add new functionality to an existing type.
 Overriding enables you to redefine functionality from a base class in a derived class.
Consume types
 Boxing occurs when a value type is treated as a reference type.
When converting between types, you can have an implicit or an explicit conversion.
An explicit conversion is called casting and requires special syntax.
You can create your own implicit and explicit user-defined conversions.
The .NET Framework offers several helper methods for converting types.
The dynamic keyword can be used to ease the static typing of C# and to improve
interoperability with other languages.
Enforce encapsulation
Encapsulation is important in object-oriented software. It hides internal details and
improves the usability of a type.
Data can be encapsulated with a property.
Properties can have both a get and a set accessor that can run additional code, commonly
known as getters and setters.
Types and type elements can have access modifiers to restrict accessibility.
The access modifiers are public, internal, protected, protected, internal, and private.
Explicit interface implementation can be used to hide information or to implement
interfaces with duplicate member signatures.
Create and implement a class hierarchy
Inheritance is the process in which a class is derived from another class or from an interface.
An interface specifies the public elements that a type must implement.
A class can implement multiple interfaces.
A base class can mark methods as virtual; a derived class can then override those methods to add or replace behavior.
A class can be marked as abstract so it can’t be instantiated and can function only as a base class.
A class can be marked as sealed so it can’t be inherited.
The .NET Framework offers default interfaces such as IComparable, IEnumerable, IDisposable and IUnknown.
Find, execute, and create types at runtime by using reflection
A C# assembly stores both code and metadata.
Attributes are a type of metadata that can be applied in code and queried at runtime.
Reflection is the process of inspecting the metadata of a C# application.
Through reflection you can create types, call methods, read properties, and so forth.
The CodeDOM can be used to create a compilation unit at runtime. It can be compiled or converted to a source file.
Expression trees describe a piece of code. They can be translated to something else (for example, SQL) or they can be compiled and executed.
Manage the object life cycle
 Memory in C# consists of both the stack and the heap.
 The heap is managed by the garbage collector.
 The garbage collector frees any memory that is not referenced any more.
 A finalizer is a special piece of code that’s run by the garbage collector when it removes
an object.
 IDisposable can be implemented to free any unmanaged resources in a deterministic
way.
 Objects implementing IDisposable can be used with a using statement to make sure
they are always freed.
 A WeakReference can be used to maintain a reference to items that can be garbage
collected when necessary.
Manipulate strings
A string is an immutable reference type.
When doing a lot of string manipulations, you should use a StringBuilder.
The String class offers a lot of methods for dealing with strings like IndexOf, LastIndexOf, StartsWith, EndsWith, and Substring.
Strings can be enumerated as a collection of characters.
Formatting is the process of displaying an object as a string.
You can use format strings to change how an object is converted to a string.
You can implement formatting for your own types.
Validate application input
 Validating application input is important to protect your application against both
mistakes and attacks.
 Data integrity should be managed both by your application and your data store.
 The Parse, TryParse, and Convert functions can be used to convert between types.
 Regular expressions, or regex, can be used to match input against a specified pattern
or replace specified characters with other values.
 When receiving JSON and XML files, it’s important to validate them using the built-in
types, such as with JavaScriptSerializer and XML Schemas.
Perform symmetric and asymmetric
encryption
 An asymmetric algorithm uses a public and private key that are mathematically linked.
 Hashing is the process of converting a large amount of data to a smaller hash code.
 Digital certificates can be used to verify the authenticity of an author.
 CAS are used to restrict the resources and operations an application can access and
execute.
 System.Security.SecureString can be used to keep sensitive string data in memory.
Manage assemblies
An assembly is a compiled unit of code that contains metadata.
An assembly can be strongly signed to make sure that no one can tamper with the content.
Signed assemblies can be put in the GAC.
An assembly can be versioned, and applications will use the assembly version they were developed with. It’s possible to use configuration files to change these bindings.
A WinMD assembly is a special type of assembly that is used by WinRT to map non-native languages to the native WinRT components.
Debug an application
Visual Studio build configurations can be used to configure the compiler.
 A debug build outputs a nonoptimized version of the code that contains extra instructions
to help debugging.
 A release build outputs optimized code that can be deployed to a production
environment.
 Compiler directives can be used to give extra instructions to the compiler. You can use
them, for example, to include code only in certain build configurations or to suppress
certain warnings.
 A program database (PDB) file contains extra information that is required when debugging
an application.
Implement diagnostics in an application
 Logging and tracing are important to monitor an application that is in production and
should be implemented right from the start.
 You can use the Debug and TraceSource classes to log and trace messages. By configuring
different listeners, you can configure your application to know which data to send
where.
 When you are experiencing performance problems, you can profile your application to
find the root cause and fix it.
 Performance counters can be used to constantly monitor the health of your applications.
Perform I/O operations
 You can work with drives by using Drive and DriveInfo.
 For folders, you can use Directory and DirectoryInfo.
 File and FileInfo offer methods to work with files.
 The static Path class can help you in creating and parsing file paths.
 Streams are an abstract way of working with a series of bytes.
 There are many Stream implementations for dealing with files, network operations,
and any other types of I/O.
 Remember that the file system can be accessed and changed by multiple users at the
same time. You need to keep this in mind when creating reliable applications.
 When performing network requests, you can use the WebRequest and WebResponse
classes from the System.Net namespace.
 Asynchronous I/O can help you create a better user experience and a more scalable
application.
Consume data
 ADO.NET uses a provider model that enables you to connect to different types of
databases.
 You use a DbConnection object to create a connection to a database.
 You can execute queries that create, update, read, and delete (CRUD) data from a
database.
 When creating queries it’s important to use parameterized queries so you avoid SQL
injection.
Objective 4.3: Query and manipulate data and objects by using LINQ CHAPTER 4 291
You can consume a web service from your application by creating a proxy for it.
You can work with XML by using the XmlReader, XmlWriter, XPathNavigator, and XmlDocument classes.
Query and manipulate data and objects by using LINQ
 LINQ, which stands for Language Integrated Query, is a uniform way of writing queries
against multiple data sources.
 Important language features when working with LINQ queries are implicit typing, object
initialization syntax, lambdas, extension methods, and anonymous types.
 You can use LINQ with a method-based syntax and the query syntax.
 LINQ queries are deferred-execution, which means that the query executes when it is
first iterated.
 You can use LINQ to XML to query, create, and update XML.
Serialize and deserialize data
 Serialization is the process of transforming an object to a flat file or a series of bytes.
 Deserialization takes a series of bytes or a flat file and transforms it into an object.
 XML serialization can be done by using the XmlSerializer.
 You can use special attributes to configure the XmlSerializer.
 Binary serialization can be done by using the BinaryFormatter class.
 WCF uses another type of serialization that is performed by the DataContractSerializer.
 JSON is a compact text format that can be created by using the DataContractJsonSerializer.
Store data in and retrieve data from collections
 The .NET Framework offers both generic and nongeneric collections. When possible,
you should use the generic version.
 Array is the most basic type to store a number of items. It has a fixed size.
 List is a collection that can grow when needed. It’s the most-used collection.
 Dictionary stores and accesses items using key/value pairs.
 HashSet stores unique items and offers set operations that can be used on them.
 A Queue is a first-in, first-out (FIFO) collection.
 A Stack is a first-in, last-out (FILO) collection.
 You can create a custom collection by inheriting from a collection class or inheriting
from one of the collection interfaces.