タイトルにあるように、GETリクエストからIQueryableアクションまで500の内部サーバーエラーが発生しました。エラーの本文は空です。このエラーは、アクションが結果を返した後に発生します。
ASP.NET WebAPIRCを使用しています。
そのエラーのスタックトレースを取得するにはどうすればよいですか?
タイトルにあるように、GETリクエストからIQueryableアクションまで500の内部サーバーエラーが発生しました。エラーの本文は空です。このエラーは、アクションが結果を返した後に発生します。
ASP.NET WebAPIRCを使用しています。
そのエラーのスタックトレースを取得するにはどうすればよいですか?
追加してみることができます:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.Always;
あなたApplication_Start()
のGlobal.asaxに。この解決策は、一般的なエラーの多くに有効です。
ただし、満足のいく情報が得られない場合は、 l Exception Filterを作成してグローバルに登録することを検討してください。
この記事から始めましょう。必要なものの核心は、次のようなものを書いて登録することです:
public class NotImplExceptionFilter : ExceptionFilterAttribute {
public override void OnException(HttpActionExecutedContext context) {
if (context.Exception is NotImplementedException) {
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
}
}
RC 後、この問題は修正され、500 Internal Server Error とは別に、エラーの詳細も表示されます。(ただし、この問題は Web ホストのシナリオでのみ修正されます)。
次のようにして、フォーマッタの WriteToStream メソッドの実行中に発生する可能性がある実際の例外の詳細を取得できます。
ObjectContent<IEnumerable<Product>> responseContent = new ObjectContent<IEnumerable<Product>>(db.Products.Include(p => p.ProductSubcategory).AsEnumerable(), new XmlMediaTypeFormatter()); // change the formatters accordingly
MemoryStream ms = new MemoryStream();
// This line would cause the formatter's WriteToStream method to be invoked.
// Any exceptions during WriteToStream would be thrown as part of this call
responseContent.CopyToAsync(ms).Wait();
この同じ問題に遭遇しました。Kiran Challa の応答は、実際の例外が私のアクションの外でスローされるのに役立つことがわかりました。
私の問題を解決するために、コンテキストの ProxyCreationEnabled プロパティを false に設定すると、さらに一歩前進しました。
私のシナリオでは、次の例外はモデル内の循環参照によるものでした。それを片付けた後、ファントム500の応答はなくなりました。これをまだ解決していない場合は、頑張ってください。
私の場合、一見単純なルーティングの弱点がこの問題を引き起こしました。Api コントローラーに同じ署名 (名前ではない) を持つ別の HttpPost がありました。デフォルトのルーティングでは名前の違いが解決されず、いずれかの API 関数に到達する前に ServiceError 500 が返されました。解決策: デフォルトのルーティングまたは署名を変更して、再試行してください。
これは、標準の WebApi2 の使用法で非常にうまく機能する私の RouteConfig.cs です。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Default is required in any case.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
クエリ パラメータを正しい順序で指定していないときに、RC で問題が発生しました。たとえば を指定する$skip=0
と 500 になりますが、指定し$orderby=xxx&skip=0
ないとエラーになります。
私は同じ問題を抱えていましたが、そのソースはわずかに異なっていました:CORS
ポリシーを間違って設定し500 Internal server error
たため、 が表示されましたが、機能しCORS
ていなかっAccess-Control-Allow-Origin
たため、応答でヘッダーが表示されず、ブラウザーが実際の応答を読み取ることができませんでした
Copy as cURL
応答を確認してエラーの原因を理解できるChromeDevTools オプションで解決しました
私は通常、Global.asax を使用してすべてのエラーをキャッチします。ここに使用できるコードスニップがあります
public void Application_Error(object sender, EventArgs e)
{
Exception exc = Server.GetLastError();
MvcApplication mvcApplication = sender as MvcApplication;
HttpRequest request = null;
if (mvcApplication != null) request = mvcApplication.Request;
}
Fredrik Normén は、このトピックについてASP.NET Web API Exception Handlingという素晴らしいブログ記事を書きました。ApiController
彼のソリューションでは、すべてのアクション メソッドに適用できるカスタム例外クラスと例外フィルター属性を使用しています。