datos de exportación de servicio WCF para Excel
-
26-09-2019 - |
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.
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)