C# .NET Web api 2在IIS中运行一段时间后停止工作

C# .NET Web api 2在IIS中运行一段时间后停止工作,c#,iis,asp.net-web-api,visual-studio-2015,asp.net-web-api2,C#,Iis,Asp.net Web Api,Visual Studio 2015,Asp.net Web Api2,我在一个解决方案中有两个web API项目DLL 我的项目解决方案的结构: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Configure Web API to use only bearer token authenticatio

我在一个解决方案中有两个web API项目DLL

我的项目解决方案的结构:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
在我的解决方案中,项目的位置如下:

1) 基本溶液

2) 基本Web API

3) 模块Web API

因此,我的解决方案类似于包含许多模块的基本解决方案。每个模块都可以包含自己的Web API。此外,我的基本解决方案包含自己的Web API

这是我们的结构

我的问题:

它在我的本地运行解决方案中运行良好。当我将其托管到IIS时,它工作了几个小时,然后抛出错误消息“error 404 found”停止工作。当我试图直接通过类似“”的URL访问时,不起作用

Visual Studio版本:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
Visual Studio专业版-2015

IIS版本:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
IIS-7.5.7600

我的方法: 我有一个模拟这个场景的简单项目。我原来的项目也有同样的问题

基本模块的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: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
App\u 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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
基本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: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
模块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: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
对于基本代码:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
Global.asax:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
用于模块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: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
我的问题:

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 }
        );
    }
}
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";
    }
}
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 }
        );
    }
}
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";
    }
}
routeTemplate: "api/module/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}"
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);
        }
    }
}
value1
value2
value1
value2
过了一段时间,当我尝试访问同一链接时,我无法获得该链接。上面说

status 404. Not Found
我已经为这个问题工作了3天,但我无法解决这个问题

我在stackoverflow中搜索了很多文章,但没有找到

请帮我摆脱这一切


谢谢。

如果您拥有基本Web API和模块Web API的所有路由,您可以检查基本解决方案中的
全局配置.Configuration.Routes
吗?

我会查看您那里的try/catch块,它会吞下任何错误。尝试登录某个地方,看看它是否在那里。它是如何停止工作的?应用程序池停止了吗?IIS中的站点正在停止吗?如何重新启动它?(你是否回收应用程序池或在IIS或类似应用程序中重新启动网站?)你能解决这个问题吗,因为我也有这个问题。有什么解决方案吗?是的。我检查了一下,它在IIS托管后的一段时间内运行良好。但过了一段时间,它就停止工作了。这意味着在这部分
if(action!=null)GlobalConfiguration.Configure(action)