Экспорт данных из службы WCF в Excel
-
26-09-2019 - |
Вопрос
Мне нужно предоставить экспорт в функцию Excel для большого количества данных, возвращаемых из веб-службы WCF.
Код для загрузки DataList так, как показано ниже:
List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl); //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();
Я использую объект DevOss, чтобы сделать работу:
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 строк), а набор результатов NULL. Когда я отладку службы, я могу видеть окно для сохранения / открытия листа Excel, прежде чем служба возвращает результат, и, следовательно, лист Excel всегда пусто. Пожалуйста, помогите мне понять это.
Отредактировано для добавления - 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);
}
};
}
}
Я вижу, что Applen.authorizerequest называется дважды. Я думаю, что именно поэтому я вижу операционную тайм или закрытое исключение. Как мне остановить это, чтобы сделать это дважды. Я только создаю один запрос.
Решение 2
Ответ Тор помог мне немного. Я должен был установить максимумнообязань для более высокого значения для этого исключения, чтобы уйти. Тем не менее, у меня были проблемы с установкой этой ценности, потому что я не работал его и где его установить.
Этот статья Помогли мне понять больше о WCF отдыха и дросселирования. Что на самом деле работал для меня, устанавливал ServiceBehavior. атрибут моего класса обслуживания.
[ServiceBehavior(MaxItemsInObjectGraph=2147483646)]
public abstract class MyService: IMyService
{бла ...}
Если вы не обеспокоены необходимостью изменить максимальный лимит снова и снова, вы можете быть довольны указанием его в коде и иметь веселье, чтобы увидеть все это работает.
Другие советы
Вы столкнулись с одним из многих видов тайм-аутов WCF / IIS. Этот конкретный может быть максимально оценен. По умолчанию 64 КБ. Настройте это на привязку сервиса.
Другие ограничения (это не все параметры связывания):
- Maxitemsinobjectgraph (65536)
- MaxRequestLength (4 МБ)
- ExecutionTimeout (90 секунд)
- Sendimeout на клиенте (10 минут)