Zakładam, że próbujesz pobrać ContentLength z oprogramowania pośredniego?
Oto przykład Middleware. Powinien zostać dodany do potoku (startup.cs) przed dowolnym oprogramowaniem pośredniczącym generującym odpowiedzi, takim jak useMVC lub useStaticFiles.
public class ContentLengthMiddleware
{
RequestDelegate _next;
public ContentLengthMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (var buffer = new MemoryStream())
{
var request = context.Request;
var response = context.Response;
var bodyStream = response.Body;
response.Body = buffer;
await _next(context);
Debug.WriteLine($"{request.Path} ({response.ContentType}) Content-Length: {response.ContentLength ?? buffer.Length}");
buffer.Position = 0;
await buffer.CopyToAsync(bodyStream);
}
}
}
Z powodów, które są poza moim zrozumieniem po powrocie statycznych plików (PNG, JS, etc) ciało odpowiedź będzie pusta jednak ContentLength jest ustawiony dlatego użyłem response.ContentLength ?? buffer.Length
.
(Uwaga na mod: przepraszam za duplikat odpowiedzi na dwa pytania, druga odpowiedź została niepoprawnie opublikowana, zbyt wiele zakładek otwartych, usunąłem ją i przeredagowałem odpowiedź tutaj).
Ciekawy, jaki jest scenariusz, w którym jest to potrzebne? Prawdopodobnie jednym ze sposobów uzyskania tych informacji jest zarejestrowanie się w wywołaniu zwrotnym 'OnSendingHeaders' w bieżącej odpowiedzi. Przykład: 'httpContext.Response.OnSendingHeaders (callback: (stan) => {var length: (HttpContext) state.ContentLength;}, state: httpContext)'. –
Myślę, że przegapiłem twoją ostatnią linię postu ... na pewno, nawet to by działało ... możesz napisać oprogramowanie pośredniczące, które jest rejestrowane bardzo wcześnie w potoku i owija ciało odpowiedzi strumieniem delegującym ... –
@ KiranChalla Wymagam długości zawartości do zliczania zużytej przepustowości. Kiedy limit zostanie przekroczony, dalsze żądania będą blokowane/spowalniane. Wywołanie zwrotne 'OnSendingHeaders' nie działa: Właściwość' ContentLength' ma wartość 'null'. To samo dotyczy wywołania zwrotnego 'OnResponseCompleted'. – ycrumeyrolle