IIS ExpressではなくIIS7でのWebApiの{“メッセージ”:“エラーが発生しました”}


171

私はASP.NET MVC 4 WebApiを使用しており、IIS Expressのローカルコンピューターで実行することで非常に楽しんでいます。IIS Expressを構成してリモートマシンにもサービスを提供したので、社内の他のユーザーが自分のコンピューターをWebサーバーとして使用しています。

これが最適ではないソリューションであると判断した後、.NET 4.5をインストールした後、リモートサーバーにWebApiを配置することにしました。フィドラーを使用してPOSTをローカルマシンのコントローラーに送信すると、正しい応答が返されますが、ドメインをIIS7を実行しているWebサーバーに変更すると、同じPOSTが暗号を返します

{"メッセージ": "エラーが発生しました"}

メッセージ。誰が何が起こっているのか考えていますか?


2
エラー応答のHTTPステータスコードは何ですか?500の場合、IIS 7を使用するリモートマシンではWebサイト/アプリケーションの構成が無効である可能性が高いです。リモートマシンで単純なHTMLファイルを作成し、可能であればリモートマシンで参照して、表示できることを確認してから、試してください。マシンからヒットして、成功したかどうかを確認します。
Sixto Saez 2012年

500エラーです。提案をありがとう、しかしWebApiが提供するデフォルトのindex.htmlページは機能します。また、API Webサービスの一部は機能し、その他は機能しないが、すべてがローカルマシンで機能することを追加する必要があります。
nsg 2012年

2
500エラーが表示された場合は、IIS要求トレースを有効にして、詳細を取得する必要があります。通常、500エラーはWeb APIルーティングが開始する前に発生しますが、コードが実行している何かによってトリガーされる可能性はあると思います。IISトレースログを調べて、手がかりが得られるかどうかを確認します。
Sixto Saez 2012年

1
サーバーマシン自体のブラウザから(たとえば、リモートデスクトップセッションを使用して)要求を開始することにより、サーバーに応答でより詳細なエラー情報を提供できる場合があります。
ジョンシュナイダー、

回答:


268

問題は、サーバー上ではなくローカルマシン上にある依存関係の欠落でした。私たちの場合、それはDevart.Data.Linq dllでした。

その答えを得るために、私はIISトレースを500エラーに対してオンにしました。これは少し情報を提供しましたが、本当に役立つことは、web.configの設定にありました<system.web><customErrors mode="Off"/></system.web>。この依存関係を追加してローカルにコピーするように指示すると、サーバーは動作を開始しました。


33
WebAPIは、HTTP応答コードが500でカスタムエラーがオンの場合は常に、実際の応答を{"message": "an error has occurred"}に置き換えます。ポインタをありがとう。
Paul Suart 2013

4
customErrorsモードの設定に関する素晴らしい提案。これらの種類のエラーの出力に影響を与えた変更に驚いています。
Dewi Rees、2014年

1
に設定することもできmode="RemoteOnly"、サーバー上のWebブラウザーでページを実行した場合、サイトの残りの部分が外部からアクセス可能であれば、セキュリティを損なうことなくエラーが表示されます
Simon_Weaver

その設定を変更するときにこの種のエラーの詳細を取得する方法に関する提案はありませんか(たとえば、API部分がPCI互換サーバーでホストされているため、エラーはマシンレベルで無効になっています)?Elmahをセットアップしてみましたが、残念ながら何もログに記録されていません。
RubyHaus

これは最良のアプローチであり、そのような一般的な方法に関する十分な情報を提供します。
DanielV 2016

97

基本的に:

解決しないIncludeErrorDetailPolicy場合CustomErrorsは代わりに使用してください(たとえば、ASP.NETスタックが> 2012の場合):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

注:詳細なエラー情報を返すと、機密情報が「ハッカー」に漏洩する可能性があるので注意してください。以下のこの回答に関するサイモンのコメントを参照してください。

TL; DRバージョン

私にとってCustomErrorsは本当に役に立ちませんでした。すでにに設定されていましたがOff、まだかなりのan error has occurredメッセージしかありませんでした。受け入れられた答えは3年前からのものだと思います。これは最近のウェブ用語では長い間です。私はWeb API 2とASP.NET 5(MVC 5)を使用していますが、MicrosoftはIISのみの戦略から移行しましたが、CustomErrors古いskool IISです;)。

とにかく、ローカルにはなかった制作の問題がありました。そして、Chromeの[ネットワーク]タブでは、開発マシンのようにエラーを表示できないことがわかりました。結局、本番サーバーにChromeをインストールし、サーバー自体(たとえば、「localhost」)にあるアプリにアクセスすることで解決できました。次に、スタックトレースなどで、より詳細なエラーが表示されました。

