windows - HttpAddFragmentToCache og OS fejl 50

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette en integreret webserver i en applikation. Til dette bruger jeg http.sys HTTP server komponenten fra Windows. Alt fungerer godt, når jeg ikke forsøger at bruge HttpAddFragmentToCache.


Hvad jeg gjorde så langt (fjernet fejl kontrol, men uden fragment caching fungerer det OK):


HttpInitialize( HTTPAPI\_VERSION\_1, HTTP\_INITIALIZE\_SERVER );
HttpCreateHttpHandle( FQueueHandle )
HttpAddUrl( FQueueHandle, PWideChar( W ) );
...
HttpRemoveUrl( FQueueHandle, PWideChar( W ) );
HttpTerminate( HTTP\_INITIALIZE\_SERVER );


Nu når en forespørgsel kommer i en hjælper tråd:


HttpReceiveHttpRequest( FQueueHandle, FRequestID, 0, FRequest^, FRequestBufferSize, @Bytes );
// if needed:
HttpReceiveRequestEntityBody( FQueueHandle, FRequestId, 0, @FRequestContent[ 0 ], Longword( N ), @BytesRead )
// Fill in chunks...
// Respond
HttpSendHttpResponse( FQueueHandle, FRequestId, 0, FResponse, nil, N );


Det, jeg forsøger at ændre, er at tilføje nogle statiske dokumenter til fragmentcachen (ved ellipse ovenfor):


Chunk.DataChunkType           := hctFromMemory;
Chunk.FromMemory.pBuffer      := @Content[ 0 ];
Chunk.FromMemory.BufferLength := Length( Content );
Policy.Policy                 := hcpUserInvalidates;
Policy.SecondsToLive          := 0;
Result := HttpAddFragmentToCache( FQueueHandle, PWideChar( W ), Chunk, Policy );


Bemærk: Alle overlappede parametre laves eventuelt NIL/NULL i min kode, der forklarer hvorfor du måske savner den parameter.


Dette vil give et resultat på 50 (forespørgslen understøttes ikke). Jeg forsøgte at tilføje fragmenter fra hukommelse og fra filhåndtering, Alle forskellige politikker. Kontrolleres, om værdierne er korrekte i disassembling. Kontrolleret, om strengen er gået til HttpAddFragmentToCache, er faktisk en gyldig subURL fra den, der er sendt til HttpAddUrl (hvis du ikke får en OS fejl 2, så ' det er heller ikke det).


Mit spørgsmål er: hvad kunne dette være? Jeg forsøger at bruge dette API-opkald på den mest enkle måde, jeg kan se (det er her API'en er designet til), men tilsyneladende gør jeg noget forkert ..


Opdatering:


Det ser ud til, at fragmens tilføjet med funktionen HttpAddFragmentToCache har en maksimal størrelse:


Når koden ovenfor er erstattet af:


Chunk.FromMemory.BufferLength := Min( 256*1024, Length( Content ) );


Der opstår ingen fejl; når erstattet af


Chunk.FromMemory.BufferLength := Min( 256*1024 + 1, Length( Content ) );


Det fejler. Tilsyneladende er der en størrelsesgrænse og ... Jeg fandt det:


http://support.microsoft.com/kb/820129[16]



  UriMaxUriBytes 262144 (bytes)
  4096 (4k) - 16777216 (16MB) bytes Any
  svar der er større end dette
  værdien er ikke cachelagret i kernen
  respons cache.



Dette efterlader to muligheder: 1. Hold flere fragmenter til større filer. eller 2. øg denne grænse i registreringsdatabasen.

Bedste reference


Løst problemet: Der er en grænse i størrelsen, som fragmentets cache kan cache per fragment; standard til 256KB. Se opdateringen af ​​spørgsmålet for detaljer.

Andre referencer 1


Det er lidt svært uden al kildekode for din implementering.


Hvornår kalder du HttpAddFragmentToCache? Det skal være før ethvert opkald til HttpReceiveHttpRequest () i klientens TThread-forekomster.


For eksempel lyder dit HttpReceiveHttpRequest () opkald lidt underligt for mig. Du skal bruge


HttpReceiveRequestEntityBody( FQueueHandle, FRequest^.RequestID, ... ) 


Kig på klassen THttpApiServer i vores SynCrtSock -enhed til et fungerende eksempel på http.sys-serveren. Det understøtter ikke cache endnu, men i det mindste fungerer den primære initialisering og trådpuljen som forventet. [17]