0

I have some kind of Mvc application in which I register routes with a pattern to a route handler, which gives out our custom httphandler to handle requests with such routes. I could get such requests executed when I run my application on IIS Express. I couldn't do the same when I try and host it on IIS. Could I be missing a handler mapping? If so, how can I map a handler to a route pattern?

public class SwaggerAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Swagger"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        ....
        ....

        context.Routes.Add(new Route(
            "swagger",
            null,
            new RouteValueDictionary(new {constraint = new RouteDirectionConstraint(RouteDirection.IncomingRequest)}),
            new RedirectRouteHandler("swagger/ui/index.html")));

        context.Routes.Add(new Route(
            "swagger/ui/{*path}",
            null,
            new RouteValueDictionary(new {constraint = new RouteDirectionConstraint(RouteDirection.IncomingRequest)}),
            new SwaggerUiRouteHandler()));
    }
}


public class SwaggerUiRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var swaggerUiConfig = SwaggerUiConfig.Instance;

        var routePath = requestContext.RouteData.Values["path"].ToString();
        var resourceAssembly = GetType().Assembly;
        var resourceName = routePath;

        InjectedResourceDescriptor injectedResourceDescriptor;
        if (RequestIsForInjectedResource(routePath, swaggerUiConfig, out injectedResourceDescriptor))
        {
            resourceAssembly = injectedResourceDescriptor.ResourceAssembly;
            resourceName = injectedResourceDescriptor.ResourceName;
        }

        if (resourceName == "index.html")
        {
            var response = requestContext.HttpContext.Response;
            response.Filter = new SwaggerUiConfigFilter(response.Filter, swaggerUiConfig);
        }

        return new EmbeddedResourceHttpHandler(resourceAssembly, r => resourceName);
    }

    private bool RequestIsForInjectedResource(string routePath, SwaggerUiConfig swaggerUiConfig, out InjectedResourceDescriptor injectedResourceDescriptor)
    {
        injectedResourceDescriptor = swaggerUiConfig.CustomScripts
            .Union(swaggerUiConfig.CustomStylesheets)
            .FirstOrDefault(desc => desc.RelativePath == routePath);

        return injectedResourceDescriptor != null;
    }
}
tereško
  • 58,060
  • 25
  • 98
  • 150
Ren
  • 437
  • 4
  • 17

1 Answers1

0

Turns out, the app pool was running in Classic Pipeline mode and I just had to change it to Integrated.

The difference between the two modes is well explained here: What is the difference between 'classic' and 'integrated' pipeline mode in IIS7?

Community
  • 1
  • 1
Ren
  • 437
  • 4
  • 17