Git and Team Services made easy with Visual Studio 2017

Git distributed version control system can be used to manage code in the Visual Studio Team Services repository. Visual Studio 2017 IDE provides easy access to Git and VSTS.

Here are some important information to begin with.

If you come across error 400 when you are cloning, first of all check whether you have spaces in the git repository URL and replace the spaces with %20 as suggested here.

Advertisements

Converting a Visual Studio Setup Project to a Wix Installer Project

I came across this problem on how to convert a visual studio setup project to Wix Installer project. My Visual Studio Setup Project had some registry modifications, so I tried to get the conversion done the easiest possible way. This article at http://geoffwebbercross.blogspot.sg/2012/11/converting-visual-studio-setup-project.html worked like a charm with the help of “Dark”. Make sure you set your pre-processor variables. Thank you Geoff Webber-Cross. You saved my day.

Don’t forget to post a comment if this helped you.

My Notes on Exception Handling

First, I want to thank my good friend Chew Min for introducing the book, “C# 6.0 and the .NET 4.6 Framework” by Andrew Troelsen and Philip Japikse to me. It is a very good book which includes basics of C# and .NET framework every developer should know. I am going to share my notes on the chapter, “Understanding Structured Exception Handling”.

  • There are mainly 3 types of errors which can be included in a program
    • Bugs – errors made by the programmer
    • User Errors – Errors in user inputs
    • Exceptions – Runtime errors
  • Catch all possible exceptions in production level projects
  • You can throw and handle exceptions, when you know about certain possible occurrence of errors. The keywords used for this are try, catch, throw, finally and when (C# 6.0)
  • Exception class implements
    • _Exception – .NET exception to be processed by an unmanaged code base
    • ISerializable – Exception object to be persisted across boundaries
  • Properties in  Exception class
    • Data – IDictionary type, programmer defined info about the exception (key-value pair)
    • HelpLink – Url to a help page or a document
    • InnerException – information about previous exceptions
    • Message – error message
    • Source – gets/sets name of the assembly
    • Stacktrace – sequence of calls triggered exception, this is useful for debugging to dump the error to external log
    • TargetSite – return MethodBase object, describe information about the method that threw the exception (ToString() will give this)
  • Throwing a new exception
    • throw new Exception(“message”);
  • You are not required to handle each and every exception thrown by the program
  • Some ways to deal with an exception
    • Log information to a report or a file
    • write data to the windows event log
    • email a system administrator
    • display problem to an end user
    • dump content to the console window
  • Exceptions from .NET framework or CLR known as System Exceptions
  • Writing a Custom Exception
    • Derives from Exception/ ApplicationException
    • Marked with the [System.Serializable] attribute
    • Defines a default constructor
    • Defines a constructor, sets the inherited Message property
    • Defines a constructor to handle InnerExceptions
    • Defines a constructor to handle the serialization of your type.
  • Catch most specific exceptions first and then catch the generic exceptions
  • Throw in catch to re-throw exceptions(partial handling)
  • Throw exceptions only until the callers who has the ability to handle incoming exceptions gracefully
  • C# 6.0 has when keyword to filter exception logic
    • eg:  catch(Exception ex) when(isItTrue == True) { // do something }

How to add Log4Net to your ASP.Net MVC (C#) project

  1. Add log4net dll to your references using Nuget Package Manager.
  2. Add this line to your AssemblyInfo.cs file
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
  3. Add the following xml code to your Web.config file, inside the configurations tags. The value for version should be the version of your log4net dll.
    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
    </configSections>
  4. Also add the following lines to the Web.config file inside the configuration tags. Here I am logging to a file called “Jumppage.log” inside a folder named “Log”.
    <!-- Log4net Logging Setup -->
    <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
    <file value="Log\Jumppage.log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <levelMax value="FATAL" />
    </filter>
    </appender><root>
    <level value="DEBUG" />
    <appender-ref ref="FileAppender" />
    </root>
    </log4net>
    
  5. Go to your class file and add the namespace, log4net as follows.
    using log4net;
  6. Add following code inside your class. You need to write your class name inside the typeof() method. In this project my class name is “AnnouncementController”.
    private static readonly ILog Logger = LogManager.GetLogger(typeof(AnnouncementController));
  7. Then you can log your error as follows.
    Logger.Error("Error in posting announcements. error message:"+ ex.Message + ", stacktrace:" + ex.StackTrace);

File upload control using ASP.Net MVC (C#)

HTML code
<input id="file-upload-control" name="UploadFile" type="file"/>
<button id="file-upload-button" class="button tiny" style="border: 1px solid #cccccc;">Upload</button>

JQuery code

var selectedFiles;
$('#file-upload-control').on('change', function (e) {
        selectedFiles = e.target.files;
    });

    $('#file-upload-button').on('click', function () {
        var files = selectedFiles;

        if (files.length > 0) {
            if (window.FormData !== undefined) {
                var data = new FormData();
                for (var x = 0; x < files.length; x++) {
                    data.append("file" + x, files[x]);
                }

                $.ajax({
                    type: "POST",
                    url: 'File/UploadFile',
                    contentType: false,
                    processData: false,
                    data: data,
                    success: function (result) {
                        console.log(result);
                        showInfo("File upload was successful! ");
                    },
                    error: function (xhr, status, p3, p4) {
                        var err = "Error " + " " + status + " " + p3 + " " + p4;
                        if (xhr.responseText && xhr.responseText[0] == "{")
                            err = JSON.parse(xhr.responseText).Message;
                        console.log(err);
                        showInfo("Something went wrong uploading file! ");
                    }
                });
            } else {
                alert("This browser doesn't support HTML5 file uploads!");
            }
        }
    });

FileController code

using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Web.Mvc;
namespace DHI.Controllers
{
public class FileController : Controller
{
[HttpPost]
public async Task UploadFile()
{
try
{
foreach (string file in Request.Files)
{
var fileContent = Request.Files[file];
if (fileContent != null && fileContent.ContentLength > 0)
{
// get a stream
var stream = fileContent.InputStream;
// and optionally write the file to disk
var fileName = fileContent.FileName;
var path = Path.Combine(Server.MapPath("~/App_Data/Images"), fileName);
using (var fileStream = System.IO.File.Create(path))
{
stream.CopyTo(fileStream);
}
}
}
}
catch (Exception)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json("Upload failed");
}

return Json("File uploaded successfully");
}
}
}