ASP.NET Syntax and conventions - c#

I am reading Designing Evolvable Web APIs with ASP.NET. In one of the exercises, the book has me edit a Controller using Visual Studio. This is being done in ASP.NET using C#. The template I used was the standard ASP.NET web application API.
I have edited the controller to the way the book shows (although it does not seem to give very specific directions). Here is what my controller looks like.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OAuth;
using WebApplication4.Models;
using WebApplication4.Providers;
using WebApplication4.Results;
namespace WebApplication4.Controllers
{
public class GreetingController : ApiController
{
public string GetGreeting() {
return "Hello World!";
}
}
public static List<Greeting> _greetings = new List<Greeting>();
public HttpResponseMessage PostGreeting(Greeting greeting)
{
_greetings.Add(greeting);
var greetingLocation = new Uri(this.Request.RequestUri, "greeting/" + greeting.Name);
var response = this.Request.CreateResponse(HttpStatusCodeResult.Created);
response.Headers.Location = greetingLocation;
return response;
}
}
I get errors on:
_greetings: A namespace cannot directly contain members such as fields or methods
PostGreeting: A namespace cannot directly contain members such as fields or methods,
_greetings : does not exist in the current context
Request : <invalid-global-code> does not contain a definition for 'request',
Created: HttpStatusCodeREsult does not contain a definition for 'Created'

As the error is trying to tell you, your fields and methods must be inside the class.
Check your braces.

Your _greetings field needs to be part of the class, as well as the PostGreeting method, it seems you just closed "}" of the class a bit early.
MOve the "}" before the _greetings field to the end of the file, like:
namespace WebApplication4.Controllers
{
public class GreetingController : ApiController
{
public string GetGreeting() {
return "Hello World!";
}
public static List<Greeting> _greetings = new List<Greeting>();
public HttpResponseMessage PostGreeting(Greeting greeting)
{
_greetings.Add(greeting);
var greetingLocation = new Uri(this.Request.RequestUri, "greeting/" + greeting.Name);
var response = this.Request.CreateResponse(HttpStatusCodeResult.Created);
response.Headers.Location = greetingLocation;
return response;
}
}
}

Related

How can I connect to a broker using MQTT in MVC framework?

I'm trying to set up an MQTT connection to a test broker: "test.mosquitto.org" in C# using MVC(this one is just for practise). Eventually I want to make a web application that collects and shows data from databases on different locations. There seem to be no tutorials for MVC framework so I'm following this example: https://gist.github.com/cwschroeder/7b5117dca561c01def041e7d4c6d2771.
The hard part for me is converting that example to MVC framework(with the controllers, models, etc.)
So I have a few questions about this:
Is there a better/easier option for this than MVC?
What framework is used in the sample?
What would be my first steps to set up a connecting to a broker in MVC?(also wondering if it would be possible to see an example in code)
I already added some properties and a start + installed the M2mqtt library.
No idea where to go from here. I wish I could just copy paste the sample but that is obviously not possible with MVC.
MqttClientController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Session;
using MvcTestMqtt.Models;
namespace MvcTestMqtt.Controllers
{
public class MqttClientController : Controller
{
// GET: MqttClient
public ActionResult Index()
{
return View();
}
public ActionResult ConnectClient()
{
var mqtt = new MqttModel();
new MqttClient(mqtt.BrokerAddress);
new MqttClient(mqtt.clientID);
return View();
}
}
}
MqttModel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using MvcTestMqtt.Controllers;
namespace MvcTestMqtt.Models
{
public class MqttModel
{
MqttClient client { get; set; }
public string clientID { get; set; }
public string BrokerAddress = "test.mosquitto.org";
}
}

Get JSON data out of Umbraco

I am a frontend developer so forgive my lack of ability to explain my issue.
I am trying to create some pages in an Umbraco project that display data using Vue.js. For this, I am trying to set up a custom API controller that will return the data I want, when called.
A simple example would be that I want to return all blog articles. Below is the code I have currently got:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Web;
using System.Web.Http;
using Umbraco.Web.WebApi;
using Umbraco.Web.PublishedContentModels;
using Newtonsoft.Json;
namespace Controllers.WebAPI.Qwerty
{
[Route("api/[controller]")]
public class PostsApiController : UmbracoApiController
{
[HttpGet]
public string Test()
{
return "qwerty";
}
}
}
I've read numerous articles and just can't seem to grasp what I need to do to query Umbraco for the data I want back?
I've tried adding
var content = Umbraco.TypedContent(1122);
And then returning that but I get errors stating:
(local variable) Umbraco.Core.Models.IPublishedContent content
Cannot implicitly convert type 'Umbraco.Core.Models.IPublishedContent' to 'string'
I have then tried serialising the var content but I get stuck with:
Self referencing loop detected for property 'FooterCtalink' with type
'Umbraco.Web.PublishedContentModels.Blog'. Path
'ContentSet[0].FeaturedProducts[0].Features[0].ContentSet[0]'.
Any help would be fantastic!
EDIT:
I have no edited the controller to be like this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Web;
using Umbraco.Web.WebApi;
using Umbraco.Web.PublishedContentModels;
using Newtonsoft.Json;
using System.Web.Mvc;
using DTOs.PostDTO;
namespace Controllers.WebAPI.Qwerty
{
[Route("api/[controller]")]
public class PostsApiController : UmbracoApiController
{
[HttpGet]
public PostDTO Test()
{
// 1. Get content from umbraco
var content = Umbraco.TypedContent(1122);
// 2. Create instance of your own DTO
var myDTO = new PostDTO();
// 3. Pupulate your DTO
myDTO.Url = content.Url;
// 4. return it
return myDTO;
}
}
}
And created a DTO like so:
namespace DTOs.PostDTO
{
public class PostDTO
{
public string Url { get; set; }
}
}
However, when console logging my data after the ajax request, I only only getting 1122.
The issue is that you can't return a .NET Object in JSON that has the circular dependency.
To solve your problem, you can simply follow the below steps:
Create your own DTO & add required properties in that.
Fetch content from Umbraco API in C# & populate your custom DTO object.
Return that DTO from JsonResult.
Your code will look like below:
[Route("api/[controller]")]
public class PostsApiController : UmbracoApiController
{
[HttpGet]
public MyDTO Test()
{
// 1. Get content from umbraco
var content = Umbraco.TypedContent(1122);
// 2. Create instance of your own DTO
var myDTO = new MyDTO();
// 3. Pupulate your DTO
myDTO.SomeProperty = content.SomeProperty;
// 4. return it
return myDTO;
}
}
You are on the right track.
I think you need to return ActionResult instead of string.
Something like:
[HttpGet]
public ActionResult Test()
{
var content = Umbraco.TypedContent(1122);
return new JsonResult(content);
}
This should return the umbraco object as Json.

