Limitación del tamaño de respuesta de un servicio web WCF.

Estoy hospedando un servicio WCF en IIS usando basicHttpBinding. Las consultas de servicios web de WCF respaldan a SQL Server 2008 utilizando ADO.Net y devuelven un DataTable al lado del cliente del servicio WCF.

Encuentro que cuando el DataTable devuelto es grande, habrá una excepción que dice que la conexión http está cerrada por IIS. ¿Alguna idea de lo que está mal y cómo establecer un tamaño de respuesta mayor? Otra idea es si existe alguna limitación estricta para el tamaño de serialización de un objeto (¿pensé que tal vez la instancia de DataTable es demasiado grande para serializar?)

La información de error devuelta por IIS es:

Mensaje de excepción:

Se produjo un error al recibir la respuesta HTTP a http: //labmachine1/service.svc . Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP. Esto también podría deberse a que el servidor haya abortado un contexto de solicitud HTTP (posiblemente debido a que el servicio se haya cerrado). Ver los registros del servidor para más detalles.

{“La conexión subyacente se cerró: se produjo un error inesperado en una recepción”.

Aquí está mi código fuente completo para el lado del servidor, para el servidor que hospedé en web.config, no hay cambios para los valores predeterminados. Desde que alojé en IIS, estoy usando basicHttpBinding.

public class StudentManagement : IStudentManagement { public DataTable Poll(int Id) { return MakeParentTable(); } private DataTable MakeParentTable() { // Create a new DataTable. System.Data.DataTable table = new DataTable("ParentTable"); // Declare variables for DataColumn and DataRow objects. DataColumn column; DataRow row; // Create new DataColumn, set DataType, // ColumnName and add to DataTable. column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.ColumnName = "id"; column.ReadOnly = true; column.Unique = true; // Add the Column to the DataColumnCollection. table.Columns.Add(column); // Create second column. column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "ParentItem"; column.AutoIncrement = false; column.Caption = "ParentItem"; column.ReadOnly = false; column.Unique = false; // Add the column to the table. table.Columns.Add(column); // Make the ID column the primary key column. DataColumn[] PrimaryKeyColumns = new DataColumn[1]; PrimaryKeyColumns[0] = table.Columns["id"]; table.PrimaryKey = PrimaryKeyColumns; // Create three new DataRow objects and add // them to the DataTable for (int i = 0; i <= 1000000; i++) { row = table.NewRow(); row["id"] = i; row["ParentItem"] = "ParentItem " + i; table.Rows.Add(row); } return table; } } 

Código del lado del cliente:

 static void Main(string[] args) { StudentIdentifier identifier = new StudentIdentifier(); identifier.Id = 100; StudentManagementClient client = new StudentManagementClient(); DataTable student = client.Poll(identifier); Console.WriteLine(student.Rows.Count); } 

Lado del cliente web.config:

    

EDIT 2:

Configuración de modo de transmisión para el lado del cliente app.config,

           

Servidor web.config para el modo de transmisión,

           

Puede jugar con una gran cantidad de tamaños de búfer; se mantienen bastante pequeños (64 K) de forma predeterminada para evitar ataques de denegación de servicio, pero si lo necesita, puede boostlos:

          

Eche un vistazo a la configuración “MaxBufferSize”, “MaxBufferPoolSize”, “MaxReceivedMessageSize” en el enlace, así como a las diversas configuraciones en la sección .

Intentaré simplemente boost el “MaxBufferSize” y el “MaxBufferPoolSize” primero y ver si eso solo ayuda. La mayoría de las otras configuraciones deberían estar más orientadas hacia el momento en que el servicio recibe y necesita procesar un mensaje.

No hay límites estrictos en cuanto a qué tan grande puede ser un objeto que se vuelva a serializar. Sin embargo, el DataTable conlleva una sobrecarga significativa, y si realmente no necesita esa funcionalidad del DataTable en el lado del cliente, también puede hacer una conversión en el servidor para enviar solo una colección o una lista genérica de objetos, en lugar de la Objeto DataTable de elevación pesada.

Además, si envía con frecuencia grandes cantidades de datos, es posible que también deba investigar las capacidades de transmisión de WCF (por ejemplo, si devuelve imágenes, videos, ese tipo de cosas). Bagazo

George, asegúrate de buscar en el registro de eventos cuando suceda algo así. Ver si WCF o cualquier otro componente ha registrado un error.

Además, intente activar el rastreo de WCF y ver si hay un error interno que no se esté registrando de alguna manera. Es posible que tenga que hacer un trazo detallado para poder verlo, pero eche un vistazo y vea qué hay allí.

El hecho de que reciba un error oscuro de IIS, no significa que no haya más y mejor información disponible en algún lugar. Después de todo, el mensaje de error decía: “Consulte los registros del servidor para obtener más detalles”.

Consulte el siguiente fragmento de código …

                   

Tal vez sea de ayuda para alguien.

Yo tenía el mismo error. Se resolvió estableciendo la propiedad MaxItemsInObjectGraph (a gran valor) en web.config del lado del servidor:

             

Lo obtuve de aquí: http://forums.asp.net/post/4948029.aspx