2016-11-07 99 views
3

我在一個解決方案中有兩個web API項目DLL。我的項目解決方案的NET Web api 2在某個時間在IIS中停止工作

結構:

在我的解決方案,該項目位於如下:

1)對於基本溶液

2)基本的Web API

3) Module Web API

因此,我的解決方案就像是一個包含許多模塊的BASE解決方案。每個模塊都可以包含自己的Web API。此外,我的基本解決方案包含自己的Web API

這是我們的結構。

我的問題:

它工作正常在我的本地運行的解決方案。當我將它託管到IIS時,它會運行幾個小時,然後通過拋出錯誤消息「發現錯誤404」停止工作。當我嘗試直接通過URL訪問類似於「http://127.0.0.1:51/Products/Get」的內容時,無法正常工作。

的Visual Studio版本:

的Visual Studio專業 - 2015年

IIS版本:

IIS - 7.5.7600

我的方法: 我有一個模擬此場景的簡單項目。它與我的原始項目有同樣的問題。

網頁API對於基本模塊: App_Start下

WepApiConfig:

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 } 
     ); 
    } 
} 

基地API控制器:

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對於模塊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 } 
     ); 
    } 
} 

模塊API控制器:

兩個APIConfig文件之間的差異是:

從上面的代碼

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}" 

的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); 
     } 
    } 
} 

}

我上述項目試了一下:

在IIS託管後,我試圖訪問該是這樣的路徑:

爲基礎API:

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

返回:

value1 
value2 

對於模塊API

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

返回:

value1 
value2 

我的問題:

一段時間後,當我試圖訪問相同的鏈接,我無法獲取。它說

status 404. Not Found 

我一直在這個問題上工作了3天,我無法解決問題。

我已經搜索了很多文章在stackoverflow,但沒有運氣。

請幫我擺脫這一點。

謝謝。

+1

我想看看你在那裏吞嚥任何錯誤的try/catch塊。嘗試記錄某處並查看它是否在那裏。 – DavidG

+0

它如何停止工作? AppPool停止了嗎? IIS中的站點停止了嗎?你如何重新啓動它? (你是否回收應用程序池或重新啓動在IIS或類似的網站?) –

+1

你能解決這個問題,因爲我也有這個問題 –

回答

0

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

+0

是的。我查了一下,並且在IIS中託管之後的某段時間工作正常。但過了一段時間後,它停止工作。這意味着在這部分'if(action!= null)GlobalConfiguration.Configure(action);'? – Vikash