exportar dados do serviço WCF para Excel
-
26-09-2019 - |
Pergunta
Preciso fornecer uma exportação ao recurso Excel para uma grande quantidade de dados retornados de um serviço da Web WCF.
O código para carregar o datalist está abaixo:
List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl); //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();
Estou usando o objeto de resposta para fazer o trabalho:
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();
O problema é que o WCF Service Times Out para grande quantidade de dados (cerca de 5000 linhas) e o conjunto de resultados é nulo. Quando depurar o serviço, vejo a janela para salvar/abrir a planilha do Excel aparecer antes que o serviço retorne o resultado e, portanto, a planilha do Excel está sempre vazia. Por favor me ajude a descobrir isso.
Editado para adicionar - o iHttpmodule do site WCF usado para reescrever o URL está sendo chamado duas vezes ou três vezes. Isso poderia ser por causa de uma reciclagem aspnet_wp? Nesse caso, eu deveria estar vendo o erro no meu log de eventos de aplicativo, certo? Mas eu não. Por favor me ajude com este problema.
Aqui está o meu httpmodule personalizado: public class CustomHttpmodule: ihttpmodule {public void decart () {}
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);
}
};
}
}
Vejo que o Appln.authorizerequest é chamado duas vezes. Eu acho que é por isso que estou vendo o tempo de operação ou a exceção fechada da conexão. Como faço para impedir que isso faça isso duas vezes. Eu só crio um pedido.
Solução 2
A resposta de Tor me ajudou um pouco. Eu tive que definir o MaxItemsinObjectGraph como um valor mais alto para que essa exceção desapareça. No entanto, tive problemas para definir esse valor porque não o fiz como defini -lo e onde defini -lo.
este artigo Ajudou -me a entender mais sobre o serviço de descanso e aceleração do WCF. O que realmente funcionou para mim foi definir o ServiceBehavior atributo para minha aula de serviço.
[ServiceBehavior(MaxItemsInObjectGraph=2147483646)]
public abstract class MyService: IMyService
{blá ...}
Se você não estiver preocupado em ter que alterar o limite máximo repetidamente, poderá estar feliz em especificá -lo no código e se divertir ao ver tudo funcionando.
Outras dicas
Você encontrou um dos muitos tipos de tempo limite e limites do WCF/IIS. Este em particular pode ser maxReceivedMessagesize. O padrão é 64 kb. Configure isso na ligação do serviço.
Outros limites são (esses não são todos parâmetros vinculativos):
- MaxItemsinObjectGraph (65536)
- MaxRequestLength (4 MB)
- ExecutionTimeout (90 segundos)
- SendTimeout no cliente (10 minutos)