In short: methods in default Console Application
project works fine, but in the another project(asp.net WebAPI
) the same methods doesn't works. I've a two mongoDB collections, that presented below. Sample document of subjects collection(JSON
):
{
"_id" : ObjectId("5b9a2637635d16b2a2c5c562"),
"userId" : ObjectId("5b9a23d1a54d26b98f6acf34"),
"name" : "someName",
"notes" : [
{
"date" : ISODate("2012-11-20T05:05:15.229Z"),
"title" : "someTitle",
"body" : "Note body - long teeeeeeext",
"files" : [ ]
}
]
}
Sample document of users collection:
{
"_id" : ObjectId("5b9a23d1a54d26b98f6acf34"),
"loginName" : "someName",
"pass" : "hashedpassword"
}
I wrote a few classes (POCO Representation
):
public class Subject
{
[BsonElement("_id")]
public ObjectId Id { get; set; }
[BsonElement("name")]
public string Name { get; set; }
[BsonElement("notes")]
public List<Notes> Notes { get; set; }
[BsonElement("userId")]
public ObjectId UserId { get; set; }
}
public class Notes
{
[BsonElement("date")]
[BsonRepresentation(BsonType.DateTime)]
public DateTime Date { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("body")]
public string Body { get; set; }
[BsonElement("files")]
public List<ObjectId> Files { get; set; }
}
public class User
{
[BsonElement("_id")]
public ObjectId Id { get; set; }
[BsonElement("loginName")]
public string LoginName { get; set; }
[BsonElement("pass")]
public string HashedPass { get; set; }
}
And classes for DB manipulation:
public class MongoDataModel
{
/// <summary>
/// Singleton
/// </summary>
public static MongoDataModel Instance { get; set; }
public IMongoClient MongoClient { get; set; }
public IMongoDatabase CurrentMongoDB { get; set; }
public string CurrentDB { get; set; }
public async Task<List<User>> GetUsers(IMongoDatabase db)
{
List<User> users = await db.GetCollection<User>(MongoSettings.Instanse.UsersCollection)
.Find(new BsonDocument())
.ToListAsync();
return users;
}
public async Task<List<Subject>> GetSubjects(IMongoDatabase db)
{
List<Subject> subjects = await db.GetCollection<Subject>(MongoSettings.Instanse.SubjectCollection)
.Find(new BsonDocument())
.ToListAsync();
return subjects;
}
public MongoDataModel()
{
CurrentDB = "reminder1";
MongoClient = new MongoClient(MongoSettings.Instanse.ClientSettings);
CurrentMongoDB = MongoClient.GetDatabase(CurrentDB);
}
static MongoDataModel()
{
Instance = new MongoDataModel();
}
}
public class MongoSettings
{
public MongoClientSettings ClientSettings { get; set; }
/// <summary>
/// Singleton
/// </summary>
public static MongoSettings Instanse { get; set; }
public string UsersCollection { get; set; }
public string SubjectCollection { get; set; }
private string Host { get; set; }
private int Port { get; set; }
static MongoSettings()
{
Instanse = new MongoSettings()
{
Host = "localhost",
Port = 27017,
UsersCollection = "users",
SubjectCollection = "subjects",
};
Instanse.ClientSettings = new MongoClientSettings
{
Server = new MongoServerAddress(Instanse.Host, Instanse.Port)
};
}
}
Console app code, works ok:
class Program
{
static void Main(string[] args)
{
MongoDataModel.Instance
.GetUsers(MongoDataModel.Instance.CurrentMongoDB)
.GetAwaiter()
.GetResult().ForEach(usr => {
Console.WriteLine("Test user values\nUser id: {0}\nlogin:{1}\nHashed pass:{2}\n",
usr.Id, usr.LoginName, usr.HashedPass);
});
MongoDataModel.Instance
.GetSubjects(MongoDataModel.Instance.CurrentMongoDB)
.GetAwaiter()
.GetResult()
.ForEach(subj => {
Console.WriteLine("Test subject values\nid:{0}\nName:{1}\nNumber of notes:{2}\nNotes:",
subj.Id, subj.Name, subj.Notes.Count);
subj.Notes.ForEach(note => {
Console.WriteLine(" Note Title:{0}\n Note Body:{1}\n NoteDate:{2}",
note.Title, note.Body, note.Date.ToString());
});
});
Console.ReadLine();
}
}
Console output (code above works ok):
Test user values
User id: 5b9a23d1a54d26b98f6acf34
login:someName
Hashed pass:hashedpassword
Test subject values
id:5b9a2637635d16b2a2c5c562
Name:someName
Number of notes:1
Notes:
Note Title:someTitle
Note Body:Note body - long teeeeeeext
NoteDate:11/20/2012 5:05:15 AM
I set JSON formatter as default formatter. ASP.NET WebAPI code:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<User> Get()
{
List<User> users = MongoDataModel.Instance
.GetUsers(MongoDataModel.Instance.CurrentMongoDB)
.GetAwaiter()
.GetResult();
TestMethod();
return users;
}
private void TestMethod() { }
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html"));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
In the Chrome(IIS) doesn't get that values, because method doesn't return the value. First breakpoint works, therefore method executes, but second breakpoint executes never:Chrome debug window Breakpoints
I have no idea what's going on. I'm so confused by that strange code behavior. What's wrong with my code? Please help. Thank you in advance!