2016-03-31 401 views
1

我一直試圖解決這個過去的4個小時。錯誤500 Web API

我有一個新的Web API項目 - 該工程對發展精細100%,

但活的服務器上,我收到了500 Internal Server Error

當我部署新版本並直接向http://URL/Action發送請求時,出現錯誤。 但是 如果我先去http://URL/然後發送POST請求到http://URL/Action,它的工作原理。

同樣是這樣,當存在於API沒有請求12,13 hours

所以爲它工作第一我都開:http://URL/Action,然後發送POST請求。

因此該項目使用Ninject,這是Startup.cs

using System.Collections.Generic; 
using System.Reflection; 
using System.Web.Http; 
using API.MyApi; 
using Business.Bindings; 
using Microsoft.Owin; 
using Ninject; 
using Ninject.Modules; 
using Ninject.Web.Common.OwinHost; 
using Ninject.Web.WebApi.OwinHost; 
using Owin; 

[assembly: OwinStartup(typeof(Startup))] 
namespace API.MyApi 
{ 

    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      app.UseWebApi(config); 

      app.UseNinjectMiddleware(CreateKernel); 
      app.UseNinjectWebApi(config); 

      GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
     } 

     private static StandardKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 

      var modules = new List<INinjectModule> 
      { 
       new BusinessBindings(), 
       new DataBindings() 
      }; 
      kernel.Load(modules); 
      return kernel; 
     } 

    } 
} 

而且WebAPI Config

using System.Web.Http; 

namespace API.MyApi 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
      config.Formatters.XmlFormatter.UseXmlSerializer = true; 
      GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
     } 
    } 
} 

我曾嘗試加入這行代碼來獲取整個錯誤消息的看法:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

並且還將其添加到第Ëweb.config文件

<customErrors mode="Off"/> 

但我在郵遞員得到的錯誤是:

enter image description here

後,我瀏覽到URL.com在瀏覽器:

enter image description here

然後如果我發送POST請求:

enter image description here

編輯:

這是我的異常處理程序屬性:

public class ExceptionHandlerAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     var exception = actionExecutedContext.Exception; 

     using (var exceptionLogger = new CustomLogger("Exceptions")) 
     { 
      exceptionLogger.LogExceptionMessage(exception.Message, exception.InnerException, exception.StackTrace); 
     } 

     base.OnException(actionExecutedContext); 
    } 

} 

和控制器裝飾有屬性:

[ExceptionHandler] 
public class SmartOneCController : BaseApiController 
{ 
    public SmartOneCController(CustomLogger logger) 
    { 
    } 

} 

那麼這個屬性應該將異常記錄到日誌文件 - 正在測試在開發和部署版本上。

但沒有記錄從500 Internal Server Error

控制器代碼例外,我沒有看到控制器代碼將如何幫助這裏,因爲一切都逛API的基礎URL之後的工作原理:URL.com後,我可以調用這個POST方法,一切正常。

[ExceptionHandler] 
public class SmartOneCController : BaseApiController 
{ 
    public SmartOneCController(CustomLogger logger, IAssetsProvider assetsProvider, ISatelliteTrackerProvider satelliteTrackerProvider) : base(logger, assetsProvider, satelliteTrackerProvider) 
    { 
    } 

    public void Post(HttpRequestMessage request) 
    { 
     try 
     { 

      // Reading data as XML string to log to files - In case message structure is changed 
      var xmlDoc = new XmlDocument(); 
      xmlDoc.Load(request.Content.ReadAsStreamAsync().Result); 
      var str = xmlDoc.InnerXml; 

      _logger.LogMessage(MessageType.Information, string.Format("RAW XML Message: {0}", str)); 

      // Convert to model 

      var model = XMLHelper.FromXml<trackermessages>(str); 
...... 
+0

請發佈記錄的錯誤的適當的異常詳細信息(名稱,消息,堆棧跟蹤)。沒有這些信息,你的問題就模糊不清。 – Steven

+0

您可以添加全局ExceptionLogger來記錄實時服務器上發生的實際異常嗎?你可以找到有關如何在這裏做的信息:http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling – Pedro

+0

@Steven這是我的問題之一我有我不能得到完整的異常 –

回答

0

問題出在Startup.cs類,這是什麼讓它工作

[assembly: OwinStartup(typeof(Startup))] 
namespace API.MyApi 
{ 

    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var webApiConfiguration = new HttpConfiguration(); 

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

      app.UseNinjectMiddleware(CreateKernel); 
      app.UseNinjectWebApi(webApiConfiguration); 
     } 

     private static StandardKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 

      var modules = new List<INinjectModule> 
      { 
       new BusinessBindings(), 
       new DataBindings() 
      }; 
      kernel.Load(modules); 
      return kernel; 
     } 

    } 
} 
0

我會說它的路由/命名空間問題。我會改變你正在使用的控制器和命名空間的名稱。更改API名稱空間和控制器名稱。我的猜測是,它在某個地方導致了導致500錯誤的衝突。

最近,我有同樣的問題。它讓我瘋狂,在我的情況下導致錯誤的原因是我有一個名爲Reports的控制器,導致與SSRS發生路由問題/衝突。就像您的應用程序一樣,它可以在開發環境中工作,因爲應用程序資源在部署時不會暫停,具體取決於設置是IIS還是Azure,應用程序資源會在一段時間後暫停。由於某種原因,應用程序在處於暫停狀態後嘗試恢復時,會在啓動時發生錯誤。

+0

但是,當我進入家庭網址後,它確實有效 - 在此之後,一切正常 –

1

爲了得到你可以在Visual Studio調試器附加到使用遠程調試IIS進程之外。如果您沒有對遠程計算機的必需訪問權限,則可能在開發工作站上運行IIS,並嘗試在本地部署應用程序,而不是在VS的開發模式下運行。至於<customErrors>我已經有過更改這種情況的場合,因此如果可以,請嘗試使用本地部署的瀏覽器。

爲了排除路由,命名空間或控制器問題,您也可以嘗試在沒有外部依賴同一個控制器增加一個虛擬方法,看看是否調用該URL的工作方式。

至於您所遇到的問題的方式;這聽起來像你通過http://URL/Action執行控制器行爲可能有一定的相關性,目前尚未初始化,並通過訪問http://URL/第一,你給應用程序時初始化該相關性。這種情況發生在一段時間後會顯示它與應用程序是否已在IIS中運行有關,或者應用程序池已關閉它,並且應用程序需要在您點擊時執行完整的啓動http://URL/