web-dev-qa-db-ja.com

.NET Core WebAPI呼び出しERR_CONNECTION_RESETはIIS-他の呼び出しが機能している場合のみ

私は今完全に途方に暮れています...

私は.NETCore Webアプリを持っており、ローカルで実行するとすべてが機能しています。いくつかのWebAPIエンドポイントがあり、これらもすべてGETで意図したとおりに機能し、JSONを正しく返します。

IISに公開すると、これらのエンドポイントの1つだけが機能を停止し、(failed) net:ERR_CONNECTION_RESETをスローします(Chrome-他のブラウザーは独自のエラーをスローします)。

特徴的なのは、他のすべてのWeb API呼び出しがすべて同じ環境で機能し、同じコンテキストとEFデータサービスを使用して同じデータベースを呼び出していることです。

私が理解できないのは、Kestrelから他のログサービス(Windowsイベントビューア、テキストファイル、電子メールなど)に詳細なログを取得する方法です。私はロギングミドルウェアをあまり使用していません。本番環境に近づくにつれてそれを接続するつもりです。

.NET Core KestrelWebサーバーを使用するWindows2012R2のIIS 8でこれを試してトラブルシューティングするための最良の方法は何ですか?

7
RemarkLima

Web.configを編集して、stdoutLogEnabled="true"をtrueに設定し、ログファイルが書き込まれるパスを設定するだけです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.Microsoft.com/fwlink/?LinkId=786380
  -->

  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

ただし、基本的にコンソール出力をファイルにダムするため、少なくともコンソールロガーを有効にする必要があります。

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    ...
}

「ロギング」セクションは、appsettings.jsonで構成されています。

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
4
Tseng

私も同様の問題を抱えていました。遅延読み込みを許可しないEntityFramework Core1.1を使用しています。私のエラーは、多対多の関係にあるオブジェクトグラフループが原因で発生しました。

EFCore 1.1はすぐに使用できる多対多をサポートしていないため、私のモデルにはループ参照がありました。 JSONシリアライザーは、コントローラークラスから返されたデータをシリアル化しようとしたときに、無限ループに陥りました。

この問題が発生し、他の解決策が機能しない場合は、Startup.csファイルのConfigureServices()メソッドを変更することをお勧めします。行services.AddMvc();は次のように変更する必要があります。

services.AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
12
birwin

組み込みのロギングミドルウェアを使用してKestrelをロギングできます。次のように、stdoutLogEnabledを介してweb.configでロギングが有効になっていることを確認します。

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">

また、startup.csには次のコードが含まれています。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(LogLevel.Trace);
}
1
Ross

私はstartup.csに以下のコードを追加しました、そしてそれは働きました。

services.AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

Entity Framework Core(親子関係)で自己参照テーブルを使用していました。

0
user2031877

編集Startup.csそしてこれを置き換えます:services.AddMvc()を:

services.AddMvc().AddJsonOptions(y => y.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
0

私はこれが回答済みとしてマークされていることを知っていますが、上記のどれも私にはうまくいきませんでした。私にとっての解決策は、Webプロジェクトをdotnet core 2.1から2.2に更新し、dotnet coreSDKも更新することでした。

0
Bren Gunning