2010-06-09 2 views
2

WCF 웹 서비스에서 반환되는 많은 양의 데이터에 대해 Excel로 내보내기 기능을 제공해야합니다. WCF 서비스에서 데이터를 내보내 excel

DataList에로드하는 코드

은 다음과 같습니다 :

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

내가 작업 할 리스폰스 객체를 사용하고 있습니다 :

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 ADDED - URL 재 작성에 사용되는 WCF 사이트의 IHttpModule이 두 번 또는 세 번 호출됩니다. 이것은 aspnet_wp 재활용 때문일 수 있습니까? 이 경우 응용 프로그램 이벤트 로그에 오류가 표시되어야합니다. 하지만 나는 그렇지 않습니다. 이 문제를 도와주세요. 공용 클래스 CustomHttpModule :

여기 내 사용자 지정 HttpModule을 것입니다 IHttpModule { 공공 무효 처분() {}

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가 두 번 호출되는 것을 알 수있다. 이것이 내가 작업 시간 초과 또는 연결이 예외로 표시되는 이유입니다. 어떻게 두 번이나 그것을 멈추게합니까? 나는 오직 하나의 요청만을 만든다.

답변

0

Tor의 반응이 나에게 조금 도움이되었습니다. 이 예외에 대한 MaxItemsInObjectGraph를 더 높은 값으로 설정해야했습니다. 그러나이 값을 설정하는 방법과 위치를 설정하지 않았기 때문에이 값을 설정하는 데 문제가있었습니다.

article은 WCF 휴식 서비스 및 제한에 대해 더 잘 이해할 수 있도록 도와줍니다. 실제로 나를 위해 일한 것은 서비스 클래스에 대한 ServiceBehavior 속성을 설정하는 것이 었습니다.

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

{ 어쩌구는 ... } 당신이 반복 최대 제한을 변경하는 데 대해 우려하지 않는 경우

, 당신은 코드에서 지정과 행복과 재미를 가질 수있다 모든 일을 볼 수 있습니다.

1

많은 종류의 WCF/IIS 시간 초과 및 제한 중 하나를 실행했습니다. 이 특별한 것은 MaxReceivedMessageSize 일 수 있습니다. 기본값은 64KB입니다. 이 바인딩을 서비스 바인딩에 구성하십시오.

기타 제한 (이 모든 바인딩 매개 변수 없음)입니다

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength의 (4 MB)
  • executionTimeout에로 (90 초)으로 클라이언트에
  • sendTimeout (10 분)
+0

"기본 연결이 종료되었습니다."예외가 발생합니다. 이것은 REST WCFservice이므로 HttpRequest에 대한 시간 제한을 변경해야했습니다.이상한 일은 요청 호출이 단 한 번만 이루어 지지만이 예외가 발생할 때까지 서비스 메소드가 두 번 또는 세 번 실행됩니다. 나는 왜 이것이 일어나고 있는지 이해하지 못한다. KeepAlive를 false로 설정해도 데이터가 반환 될 때까지 요청 호출이 연결 상태를 유지한다고 생각하기 때문에. 이는 대용량 데이터를 내보낼 때만 발생합니다. 해결 방법이있을 수 있지만 해결 방법을 알고 기존 문제를 해결하는 방법을 알고 싶습니다. – Dave

+0

내 질문을 편집했습니다. 전체 데이터를 내보낼 때 IHttpModule의 init은 두 번 또는 세 번 호출됩니다. 데이터가 비교적 적은 경우에는 발생하지 않습니다. 이 aspnet_wp 재활용 수 있습니다. 그렇다면 어떻게 수정해야합니까? – Dave

관련 문제