简体   繁体   中英

.NET Web api 2 stops working after sometime in IIS

I have two web API project DLLs in one solution.

Structure of my Project Solution:

In my solution, the projects are located as follows:

1) Base Solution

2) Base Web API

3) Module Web API

Hence, my solution is something like a BASE solution which contains many MODULES. Each Modules can contain its own Web APIs. Also, my Base Solution contains its own Web API

This is our structure.

My Problem:

It is working fine in my local run solution. When I host it to the IIS, it is working for few hours and then it stops working by throwing the error message "Error 404 found". When I try to access through URL directly which is something like " http://127.0.0.1:51/Products/Get ", not working.

Visual Studio version:

Visual Studio Professional - 2015

IIS Version:

IIS - 7.5.7600

My approach: I have a simple project which simulates this scenario. It has the same problem with my original project.

Web API For Base Module:

WepApiConfig under App_Start:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Base API Controller:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
}

WebApiConfig.cs For Module Web API:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        //config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultModuleApi",
            routeTemplate: "api/module/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Module API Controller:

public class ModulesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }
}

NOTE from the above code:

The difference between the two APIConfig files is :

For Module Code:

routeTemplate: "api/module/{controller}/{action}/{id}"

For Base Code:

routeTemplate: "api/{controller}/{action}/{id}"

Global.asax:

namespace BaseSln
{
public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //GlobalConfiguration.Configure(WebApiConfig.Register);

        var typesWithMyAttribute =
            from a in AppDomain.CurrentDomain.GetAssemblies()
            from t in a.GetLoadableTypes().Where(t1 => t1.Name == "WebApiConfig"
                            && t1.GetMethod("Register") != null
                            && t1.GetMethod("Register").IsStatic)
            select new { Type = t, MethodInfo = t.GetMethod("Register") };

        //register all the Routes
        foreach (var type in typesWithMyAttribute)
        {
            var mi = type.MethodInfo;
            Action<HttpConfiguration> action = null;
            try
            {
                action = Delegate.CreateDelegate(typeof(Action<HttpConfiguration>), mi) as Action<HttpConfiguration>;
            }
            catch
            {
                //ignore the errors for now... should be handled somewhere else or logged.
            }

            if (action != null) GlobalConfiguration.Configure(action);
        }
    }
}

}

What I tried with the above project:

After hosting in IIS, I tried to access the path which is something like this:

For Base API:

http://localhost:51600/api/Values/Get

Returns:

value1
value2

For Module API

http://localhost:51600/api/Modules/Get

Returns:

value1
value2

My problem:

After sometime, when I try to access the same link, I am unable to get that. It says

status 404. Not Found

I have been working on this issue for 3 days, and I couldn't resolve the problem.

I have searched many articles in stackoverflow, but no luck.

Kindly help me to get rid off from this.

Thanks.

如果您拥有Base Web API和Module Web API的所有路由,是否可以检查Base Solution中的GlobalConfiguration.Configuration.Routes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM