экспортировать данные из службы WCF в Excel - PullRequest
2 голосов
/ 10 июня 2010

Мне нужно предоставить функцию экспорта в excel для большого количества данных, возвращаемых веб-службой WCF.

Код для загрузки списка данных выглядит следующим образом:

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

Я использую объект Reponse для выполнения работы:

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();

Проблема в том, что WCFСрок службы истекает для большого объема данных (около 5000 строк), и результирующий набор равен нулю.Когда я отлаживаю сервис, я вижу окно для сохранения / открытия листа Excel, прежде чем сервис вернет результат, и, следовательно, лист Excel всегда будет пустым.Пожалуйста, помогите мне понять это.

EDITED TO ADD - IHttpModule сайта WCF, используемый для перезаписи URL, вызывается дважды или трижды.Может ли это быть из-за перезапуска aspnet_wp?В этом случае я должен увидеть ошибку в журнале событий приложений, верно?Но я неПожалуйста, помогите мне с этим вопросом.

Вот мой пользовательский HttpModule: открытый класс CustomHttpModule: IHttpModule {public void Dispose () {}

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); 
        } 
    }; 
} 

}

Я вижу, что appln.AuthorizeRequest вызывается дважды,Я думаю, именно поэтому я вижу, что истекло время ожидания операции или соединение закрыто.Как мне помешать это сделать дважды?Я создаю только один запрос.

Ответы [ 2 ]

1 голос
/ 12 июня 2010

Вы столкнулись с одним из многих видов тайм-аутов и ограничений WCF / IIS. Этот конкретный может быть MaxReceivedMessageSize. По умолчанию 64 КБ. Настройте это для привязки службы.

Другие ограничения (это не все параметры привязки):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 МБ)
  • ExecuteTimeout (90 секунд)
  • sendTimeout на клиенте (10 минут)
0 голосов
/ 17 июня 2010

Ответ Тор немного мне помог.Я должен был установить для MaxItemsInObjectGraph более высокое значение, чтобы исключить это исключение.Однако у меня были проблемы с установкой этого значения, потому что я не знал, как его установить и где его установить.

Эта статья помогла мне понять больше о службе WCF Rest и регулировании.Что для меня действительно работало, так это установка атрибута ServiceBehavior для моего класса обслуживания.

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

{бла ...}

Если вас не беспокоит наличиечтобы изменять максимальный лимит снова и снова, вы можете быть довольны указанием его в коде и получать удовольствие, наблюдая, как все это работает.

...