Jason
Jason

Reputation: 3689

Hangfire dashboard returns 404

When trying to access the hangfire dashboard on my local IIS at domain/hangfire/ I get a 404 response. This is in a webforms project targeting .Net 4.5.1, Hangfire is version 1.5.3. My startup and authorisationoverride classes are as follows:

[assembly: OwinStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration.UseSqlServerStorage("MyConnString");

            DashboardOptions opts = new DashboardOptions
            {
                AuthorizationFilters = new[] { new AuthorisationOverride() }
            };

            app.UseHangfireServer();
            app.UseHangfireDashboard("/hangfire", opts);
        }
    }
}

public class AuthorisationOverride : Hangfire.Dashboard.IAuthorizationFilter
{
    public bool Authorize(IDictionary<string, object> owinEnvironment)
    {
        return true;
    }
}

Jobs are running successfully, but I've run out of ideas for getting the Dashboard to work.

Upvotes: 8

Views: 11601

Answers (6)

Mindaugas Varkalys
Mindaugas Varkalys

Reputation: 151

The problem for me was missing ASP.NET installation on the server

Upvotes: 0

Ray T
Ray T

Reputation: 193

I had something similar but I managed to get it resolved by reading through this post.

Hope you will have a better luck following through that if you haven't yet. The main problem for me was the missing DLL, and then the removing site data from the TemporaryASP.NET folder.

Edit: Someone down voted this answer because I used a link for the solution.

Since I did find a solution to this specific problem, I thought I will give it another try to share. :)

Here are the steps that I have taken to come to a solution.

  1. Confirm you have the Microsoft.Owin.Host.SystemWeb.dll in your bin directory of this project. (In my case, the dll was missing)
  2. Stop your app pool
  3. Navigate to your TemporaryASP.NET folder : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files and delete the folder inside of your site/application's folder.
  4. Restart you app pool
  5. Navigate to "/admin" or whatever you set your dashboard url to be "/hangfire" by default.

Upvotes: 14

naps73r
naps73r

Reputation: 21

Since there is no solution so far, I would like to share something that I rectified to get this issue resolved.

If you're facing this issue only in production then, your web.config file is not properly configured.

Firstly, assuming you have already created the Startup class, add the following to the web.config under :

<add key="owin:AutomaticAppStartup" value="true" />

Next, make sure that you have referenced the OWIN assemblies as the below following:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

Although, when you install OWIN via nuget, the setup will automatically update the web.config for you, but just in case it doesn't, you can always add this. Further make sure this above OWIN version matches with the one yo have installed via nuget.

Hope this helps somebody!

Edit: Answering the OP's original question, Hangfire returns 404 error when it is not started. Apart from adding the Startup OWIN class, we need to mention automaticstartup=true in the web config also. The next issue IIS will look for is reference to Hangfire, where is we kick in the assembly details.

Upvotes: 2

marco.broccio
marco.broccio

Reputation: 63

Add this line in your web.config file:

<system.webServer>
    <handlers>
    <add name="hangfireDashboard" path="hangfire" type="System.Web.DefaultHttpHandler" verb="*" />
    </handlers>
</system.webServer>

Upvotes: 3

Alex Dresko
Alex Dresko

Reputation: 5203

Struggled with this for a few hours today and just fixed it in my project.

Try moving your Hangfire configuration code higher up in your Startup class's Configuration method.

I had my Hangfire configuration code at the very bottom of Startup.Configuration and just happened to discover that the dashboard works again when I move it before some of the other OWIN stuff I was configuring.

Specifically, I moved it above the following code in my project:

app.UseCors(CorsOptions.AllowAll);

app.MapSignalR();

AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

// my AutoMapper configuration

// some async/await code that was calling .Wait() here. 

I didn't take time to figure out exactly which line of code was breaking the Hangfire dashboard, but I hope that helps someone.

Also for the record, the old code was working under IIS Express at https://localhost:44342/hangfire. I was getting the 404 in full IIS at https://localhost/appname/hangfire.

Upvotes: 9

Sudipto Sarkar
Sudipto Sarkar

Reputation: 356

application Startup

 [assembly: OwinStartupAttribute(typeof(yournamespace.Startup))]
    namespace yournamespace    
    public partial class Startup
            {
                public void Configuration(IAppBuilder app)
                {

                    var storage = new SqlServerStorage("connectionstring");

                    ......
                    ......
                    app.UseHangfireDashboard("/Scheduler", new DashboardOptions() { AuthorizationFilters = new[] { new HangFireAuthorizationFilter() } }, storage);
                }

Authorization Filter

public class HangFireAuthorizationFilter:IAuthorizationFilter
    {
        public bool Authorize(IDictionary<string, object> owinEnvironment)
        {
            // In case you need an OWIN context, use the next line.
            // `OwinContext` class is defined in the `Microsoft.Owin` package.
            var context = new OwinContext(owinEnvironment);

            return context.Authentication.User.Identity.IsAuthenticated &&
                   context.Authentication.User.IsInRole("xyz");

        }

    }

You Can Ignore the HangFireAuthorizationFilter if you want to.

Upvotes: 1

Related Questions