Вопрос

Мне нужно предоставить экспорт в функцию 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 минут)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top