Creating HTTP Handler - asp.net-mvc-3

can anyone tell me how to create Custom Hander (.ashx) file.
Requirement: When a request come to my application for a .pdf, I want to invoke that .ashx handler. The .ashx handler will have logic to show the file or not.
My incoming path would be "http://www.domainname.com/Content/PDF/ABC.pdf".
This URL should be handled by a "http://www.domainname.com/Handler.ashx" file.
I would like to know how to create, map, and register the handler in my application
Thanks in advance.

Why you need an HTTPHandler if you are working with ASP.NET MVC, Use an Action method to server your file content. You can do most of the things you do with an HttpHandler in an Action method. You can do the routing of the action as you wish like http://domainname.com/content/abc can return the abc.pdf file
You should not directly let the browser to access the resource (PDF). Instead you give access via an action method. Read the file Id /name in the action method from the request and read the file and output it. Assuming that you have an action method like below in your ResourceController
public ActionResult GetFile(string id)
{
string fullFilePath=somefullpathvariable+"//"+id+".pdf";
return File(fullFilePath, "application/pdf", Server.UrlEncode(id+".pdf"));
}
Now users can access this like
http://www.yourdomain.com/Resource/awesomemvc
Now this can return a file called awesomemvc.pdf from a location which is stored in your server and your someFullPathVariable holds the path to that location

Related

Dynamic Web API Controllers and WithConventionalVerbs()

I'm using Dynamic Web API Controllers but my Get methods are being created as POST.
evidence
I've already set ".WithConventionalVerbs()" but no success
Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(AssisteVidaApplicationModule).Assembly, "app")
.WithConventionalVerbs()
.Build();
My Put and Delete methods are okay.
What's wrong?
The only thing you could miss; there could be [HttpPost] attribute on PedidoAppService.Get() and PedidoAppService.GetAll() methods. Can you check if there's any HttpPost attribute on these methods? And to understand the problem you can rename the Get method to GetSomething() ... if http verb gets correct we can have more info about the problem.

spring redirecting a external url and status

I am using Spring MVC, I need to launch an application by giving the url for authentication, if it is success then set the attribute as success otherwise failure.
I have tried with this
#RequestMapping(value="/authenticate", method = RequestMethod.GET)
public String dataMappings(Model model) throws Exception {
model.addAttribute("status","status Don't Know here");
return "redirect:"+"http://localhost:8292/auth";
}
Here this launches my another http://localhost:8292/auth, but the problem is I need to know authentication success or failure and set the status in set attribute and display in UI.
How do I handle this?
IMO you shouldn't be handling the redirect in your controller. Instead of returning Stringconsider returning ModelAndView. Configure a view resolver and create appropriate views viz. success and failure. Then in the view you should do the redirect. The attributte you want to set should / can be done at controller and will be part of Model

Parameter format issue with ASP.NET Web API controller

I am watching this pluralsight demo video on Web Api, and he is using fiddler to pass in a parameter using Http Get with the syntax of controller/parameter
So he's using http://localhost:2405/api/values/5
5 Is the parameter he's passing in.
In my code, I have everything set up exactly the same way he does... with a routing template of {controller}/{id} and a controller method with a signature of
public string Get(string zipcode)
I can pass a parameter just fine with http://localhost:2405/api/values?zipcode=25252 but if I try passing in a paramter the way he does, like http://localhost:2405/api/values/25252 I get an error saying I do not have an action available to handle that request on the controller.
What is he doing right, that I'm doing wrong?
You need to change your routing template to {controller}/{zipcode} as the name of the parameter must match the name in the template.

Web API get route values

Is there any way to statically get route values from a service method (outside of a controller) that is running in a Web API context? For example, I can do the following in ASP.NET MVC:
var mvcHandler = HttpContext.Current.Handler as MvcHandler;
var routeValues = mvcHandler.RequestContext.RouteData.Values;
I'd like to find the equivalent version of this code for Web API.
When I try to debug a sample Web API request and look at HttpContext.Current.Handler it is of type HttpControllerHandler, but this type doesn't have any properties to access route data.
EDIT
To try to help provide some more information. The code I am trying to read the value from is inside of a factory class I have that builds a custom object for my application.
You can use GetRouteData() extension on HttpRequestMessage. You would need to include System.Net.Http namespace to get this.
System.Web.Http.Routing.IHttpRouteData routeData = Request.GetRouteData();
I was able to find a solution that would get the route values for either an MVC request or a Web API request.
HttpContext.Current.Request.RequestContext.RouteData

StructureMap controller factory and null controller instance in MVC

I'm still trying to figure things out with StructureMap and one of the issues i'm running into is my Controller Factory class blowing up when a null controller type is passed to it. This only happens when the application builds for the first time, after which every subsequent build works fine. Even when i shutdown Visual Studio and reopen the project (I'm not running this in IIS). It's almost like there is some sort of caching going on. This is what the controller class looks like:
public class IocControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
try
{
return (Controller)ObjectFactory.GetInstance(controllerType);
}
catch (StructureMapException)
{
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
}
}
What could be wrong? Do i need to have every controller registered? Thank you.
Most browser are looking for a favicon.ico when you load a site, and there is probably some caching involved with this behavior, this might explain the odd "Only fail on the first build" thing you mentionned.
In my case this was causing the problem of the null controller type in the controller factory.
Adding a routes.IgnoreRoute("{*favicon}", new { favicon = #"(.*/)?favicon.ico(/.*)?" }); in global.asax makes the error go away, the request should fall through to the filesystem without MVC looking for a favico.ico controller in your code.
Here is a link to Gunnar Peipman post about this
I found out by overriding GetControllerType(string controllerName) in my custom controller factory class and checking what the controllerName value was for each request.
I ran into the same problem with a controller factory built around ninject.
It seems MVC will pass you null for controllertype when it can't resolve a route from the routing table or when a route specifies a none existing controller. I did two things to solve this. You might want to check your route table and add a catchall route that shows a 404 error page like described here .Net MVC Routing Catchall not working
You could also check with the routing debugger what goes wrong.
http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
I was having the similar problem. I believe it was HTTP requests for nonexistent images, CSS files, etc.
We know the MVC routing first looks to see if the requested file physically exists. If it doesn't then the URL gets tested against the configured Routes. I think the request for an image that didn't physically exist was passed to the Routing engine, and didn't match any routes, so NULL was used.
So to fix it, use FireBug or something to watch for, and fix, broken HTTP requests. During development, I used a route like this to temporarily bypass these issues (all of my resource folders start with an underscore like _Images, _Styles, etc):
routes.IgnoreRoute("_*"); // TODO: Remove before launch
Hope this helps!
What I think you need to do is exactly the same thing that the default MVC controller factory does on the GetControllerInstance method. If you look at the Microsoft source code for DefaultControllerFactory at http://aspnetwebstack.codeplex.com/ you will see that the DefaultControllerFactory throws a 404 Exception when controllerType is null. Here is how we do it based on this information:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return base.GetControllerInstance(requestContext, controllerType);
var controller = ObjectFactory.GetInstance(controllerType);
return (IController)controller;
}
}
Basically this will ensure that, when user enters an invalid route the application handles it as a 404 error.

Resources