その後初めて、この記事をJimmy Bogardから見つけました(注:JimmyはMr. AutoMapper!です)。おもしろいのは彼の記事も2012年のものであるということですが、その中ですでに彼CustomErrorsはこれは役に立たないがIncludeErrorDetailPolicy、グローバルWebApi構成で異なる設定を行うことで「エラーの詳細」を変更できると説明しています(例:) WebApiConfig.cs

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

幸いにも彼は、webapi(2)があなたのCustomErrors設定をリッスンするように設定する方法も説明しています。これはかなり賢明なアプローチであり、これにより2012年に戻ることができます。

注:デフォルト値は「LocalOnly」です。これは、この投稿を見つける前に、私が説明した方法で問題を解決できた理由を説明しています。しかし、私は誰もが本番環境にリモートでアクセスしてブラウザを起動できるだけではないことを理解しています(私がフリーランスとDevOpsに行くことを決定するまで、ほとんどそれができなかったことを知っています)。


2
これでうまくいきます。ありがとうございました!ビルドサーバーでは失敗するが、ローカルでは失敗しない、いくつかのインメモリ統合の一種のテストがあります。スタートアップクラスでこの設定を使用すると、その理由を理解する機会があるかもしれません。
Thomas Eyde 16年

Microsoft.AspNet.WebApi.WebHostを介してIISでホストされている場合、customError設定はWebApi 2で機能するようです。パッケージはバージョン5.2.3であるため、ASP.NETスタックは2012年を過ぎています。これをオフに設定すると、Web APIは一般的なエラーからより詳細なものに切り替わり、コールスタックなどが含まれます...
Tom

4
機密情報が「ハッカー」に漏洩する可能性があるため、この設定には注意してください。私はしばしばif (DateTime.Now < new DateTime(2017, 6, 22)) { .... }このようなオプションを設定するようなクイックハックをします。その後、本番環境でテストできます。無効にすることを忘れると、明日は魔法のように通常の動作に戻ります。
Simon_Weaver 2017年

36

他の答えはどれもうまくいきませんでした。

これは:(Startup.cs内)

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

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(またはWebApiConfig.csに配置できます):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

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

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

はい、これがMono / Linuxで私にとって唯一有効なソリューションでした。
ロバートII

これは、IISとWindows Serverで内部的に提供されるアプリの製品版で機能しました。
ポールカールトン

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; コンテキストが
破棄

12

テスト環境でエラーが発生したときはいつもこの質問に行き、「以前にこれを実行したことがありましたが、コードを変更してテスト環境に再デプロイしなくても、web.configで直接実行できます。ですが、2つの変更が必要です...もう一度何をしたのですか?」

今後の参考のために

<system.web>
   <customErrors mode="Off"></customErrors>
</system.web>

そして

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

11

WebAPIエンドポイントに投稿するときに同様の問題がありました。CustomErrors = Offにすることで、dllの1つが欠落している実際のエラーを確認できました。


10

これが誰かを助ける場合:

私は同様の問題があり、私が追加したネイツの指示に従いました:

<system.web>
     <customErrors mode="Off"/>
 </system.web>

これにより、エラーに関する詳細情報が表示されました。

"ExceptionMessage": "指定されたメタデータリソースを読み込めません。"、 "ExceptionType": "System.Data.Entity.Core.MetadataException"、 "StackTrace": "System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResourceで.LoadResources(...

これは、edmxファイルを別の場所に移動し、configのconnectionstringsノードを変更するのを忘れていたことを思い出したときです(connectionsstringsノードは、「configSource」を使用して別のファイルに配置されましたが、それは別の話です)。


これは、asp.netのWeb APIにODataとAutoMapperを追加したときに発生しました。これらのキーワードが誰かがこの投稿にアクセスするのに役立ち、try / catchが機能しなかったため、生の結果を確認する必要があった
Ekus

0

Swagger XMLファイルが\ binにデプロイされませんでした:

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

ここに画像の説明を入力してください

これは、リリース構成とデバッグ構成で設定する必要がありました。


0

あなたが持っている場合は<deployment retail="true"/>、あなたの.NET Frameworkのmachine.configにして、あなたは、詳細なエラーメッセージは表示されません。設定がfalse、または存在しないことを確認してください。


0

だから私は無駄に提案された解決策をすべて試しました。サーバーからアプリを実行するように設定するだけで、エラーが完全に表示されました。customErrorsモードをfalseに設定すると、これは機能するはずですが、機能しませんでした。サーバーからAPIを閲覧した瞬間、問題を確認できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.