Speicheroptimierung für einen großen HttpWebRequest POST oder PUT basierend auf .NET Framework 4.5
Dieser Artikel hilft Ihnen, das Problem zu beheben, das auftritt, wenn Sie die HttpWebRequest Klasse verwenden, um viele Daten für eine HTTP POST- oder PUT-Anforderung zu senden.
Ursprüngliche Produktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 2855735
Problembeschreibung
Wenn Sie die HttpWebRequest Klasse verwenden, um viele Daten für eine HTTP POST- oder PUT-Anforderung zu senden, schlägt die Anforderung möglicherweise auf einem Computer fehl, auf dem microsoft .NET Framework ausgeführt wird. Darüber hinaus wird möglicherweise eine Ausnahme außerhalb des Arbeitsspeichers angezeigt.
Möglicherweise stellen Sie fest, dass die Anwendung, die die Klasse verwendet, HttpWebRequest viel Verwendung verbraucht. Wenn Sie den Leistungsmonitor verwenden, um die Anwendung zu überwachen, die die HttpWebRequest Klasse verwendet, nimmt die Anzahl der privaten Bytes weiter zu, wenn Daten gesendet werden.
Ursache
Dieses Problem tritt auf, weil die .NET Framework die ausgehenden Daten standardmäßig puffert, wenn Sie die HttpWebRequest Klasse verwenden. Eine POST- oder PUT-Anforderung schlägt fehl, wenn Sie die HttpWebRequest-Klasse verwenden, um viele Datendokumente an das ursprüngliche Problem zu senden.
Lösung
Um dieses Problem zu umgehen, legen Sie die HttpWebRequest.AllowWriteStreamBuffering Eigenschaft auf "false" fest. Dadurch werden ausgehende Daten (Entitätstext) für den POST oder die PUT-Anforderung nicht im Speicher gepuffert.
In Versionen von .NET Framework vor 4.5 würde das Festlegen der Eigenschaft auf "false" manchmal zu Fehlern beim Hochladen von HttpWebRequest.AllowWriteStreamBuffering Daten an authentifizierte Endpunkte führen. Sie können z. B. auf eine Nachricht stoßen, System.Net.WebException bei der diese Anforderung das Puffern von Daten erfordert, um erfolgreich zu sein. Bei eingehenderer Untersuchung weist die mit der Ausnahme verbundene Antwort jedoch tatsächlich auf den Statuscode System.Net.HttpStatusCode.Unauthorized (401) hin. Eine POST- oder PUT-Anforderung schlägt fehl, wenn Sie die HttpWebRequest-Klasse zum Senden vieler Datendokumente verwenden, um eine Problemumgehung der Vorauthentifizierung und der KeepAlive-Verbindung zur Verarbeitung der 401-Antwort zu erhalten.
Im Gegensatz zu .NET Framework 1.1, 2.0, 3.0, 3.5 und 4.0 fügt .NET Framework 4.5 neue Entwurfsfunktionalität für die HttpWebRequest.AllowWriteStreamBuffering Eigenschaft hinzu. Die neue Funktion kann das Authentifizierungsszenario direkt verarbeiten, solange das Expect100Continue Feature aktiviert ist. Der ServicePointManager.Expect100Continue Standardwert ist "true".