Pregunta

necesito para proporcionar una función de exportación a Excel para una gran cantidad de datos devueltos por un servicio WCF web.

El código para cargar la lista de datos es la siguiente:

List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl);  //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();

Estoy utilizando el objeto Reponse para hacer el trabajo:

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=MyExcel.xls");
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter tw = new HtmlTextWriter(sw);
myDataList.RenderControl(tw);
Response.Write(sb.ToString());
Response.End();

El problema es que los tiempos fuera de servicio WCF para la gran cantidad de datos (aproximadamente 5000 filas) y el conjunto de resultados es nulo. Cuando puedo depurar el servicio, puedo ver la ventana para guardar / abrir la hoja de Excel aparece antes de que el servicio devuelve el resultado y por lo tanto la hoja de Excel está siempre vacío. Por favor, ayúdame a resolver esto.

editar para agregar - IHttpModule del sitio WCF utiliza para volver a escribir la dirección URL que se llama dos veces o tres veces. Podría ser esto debido a un reciclaje aspnet_wp? En ese caso, que deberían mostrar el error en mi registro de sucesos, ¿verdad? Pero no es así. Por favor ayudame con este problema.

Aquí es mi costumbre HttpModule: CustomHttpModule clase pública: IHttpModule {     Desechar pública void () {}

public void Init(HttpApplication appln) 
{ 
    appln.AuthorizeRequest+= delegate 
    { 
        HttpContext tcontext= HttpContext.Current; 
        string path = tcontext.Request.AppRelativeCurrentExecutionFilePath; 

        int i = path.IndexOf('/', 2); 
        if (i > 0) 
        { 
            string svc = path.Substring(0, i) + ".svc"; 
            string fu = path.Substring(i, path.Length - i); 
            tcontext.RewritePath(svc, fu, tcontext.Request.QueryString.ToString(), false); 
        } 
    }; 
} 

}

veo que appln.AuthorizeRequest se llama dos veces. Creo que esto es por lo que estoy viendo el tiempo de funcionamiento a cabo o la excepción cerrado conexión. ¿Cómo puedo evitar que hacerlo dos veces. Yo sólo crean una petición.

¿Fue útil?

Solución 2

La respuesta de Tor me ayudó un poco. Tenía que establecer el MaxItemsInObjectGraph a un valor más alto para esta excepción se vaya. Sin embargo, he tenido problemas para configurar este valor, porque no lo hice cómo configurarlo y dónde ponerlo.

Este artículo me ayudó a entender más sobre el servicio de WCF El descanso y la estrangulación. Lo que realmente funcionó para mí estaba poniendo el atributo ServiceBehavior para mi clase de servicio.

[ServiceBehavior(MaxItemsInObjectGraph=2147483646)]
public abstract class MyService: IMyService

{      paja...    }

Si no está preocupado por tener que cambiar el límite máximo de una y otra, que podría ser feliz con la especificación de ella en el código y tener la diversión en ver todo de trabajo.

Otros consejos

le han acabado en uno de los muchos tipos de WCF / IIS tiempos de espera y límites. Este particular puede ser MaxReceivedMessageSize. Por defecto es de 64 KB. Configurar esto en el enlace de servicio.

Otros límites son (estos no son todos los parámetros de unión):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 MB)
  • executionTimeout (90 segundos)
  • SendTimeout en el cliente (10 minutos)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top