webentwicklung-frage-antwort-db.com.de

Rufen Sie in der .NET Core-Web-API ERR_CONNECTION_RESET nur auf IIS - Andere Anrufe funktionieren

Ich bin jetzt völlig ratlos ...

Ich habe eine .NET Core-Webanwendung und es funktioniert alles lokal. Es gibt eine Reihe von WebAPI-Endpunkten, die alle wie beabsichtigt mit GET funktionieren und JSON korrekt zurückgeben.

Wenn ich in IIS veröffentliche, funktioniert nur einer dieser Endpunkte nicht mehr und wirft (failed) net:ERR_CONNECTION_RESET (in Chrome - andere Browser verursachen ihre eigenen Fehler).

Das Besondere ist, dass alle anderen Web-API-Aufrufe in derselben Umgebung und unter Aufrufen derselben Datenbank unter Verwendung desselben Kontexts und EF-Datendiensts ausgeführt werden.

Was ich nicht herausfinden kann, ist, wie ich detaillierte Protokolle von Kestrel in einige andere Protokollierungsdienste wie die Windows-Ereignisanzeige, eine Textdatei, E-Mails oder irgendetwas anderes bekomme! Ich habe nicht viel von der Protokollierungs-Middleware verwendet, mit der Absicht, dies zu tun, wenn wir uns der Produktion nähern.

Was ist der beste Weg, um dies in IIS 8 unter Windows 2012 R2 mit dem .NET-Kern-Kestrel-Webserver zu versuchen und Fehler zu beheben?

6
RemarkLima

Bearbeiten Sie einfach Ihre web.config und setzen Sie stdoutLogEnabled="true" auf true sowie den Pfad, in den die Protokolldatei geschrieben wird.

<?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>

Sie müssen jedoch mindestens die Konsolenprotokollierung aktivieren, da sie die Konsolenausgabe im Grunde in eine Datei umwandelt.

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

Der Abschnitt "Protokollierung" wird in appsettings.json konfiguriert, z

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

Ich hatte ein ähnliches Problem. Ich verwende Entity Framework Core 1.1, das Lazy Loading nicht zulässt. Mein Fehler wurde durch eine Objektdiagrammschleife in einer Viele-zu-Viele-Beziehung verursacht.

Da EFCore 1.1 keine sofort einsatzbereiten Many-to-Many-Modelle unterstützt, verfügten meine Modelle über Schleifenreferenzen. Mein JSON-Serializer steckte in einer Endlosschleife fest, als er versuchte, die von meiner Controller-Klasse zurückgegebenen Daten zu serialisieren.

Wenn Sie dieses Problem haben und keine der anderen Lösungen funktioniert, empfehle ich, die Methode für die ConfigureServices() -Datei Startup.cs zu ändern. Die Zeile services.AddMvc(); sollte folgendermaßen geändert werden:

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

Sie können Kestrel mit der integrierten Protokollierungs-Middleware protokollieren. Stellen Sie sicher, dass die Protokollierung in der Datei web.config über stdoutLogEnabled wie folgt aktiviert ist:

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

Und Ihre startup.cs enthält den folgenden Code:

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

Ich habe unten Code in startup.cs hinzugefügt und es hat funktioniert.

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

Ich habe eine selbstreferenzierende Tabelle in Entity Framework Core (Parent-Child-Beziehung) verwendet.

0
user2031877

Bearbeite Startup.cs und ersetze dies: services.AddMvc() mit:

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

Ich weiß, dass dies als beantwortet markiert wurde, aber keines der oben genannten Probleme hat bei mir funktioniert. Für mich bestand die Lösung darin, das Webprojekt von Dotnet Core 2.1 auf 2.2 zu aktualisieren und auch das Dotnet Core SDK zu aktualisieren.

0
Bren Gunning