Get Logged in username using a function

I have a class with the following function
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Http;
namespace Performance_Dashboard.Controllers
{
public class GetLoggedInData
{
public string ActualUser { get; internal set; }
public string GetLoggedInDataofUser()
{
ActualUser= HttpContext.Current.User.Identity.Name;
return ActualUser;
}
}
}
I would like to access or see what is being returned, how do I do that?
You said
[I set a breakpoint] ... but my program does not go to that function that means that I have to call it right?
The answer is yes. In order to hit the breakpoint you must call the method:
GetLoggedInData glid = new GetLoggedInData();
glid.GetLoggedInDataofUser();//Call the method. Now the breakpoint will be hit
An additional method you can use other than setting a break point is using the System.Diagnostics library to print to the output window.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Diagnostics;
namespace Performance_Dashboard.Controllers
{
public class GetLoggedInData
{
public string ActualUser { get; internal set; }
public string GetLoggedInDataofUser()
{
ActualUser= HttpContext.Current.User.Identity.Name;
Debug.Write(ActualUser);
return ActualUser;
}
}
}

System.Web.Http assembly not allways visible in same c# project

I have a C# project where in my controller class the System.Web.Http library can be referenced but in the another class it cannot. The reference has been added to the overall project and both classes have all the necessary using directives.
The Request method of System.Web.Http cannot be resolved in some instances?
Here are code snippets of the two classes:
Controllers/FormsController.cs
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using FormsImport.Models;
namespace FormsImport.Controllers
{
public class TCSTasksController : ApiController
{
[Route("api/TCSUploadFile")]
[AllowAnonymous]
public async Task<HttpResponseMessage> UploadCSVFile()
{
try
{
var httpRequest = HttpContext.Current.Request;
foreach (string file in httpRequest.Files)
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created); // <-- the name Request does exists
.
.
.
}
CSVmanager.cs
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http; //<-- Compiler claims this directive is unneccesary
using System.Web.Http.Description;
using FormsImport.Models;
namespace FormsImport
{
public class CSVmgr
{
public async Task<HttpResponseMessage> UploadCSVFile()
{
try
{
var httpRequest = HttpContext.Current.Request;
foreach (string file in httpRequest.Files)
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created); // <-- the name Request Does not exist in the current context
.
.
.
}
I think you should agree with your compiler/IDE (Visual Studio?) in this case - it's simply pointing out that the referenced assembly is not in use in this class.
Should you decide to use any functionality from this assembly, the warning in question will go away.
EDIT based on comment: If the functionality you need is part of a protected interface of another class, such as ApiController, you MUST extend that class to access such functionality in your own class. If such extension subsequently uses methods in the assembly you referenced (and for which the compiler shows an unnecessary using directive), the compiler warning regarding the using directive will likewise resolve.
in your api controller, Request is a HttpRequestMessage type, and the CreateResponse is the extension method of HttpRequestMessage. why not create a HttpResponseMessage new instance in your CSVmgr class. like:
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.Created;
codran 17 explained it the best.
My new class is not derived from the APIController Class and the Request method of that class is not a static function that I can call like System.IO.Path() for instance. So I must use another static function from a class that returns the same results or pass a reference to the APIController to my new class.
Like so:
public async Task<HttpResponseMessage> UploadCSVFile(ApiController controller)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
try
{
var httpRequest = HttpContext.Current.Request;
foreach (string file in httpRequest.Files)
{
HttpResponseMessage response = controller.Request.CreateResponse(HttpStatusCode.Created);

Json type is not found within asp.net web api application

I have this controller in my asp.net web api application :
using AutoMapper;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.Web.WebPages.Html;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Net.Mail;
namespace AjTransport.webApi.Controllers
{
public class AccountManageController : ApiController
{
[AllowAnonymous]
public System.Web.Mvc.JsonResult FindUser(string str)
{
var result = UserManager.FindByName(str) ?? UserManager.FindByEmail(str);
return Json(result == null, System.Web.Mvc.JsonRequestBehavior.AllowGet);
}
}
}
The problem is here
return Json(result == null, System.Web.Mvc.JsonRequestBehavior.AllowGet);
the type Json is not found. So I need to know how can I fix this?
Change this
return Json(result == null, System.Web.Mvc.JsonRequestBehavior.AllowGet);
to
return Json(result == null);
Also do not return a System.Web.Mvc.JsonResult, change that to.
public System.Web.Http.Results.JsonResult<bool> FindUser(string str)
This System.Web.Mvc.JsonRequestBehavior.AllowGet is only valid for MVC and not WebAPI (hint, see the name space of the type you are using).
For more info on ApiController.Json method see the link.

Categories

Resources