2016-03-31 25 views
1

私はこれを直近の4時間修正しようとしています。エラー500 Web API

私は、新しいWeb APIのプロジェクトがある - 、開発に100%の罰金を作品

しかし、私は500 Internal Server Errorを取得し、ライブサーバー上。

新しいバージョンを展開し、直接http://URL/Actionにリクエストを送信するとエラーが発生します。 BUT 最初にhttp://URL/に行き、POSTリクエストをhttp://URL/Actionに送信すると動作します。 POST要求を送信、その後、http://URL/Actionを:それは私が開く必要があります最初の仕事はとてもために12,13 hours

のためのAPIへの要求がないとき

同じことが当てはまります。

だから、プロジェクトが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; 

さらにこれをth電子web.configファイル

<customErrors mode="Off"/> 

しかし、私は郵便配達で取得エラーは次のようになります。そして、もし

enter image description here

enter image description here

は、私がブラウザでURL.comに移動した後、 POSTリクエストを送信します。

enter image description here

EDIT:

これは私の例外ハンドラ属性です:

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

} 

それでは、この属性がすべきdoはログファイルに例外を記録する - テストされているもの開発版と配備版の両方で

しかし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は問題の1つです。私は完全な例外を得ることができません。 –

答えて

0

問題はStartup.csクラスで発生しました。これは正常に動作しています。

0

私はそのルーティング/名前空間の問題を言います。あなたが使用しているコントローラと名前空間の名前を変更します。 APIの名前空間とコントローラ名を変更します。私の推測では、どこかでそれが500エラーにつながる矛盾を引き起こしているということです。

私は最近同じ問題を抱えていました。それは私を夢中にさせたが、私のケースでは、SSRSとのルーティングの問題や競合を引き起こしていたコントローラという名前のコントローラがあったということが原因だった。アプリケーションのリソースと同じように、アプリケーションのリソースは決して停止されません。なぜなら、IISやAzureの設定に応じて、アプリケーションリソースが一定時間後に中断されるからです。アプリケーションがサスペンド状態になってから回復しようとしたときに何らかの理由で起動時にエラーが発生しました。

+0

しかし、私はホームURLに行った後に動作します - その後すべてが動作します –

1

例外を取得するには、リモートデバッガを使用してVisual StudioデバッガをIISプロセスに接続できます。リモートマシンへのアクセスが必要ない場合は、開発ワークステーションでIISを実行し、VSの開発モードで実行するのではなく、ローカルにアプリケーションを展開してみてください。 <customErrors>については、これを変更しても効果がない場合が多かったため、できる場合は、展開先のブラウザを使用してみてください。

ルーティング、名前空間またはコントローラの問題を除外するには、外部依存関係のない同じコントローラにダミーメソッドを追加して、そのURLを呼び出すのが同じように動作するかどうかを確認することもできます。

問題が発生している方法については、 http://URL/Actionによって実行されているコントローラーアクションが、まだ初期化されていない依存関係を持っている可能性があります。最初にhttp://URL/にアクセスすると、その依存関係を初期化する時間が与えられます。これが一定時間後に起こるということは、アプリケーションがIISで既に実行されているかどうか、またはアプリケーションプールがシャットダウンしているかどうかに関係していることを示します。http://URL/