This is the sequel to this post
We will be using MongoLab as a backend for our Web Api.
We are using the AddressBook again in this example, but for clarity we're building it from scratch.
Creating the MongoLab database
Head over to MongoLab and create an account!
- First create a new database. Make sure you choose the free plan. Name the database 'addressbook'.
- Click to create a new user.
- Add a new collection (equivalent for a table) named persons.
Please take note of the connectionstring:
Setting up the Web Api project in Visual Studio
Fire up Visual Studio 2013 and hit File -> New -> Project.
Choose Empty ASP.NET Web Application with a Web API and name the project AddressBook.
We must install the Mongo Csharp Driver:
Install-Package MongoCsharpDriver
Now open App_Start\WebApiConfig.cs and add json formatting to it (see my previous post why):
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace AddressBook { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); //This section you need to add: var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter); } } }
Connecting to the MongoLab
Let's not reinvent the wheel if you don't have to. This article is a great introduction to Mongo and C#. I borrowed their MongoConnectionHandler.
using MongoDB.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AddressBook { public class MongoConnectionHandler{ public MongoCollection MongoCollection { get; private set; } public MongoConnectionHandler() { const string connectionString = "mongodb:// : @ds031108.mongolab.com:31108/addressbook"; //const string connectionString = "mongodb://localhost:27017"; //// Get a thread-safe client object by using a connection string var mongoClient = new MongoClient(connectionString); //// Get a reference to a server object from the Mongo client object var mongoServer = mongoClient.GetServer(); //// Get a reference to the database object //// from the Mongo server object const string databaseName = "persons"; var db = mongoServer.GetDatabase(databaseName); //// Get a reference to the collection object from the Mongo database object //// The collection name is the type converted to lowercase + "s" MongoCollection = db.GetCollection (typeof(T).Name.ToLower() + "s"); } } }
The Person class
I want the Person_Id to be the same as the document id, so I can retrieve documents easily. I'm not sure though if this is best practice. But it works.
public class Person { public Person() { Person_Id = ObjectId.GenerateNewId().ToString(); } [BsonId] public string Person_Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Phone { get; set; } public string Email { get; set; } public string Blog { get; set; } public string Facebook { get; set; } public string Twitter { get; set; } public string LinkedIn { get; set; } public string Googleplus { get; set; } }
And here's the POST method:
public class PersonController : ApiController { public MongoConnectionHandlercollection = new MongoConnectionHandler (); public HttpResponseMessage Post([FromBody] Person person) { collection.MongoCollection.Insert(person); var response = Request.CreateResponse (HttpStatusCode.Created, person); string uri = Url.Link("DefaultApi", new { id = person.Person_Id }); response.Headers.Location = new Uri(uri); return response; } }
You can use the API with Fiddler.
Look at the results it has returned:
It returned the new URI with the new Id as you can see.
Now let's check MongoLab, and lo and behold:
Here's the remainder of the CRUD methods:
public IEnumerable Get() { return collection.MongoCollection.FindAll().AsEnumerable(); } public Person Get(string id) { //var query = Query.EQ(p => p.Person_Id, id); return collection.MongoCollection.FindOne(Query.EQ("_id", id)); } public void Delete(string id) { collection.MongoCollection.Remove(Query.EQ("_id", id)); } public HttpResponseMessage Put([FromBody] Person person) { var p = collection.MongoCollection.FindOne(Query.EQ("_id", person.Person_Id)); if (p != null) { collection.MongoCollection.Save(person); } return Request.CreateResponse (HttpStatusCode.OK, person); }
So, that works.
Next time, let's consume this WebApi with Angularjs.
And here's all the code: here
I have changed 'Person' to 'Contact' in the sourcecode
I adapted this application to my collection in MongoLab, I get an error in Windows 7, saying that I need to install Directory Browsing, when I follow the instructions from Microsoft , I get another error saying that there is something wrong with the command.
I ran it in Windows 8.1, I get a different error about the extension of the file not being authorized, it does download the connection, but you get all these errors.
Hey! Sorry for this late reply. Did you find a solution for this? Did you active the right asp.net framework version for IIS?
I have not found a solution , I have done all the updates , as far as I know.