ByteScout Barcode Reader SDK - ASP.NET - Read From Live Camera (C# - MVC) - ByteScout

ByteScout Barcode Reader SDK – ASP.NET – Read From Live Camera (C# – MVC)

  • Home
  • /
  • Articles
  • /
  • ByteScout Barcode Reader SDK – ASP.NET – Read From Live Camera (C# – MVC)

Use ByteScout Barcode Reader SDK in ASP.NET to Read From Live Camera (C# – MVC)

Barcode Reader SDK is created to assist both expert and entry-level developers to read barcodes from a live camera (C# – MVC). This Barcode Reader SDK also comes with an extensive library to simplify the process of common tasks of barcodes processing in ASP.NET.

Barcode Reader SDK is also loaded with state-of-the-art OCR and image recognition technology. Thus, it can be utilized in reading barcodes from images, scanned documents, and PDFs.

To enable you to utilize this Barcode Reader SDK without spending much time and energy in writing and testing codes, we provide you here with a sample code. All you got to do is copy and paste it into your ASP.NET project and let it do the barcode reading work for you. This ASP.NET code snippet is also available on our GitHub.

A downloadable FREE ByteScout trial version is available on our website. For your convenience, it also comes with programming tutorials to go along with source code samples.

HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace BarcodeReader.Controllers
{
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Text;
    using Bytescout.BarCodeReader;

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            if (file != null)
            {
                string name = file.FileName;
                string path = Path.Combine(Server.MapPath("/"), Path.GetFileName(name));
                file.SaveAs(path);
                ViewBag.Barcodes = Barcode.FindBarcodes(path);
                ViewBag.Img = name;
            }

            return View();
        }

        [HttpPost]
        public ActionResult UploadHtml5(string image, string type)
        {
            try
            {
                StringBuilder send = new StringBuilder();
                // lock by send variable 
                lock (send)
                {
                    // convert base64 string from the client side into byte array
                    byte[] bitmapArrayOfBytes = Convert.FromBase64String(image);
                    // convert the byte array into the bitmap 

                    Bitmap bp = (Bitmap)Bitmap.FromStream(new MemoryStream(bitmapArrayOfBytes));

                    bp.Save("c:\\temp\\barcode.jpg",ImageFormat.Jpeg);
                    // new bytescout barcode reader sdk object
                    Reader reader = new Reader();
                    // get the type to find from user's selection in the combobox
                    reader.BarcodeTypesToFind = Barcode.GetBarcodeTypeToFindFromCombobox(type);
                    // read image to get barcodes
                    reader.ReadFrom(bp);
                    // check if we have got barcodes from the image
                    if (reader.FoundBarcodes != null)
                    {
                        // add each barcode into the string 
                        foreach (FoundBarcode barcode in reader.FoundBarcodes)
                        {
                            // add barcodes as text into the output string
                            send.AppendLine(String.Format("{0} : {1}", barcode.Type, barcode.Value));
                        }
                    }
                    // return the output string
                    return Json(new { d = send.ToString() });
                } // end of lock
            }
            catch (Exception ex)
            {
                // return the exception instead
                return Json(new { d = ex.Message + "\r\n" + ex.StackTrace });
            }

        }

        [HttpPost]
        public ActionResult UploadFlash(string type)
        {
            try
            {
                String send = "";
                System.Drawing.Image originalimg;
                // read barcode type set 
                MemoryStream log = new MemoryStream();
                byte[] buffer = new byte[1024];
                int c;
                // read input buffer with image and saving into the "log" memory stream
                while ((c = Request.InputStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    log.Write(buffer, 0, c);
                }
                // create image object
                originalimg = System.Drawing.Image.FromStream(log);
                // resample image
                originalimg = originalimg.GetThumbnailImage(640, 480, new System.Drawing.Image.GetThumbnailImageAbort(() => { return false; }), IntPtr.Zero);

                Bitmap bp = new Bitmap(originalimg);

                bp.Save("c:\\temp\\barcode.jpg", ImageFormat.Jpeg);

                // create bytescout barcode reader object
                Reader reader = new Reader();
                // set barcode type to read
                reader.BarcodeTypesToFind = Barcode.GetBarcodeTypeToFindFromCombobox(type);
                // read barcodes from image
                reader.ReadFrom(bp);
                // if there are any result then convert them into a single stream
                if (reader.FoundBarcodes != null)
                {
                    foreach (FoundBarcode barcode in reader.FoundBarcodes)
                    {
                        // form the output string
                        send = send + (String.Format("{0} : {1}", barcode.Type, barcode.Value));
                    }
                }
                // close the memory stream
                log.Close();
                // dispose the image object
                originalimg.Dispose();
                // write output 
                return Content("<d>" + send + "</d>");
            }
            catch (Exception ex)
            {
                // write the exception if any
                return Content("<d>" + ex + "</d>");
            }
        }
    }

}

Barcode.cs

namespace BarcodeReader
{
    using Bytescout.BarCodeReader;

    public class Barcode
    {
        public static FoundBarcode[] FindBarcodes(string fileName)
        {
            Reader reader = new Reader();

            // Limit search to 1D barcodes only (exclude 2D barcodes to speed up the search).
            // Change to reader.BarcodeTypesToFind.SetAll() to scan for all supported 1D and 2D barcodes 
            // or select specific type, e.g. reader.BarcodeTypesToFind.PDF417 = True
            reader.BarcodeTypesToFind.SetAll();

            // reader.MediumTrustLevelCompatible = true; // uncomment this line to enable Medium Trust compatible mode (slows down the recognition process as direct image data access is disabled in Medium Trust mode)
            reader.ReadFromFile(fileName);
            return reader.FoundBarcodes;
        }

        public static BarcodeTypeSelector GetBarcodeTypeToFindFromCombobox(string barType)
        {
            string selectedItemText = barType.Trim().ToUpper();
            BarcodeTypeSelector barcodeTypeToScan = new BarcodeTypeSelector();

            if (selectedItemText.IndexOf("ALL BARCODES") > -1)
                barcodeTypeToScan.SetAll();
            else if (selectedItemText.IndexOf("ALL LINEAR BARCODES") > -1)
                barcodeTypeToScan.SetAll1D();
            else if (selectedItemText.IndexOf("ALL 2D BARCODES") > -1)
                barcodeTypeToScan.SetAll2D();
            else if (selectedItemText.IndexOf("AZTEC") > -1)
                barcodeTypeToScan.Aztec = true;
            else if (selectedItemText.IndexOf("CODABAR") > -1)
                barcodeTypeToScan.Codabar = true;
            else if (selectedItemText.IndexOf("CODE 39") > -1)
                barcodeTypeToScan.Code39 = true;
            else if (selectedItemText.IndexOf("CODE 128") > -1)
                barcodeTypeToScan.Code128 = true;
            else if (selectedItemText.IndexOf("DATAMATRIX") > -1)
                barcodeTypeToScan.DataMatrix = true;
            else if (selectedItemText.IndexOf("EAN 13") > -1)
                barcodeTypeToScan.EAN13 = true;
            else if (selectedItemText.IndexOf("GS1-128") > -1)
                barcodeTypeToScan.GS1 = true;
            else if (selectedItemText.IndexOf("GS1DATABAREXPANDED") > -1)
                barcodeTypeToScan.GS1DataBarExpanded = true;
            else if (selectedItemText.IndexOf("GS1DATABAREXPANDEDSTACKED") > -1)
                barcodeTypeToScan.GS1DataBarExpandedStacked = true;
            else if (selectedItemText.IndexOf("GS1DATABARLIMITED") > -1)
                barcodeTypeToScan.GS1DataBarLimited = true;
            else if (selectedItemText.IndexOf("GS1DATABAROMNIDIRECTIONAL") > -1)
                barcodeTypeToScan.GS1DataBarOmnidirectional = true;
            else if (selectedItemText.IndexOf("GS1DATABARSTACKED") > -1)
                barcodeTypeToScan.GS1DataBarStacked = true;
            else if (selectedItemText.IndexOf("I2OF5") > -1)
                barcodeTypeToScan.Interleaved2of5 = true;
            else if (selectedItemText.IndexOf("PATCH") > -1)
                barcodeTypeToScan.PatchCode = true;
            else if (selectedItemText.IndexOf("PDF 417") > -1)
                barcodeTypeToScan.PDF417 = true;
            else if (selectedItemText.IndexOf("QR CODE") > -1)
                barcodeTypeToScan.QRCode = true;
            else if (selectedItemText.IndexOf("UPCA") > -1)
                barcodeTypeToScan.UPCA = true;
            else if (selectedItemText.IndexOf("UPCE") > -1)
                barcodeTypeToScan.UPCE = true;
            else if (selectedItemText.IndexOf("MAXICODE") > -1)
                barcodeTypeToScan.MaxiCode = true;

            return barcodeTypeToScan;
        }
    }
}

index.js

var canvas, context, timer;
//  (HTML5 based camera only) this portion of code will be used when browser supports navigator.getUserMedia  *********     */
window.addEventListener("DOMContentLoaded", function () {
    canvas = document.getElementById("canvasU"),
    context = canvas.getContext("2d"),
    video = document.getElementById("video"),
    videoObj = { "video": true },
    errBack = function (error) {
        console.log("Video capture error: ", error.code);
    };

    // check if we can use HTML5 based camera (through .getUserMedia() function)
    if (navigator.getUserMedia) { // Standard browser (Opera)
        // display HTML5 camera
        document.getElementById("userMedia").style.display = '';
        // adding click event to take photo from webcam
        document.getElementById("snap").addEventListener("click", function () {
            context.drawImage(video, 0, 0, 640, 480);
        });
        navigator.getUserMedia(videoObj, function (stream) {
            video.src = window.URL.createObjectURL(stream);
            video.play();
        }, errBack);
    }
        // check if we can use HTML5 based camera (through .getUserMedia() function in Webkit based browser)
    else if (navigator.webkitGetUserMedia) { // WebKit-prefixed for Google Chrome
        // display HTML5 camera
        document.getElementById("userMedia").style.display = '';
        // adding click event to take photo from webcam
        document.getElementById("snap").addEventListener("click", function () {
            context.drawImage(video, 0, 0, 640, 480);
        });
        navigator.webkitGetUserMedia(videoObj, function (stream) {
            video.src = window.webkitURL.createObjectURL(stream);
            video.play();
        }, errBack);
    }
        // check if we can use HTML5 based camera (through .getUserMedia() function in Firefox based browser)
    else if (navigator.mozGetUserMedia) { // moz-prefixed for Firefox 
        // display HTML5 camera
        document.getElementById("userMedia").style.display = '';
        // adding click event to take photo from webcam
        document.getElementById("snap").addEventListener("click", function () {
            context.drawImage(video, 0, 0, 640, 480);
        });
        navigator.mozGetUserMedia(videoObj, function (stream) {
            video.mozSrcObject = stream;
            video.play();
        }, errBack);
    }
    else
        // if we can not use any of HTML5 based camera ways then we use Flash based camera
    {
        // display Flash camera
        document.getElementById("flashDiv").style.display = '';
        document.getElementById("flashOut").innerHTML = (webcam.get_html(640, 480));
    }

}, false);

// (all type of camera) set the default selection of barcode type
var selection = "All barcodes (slow)";

// (all type of camera) gets the selection text of "barcode type to scan" combobox
function selectType(type) {
    selection = type.options[type.selectedIndex].text;
}

// (HTML5 based camera only)
// uploads the image to the server 
function UploadToCloud() {
    document.getElementById('report').innerHTML = "scanning the current frame......";
    context.drawImage(video, 0, 0, 640, 480);
    $("#upload").attr('disabled', 'disabled');
    $("#upload").attr("value", "Uploading...");
    var img = canvas.toDataURL('image/jpeg', 0.9).split(',')[1];
    // send AJAX request to the server with image data 
    $.ajax({
        url: "/Home/UploadHtml5",
        type: "POST",
        data: "{ 'image': '" + img + "' , 'type': '" + selection + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        // on success output the result returned by the server side (See HTML5Camera.aspx)
        success: function (data, status) {
            $("#upload").removeAttr('disabled');
            $("#upload").attr("value", "Upload");
            if (data.d.length != 0) {
                var htmlSelect = document.getElementById('OutListBoxHTML5');
                var selectBoxOption = document.createElement("option");
                selectBoxOption.text = data.d;
                selectBoxOption.id = "child";
                htmlSelect.insertBefore(selectBoxOption, htmlSelect.childNodes[0]);
            }
        },
        // on error just show the message that no barcodes were found
        error: function (data) {
            document.getElementById('report').innerHTML = "no barcode found, scanning.....";
            $("#upload").removeAttr('disabled');
            $("#upload").attr("value", "Upload");
        },
        async: false
    });
    timer = setTimeout(UploadToCloud, 3000);  // will capture new image to detect barcode after 3000 mili second
}

// (flash based camera only) stop the capturing 
function stopCall() {
    document.getElementById('report').innerHTML = "STOPPED Scanning."
    clearTimeout(timer);
}

// (flash based camera only) sets the handler for callback completition to output the result
webcam.set_hook('onComplete', 'my_completion_handler');

// (flash based camera only) this function will start flash to capture image and send the image to the server for further processing (for IE)
function take_snapshot() {
    // set api to be called by flash camera
    webcam.set_api_url('/home/UploadFlash?type=' + selection);
    webcam.set_quality(100);
    // enable the shutter sound
    webcam.set_shutter_sound(true);
    document.getElementById('upload_results').innerHTML = '<h4>Scanning...</h4>';
    // capture image from the webcam
    webcam.snap();
    // set timout to capter new image (interval between captures)
    timer = setTimeout(take_snapshot, 3000);
}

// (flash based camera only) this one will work after recieving barcode from server
// this function writes the output result back to the front page (from server side)
function my_completion_handler(msg) {
    var str = msg;
    // encode into html compatible string
    var result = str.match(/<d>(.*?)<\/d>/g).map(function (val) {
        return val.replace(/<\/?d>/g, '');
    });
    // add new result into the listbox 
    var htmlSelect = document.getElementById('OutListBoxFlash');
    var selectBoxOption = document.createElement("option");
    selectBoxOption.text = result;
    selectBoxOption.id = "child";
    htmlSelect.insertBefore(selectBoxOption, htmlSelect.childNodes[0]);
    // reset webcam and flash to capture new image. this reset process flickers a little
    webcam.reset();
}

// (flash based camera only) stop the scan and set the message on the page
function stopScanning() {
    document.getElementById('upload_results').innerHTML = "STOPPED Scanning."
    clearTimeout(timer);
}

webcam.js

/* JPEGCam v1.0.9 */
/* Webcam library for capturing JPEG images and submitting to a server */
/* Copyright (c) 2008 - 2009 Joseph Huckaby <jhuckaby@goldcartridge.com> */
/* Licensed under the GNU Lesser Public License */
/* http://www.gnu.org/licenses/lgpl.html */

/* Usage:
	<script language="JavaScript">
		document.write( webcam.get_html(320, 240) );
		webcam.set_api_url( 'test.php' );
		webcam.set_hook( 'onComplete', 'my_callback_function' );
		function my_callback_function(response) {
			alert("Success! PHP returned: " + response);
		}
	</script>
	<a href="javascript:void(webcam.snap())">Take Snapshot</a>
*/

// Everything is under a 'webcam' Namespace
window.webcam = {
	version: '1.0.9',
	
	// globals
	ie: !!navigator.userAgent.match(/MSIE/),
	protocol: location.protocol.match(/https/i) ? 'https' : 'http',
	callback: null, // user callback for completed uploads
	swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd)
	shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound
	api_url: '', // URL to upload script
	loaded: false, // true when webcam movie finishes loading
	quality: 90, // JPEG quality (1 - 100)
	shutter_sound: true, // shutter sound effect on/off
	stealth: false, // stealth mode (do not freeze image upon capture)
	hooks: {
		onLoad: null,
		onComplete: null,
		onError: null
	}, // callback hook functions
	
	set_hook: function(name, callback) {
		// set callback hook
		// supported hooks: onLoad, onComplete, onError
		if (typeof(this.hooks[name]) == 'undefined')
			return alert("Hook type not supported: " + name);
		
		this.hooks[name] = callback;
	},
	
	fire_hook: function(name, value) {
		// fire hook callback, passing optional value to it
		if (this.hooks[name]) {
			if (typeof(this.hooks[name]) == 'function') {
				// callback is function reference, call directly
				this.hooks[name](value);
			}
			else if (typeof(this.hooks[name]) == 'array') {
				// callback is PHP-style object instance method
				this.hooks[name][0][this.hooks[name][1]](value);
			}
			else if (window[this.hooks[name]]) {
				// callback is global function name
				window[ this.hooks[name] ](value);
			}
			return true;
		}
		return false; // no hook defined
	},
	
	set_api_url: function(url) {
		// set location of upload API script
		this.api_url = url;
	},
	
	set_swf_url: function(url) {
		// set location of SWF movie (defaults to webcam.swf in cwd)
		this.swf_url = url;
	},
	
	get_html: function(width, height, server_width, server_height) {
		// Return HTML for embedding webcam capture movie
		// Specify pixel width and height (640x480, 320x240, etc.)
		// Server width and height are optional, and default to movie width/height
		if (!server_width) server_width = width;
		if (!server_height) server_height = height;
		
		var html = '';
		var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) + 
			'&shutter_url=' + escape(this.shutter_url) + 
			'&width=' + width + 
			'&height=' + height + 
			'&server_width=' + server_width + 
			'&server_height=' + server_height;
		
		if (this.ie) {
			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>';
		}
		else {
			html += '<embed id="webcam_movie" src="'+this.swf_url+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="webcam_movie" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
		}
		
		this.loaded = false;
		return html;
	},
	
	get_movie: function() {
		// get reference to movie object/embed in DOM
		if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
		var movie = document.getElementById('webcam_movie');
		if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
		return movie;
	},
	
	set_stealth: function(stealth) {
		// set or disable stealth mode
		this.stealth = stealth;
	},
	
	snap: function(url, callback, stealth) {
		// take snapshot and send to server
		// specify fully-qualified URL to server API script
		// and callback function (string or function object)
		if (callback) this.set_hook('onComplete', callback);
		if (url) this.set_api_url(url);
		if (typeof(stealth) != 'undefined') this.set_stealth( stealth );
		
		this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 );
	},
	
	freeze: function() {
		// freeze webcam image (capture but do not upload)
		this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 );
	},
	
	upload: function(url, callback) {
		// upload image to server after taking snapshot
		// specify fully-qualified URL to server API script
		// and callback function (string or function object)
		if (callback) this.set_hook('onComplete', callback);
		if (url) this.set_api_url(url);
		
		this.get_movie()._upload( this.api_url );
	},
	
	reset: function() {
		// reset movie after taking snapshot
		this.get_movie()._reset();
	},
	
	configure: function(panel) {
		// open flash configuration panel -- specify tab name:
		// "camera", "privacy", "default", "localStorage", "microphone", "settingsManager"
		if (!panel) panel = "camera";
		this.get_movie()._configure(panel);
	},
	
	set_quality: function(new_quality) {
		// set the JPEG quality (1 - 100)
		// default is 90
		this.quality = new_quality;
	},
	
	set_shutter_sound: function(enabled, url) {
		// enable or disable the shutter sound effect
		// defaults to enabled
		this.shutter_sound = enabled;
		this.shutter_url = url ? url : 'shutter.mp3';
	},
	
	flash_notify: function(type, msg) {
		// receive notification from flash about event
		switch (type) {
			case 'flashLoadComplete':
				// movie loaded successfully
				this.loaded = true;
				this.fire_hook('onLoad');
				break;

			case 'error':
				// HTTP POST error most likely
				if (!this.fire_hook('onError', msg)) {
					alert("JPEGCam Flash Error: " + msg);
				}
				break;

			case 'success':
				// upload complete, execute user callback function
				// and pass raw API script results to function
				this.fire_hook('onComplete', msg.toString());
				break;

			default:
				// catch-all, just in case
				alert("jpegcam flash_notify: " + type + ": " + msg);
				break;
		}
	}
};

Web.config

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="BarcodeReader" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>

Web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
  </system.webServer>
</configuration>

Tutorials:

prev
next