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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top