ASP.NET MVC 4 WebAPI (beta): cómo cambiar el tamaño máximo del búfer de respuesta
Frecuentes
Visto 2,387 veces
6
En ASP.NET MVC 4.0 WebAPI (versión beta), devuelvo un objeto serializado en JSON que tiene más de 65 kb. Como puede ver en el seguimiento de la pila a continuación, el marco genera una excepción porque excede algún límite interno.
System.Net.Http.HttpRequestException: Cannot write more bytes to the buffer than the configured maximum buffer size: 65536.
at System.Net.Http.HttpContent.LimitMemoryStream.CheckSize(Int32 countToAdd)
at System.Net.Http.HttpContent.LimitMemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(Char value)
at Newtonsoft.Json.JsonWriter.AutoComplete(JsonToken tokenBeingWritten) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\JsonWriter.cs:line 634
at Newtonsoft.Json.JsonTextWriter.WritePropertyName(String name) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\JsonTextWriter.cs:line 204
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 209
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 336
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 209
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 336
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 445
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 209
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 336
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 209
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 336
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContract collectionValueContract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 445
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 59
at xxx.Api.JsonNetFormatter.<>c__DisplayClass5.<OnWriteToStreamAsync>b__4() in c:\xxx\xxx\xxx.Api\JsonNetFormatter.cs:line 79
at System.Threading.Tasks.Task.Execute()
No puedo encontrar ninguna manera de cambiar este valor predeterminado. ¿Alguien puede ayudar?
gracias
1 Respuestas
3
De acuerdo con System.Net.Http.dll publicado con las compilaciones de código fuente nocturnas, el valor del tamaño máximo del búfer se define en HttpContent como:
internal const long MaxBufferSize = 0x7fffffffL; // 2147483647
Entonces, si cambia a la nueva versión (en lugar del instalador beta), el problema debería desaparecer.
Sugiero cambiar de todos modos, independientemente de este problema, ya que hay bastantes cambios importantes y lo que sea que estés construyendo ahora es garantizado que no funciona con el lanzamiento final.
contestado el 03 de mayo de 12 a las 20:05
gracias - parece que esto es lo que voy a tener que hacer, por desgracia. - Andrés
¿Funcionó el cambio? Estoy viendo exactamente el mismo seguimiento de pila, pero no estoy usando ninguna versión beta, que yo sepa. - PandaMadera
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas asp.net asp.net-web-api or haz tu propia pregunta.
¿Has probado esto? forums.asp.net/t/1795106.aspx/1?Establecer+longitud+de+respuesta+web - syneptody
@syneptody no estoy usando el serializador json predeterminado, así que no estoy seguro de si esto se aplica. gracias por el enlace de todos modos, tendrá un violín basado en sus sugerencias. - Andrew
¿Puede publicar las partes relevantes de su
JsonNetFormatter
¿clase? - nemesv@nemesv pastebin.com/6Ld6srLH - Andrew
¿Cómo llamas a tu método webapi? Navegador, javascript, clinet personalizado? - nemesv