web-dev-qa-db-ja.com

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

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

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

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

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

158
Nate

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

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

247
Nate

基本的に:

IncludeErrorDetailPolicyで解決できない場合は、代わりにCustomErrorsを使用します(たとえば、ASP.NETスタックが> 2012の場合)。

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

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

TL; DRバージョン

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

とにかく、私はローカルで持っていなかった生産上の問題がありました。そして、Chromeの[ネットワーク]タブに、開発マシンで見られるようなエラーが表示されないことがわかりました。最終的に、Chromeを実稼働サーバーにインストールし、サーバー自体(たとえば「localhost」)でアプリを参照することで解決できました。その後、スタックトレースなどすべての詳細なエラーが表示されました。

その後、私が見つけたのは ジミー・ボガードのこの記事 (注:ジミーは mr。AutoMapper! )です。おもしろいことに、彼の記事も2012年のものですが、その中にCustomErrorsはもうこれには役立たないが、グローバルなWebApi構成で異なるIncludeErrorDetailPolicyを設定することで「エラーの詳細」を変更できることが既に説明されていますWebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

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

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

87
Bart

他の答えはどれも私にとってはうまくいきませんでした。

これは:(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;
    }
}
22
samneric

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

11
ctong

これが誰にも役立つ場合:

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

<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」を使用して別のファイルに配置されましたが、それは別の話です)。

9
hormberg

テスト環境でエラーが発生し、「これは以前にやったことがありますが、コードを変更してテスト環境に再デプロイすることなくweb.configで直接行うことができます」と覚えているとき、私は常にこの質問に出くわします、しかし、それは2つの変更を必要とします...再びそれは何でしたか?」

今後の参考のために

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

そして

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

私の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/

enter image description here

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

0
RaSor