반 DataTables WCF/.NET
-
08-06-2019 - |
문제
가 WCF 서비스에서는 돌아가려면 DataTable.저는 이것은 종종 높은 토론,주제로까지 여부 또는 반환하지 않 DataTables 이하로 유지하는 것이 좋습니다.을 넣어 보자는 따습니다.
를 만들 때 DataTable,처음부터 아래와 같이,문제가 없습니다.테이블이 생성 채워지고,클라이언트에게 보내는 모든 것이 잘:
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
for(int i=0;i<100;i++)
{
tbl.Columns.Add(i);
tbl.Rows.Add(new string[]{"testValue"});
}
return tbl;
}
그러나,빨리 나가고 데이터베이스에 테이블을 만들려면,아래로,나는 CommunicationException"기본 연결이 끊어졌습니다:의 예기치 않게 연결이 닫혔습니다."
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
테이블이가 올바르게 채워지 서버 사이드에서 작동합니다.그것보다 훨씬 작 테스트는 테이블이 나를 통해 반복하고 반환하며,쿼리가 작고 빠르게 아무 문제가 없으로 여기에 시간 제한 또는 큰 데이터 전송을 지원합니다.동일한 기능과 정확한 DataContracts/ServiceContracts/BehaviorContracts 사용되고 있습니다.
왜는 방법으로 테이블 채워지고 있는 모든 베어링 테이블에 돌아 성공적으로?
해결책
누구나 비슷한 문제가 해결이 내 문제입니다.그것은 여러 배입니다.
- 으로 대런 제안 및 폴 백업,Max..크기에서 속성을 구성하는 데 필요한 확대됩니다.이 SvcTraceViewer 유틸리티에 도움이 결정이지만,그것은 여전히지 않게 가장 유용한 오류 메시지입니다.
- 그것도 나타나는 경우 서비스에 참조 업데이트 클라이언트 측에서,구성이 때때로이 올바르게 업데이트(예를들면변화하는 config 값이 서버가 항상 올바르게 업데이트에서 클라이언트입니다.나는 가야했다 변경 Max..크기 속성에 여러 번을 클라이언트와 서버 측의 과정에서 나는 디버깅)
에 대한 DataTable 하는 직렬화 될 필요가 주어진 이름입니다.기본 생성자를 제공하지 않습 테이블의 이름은,그래서:
return new DataTable();
되지 않는 직렬화면:
return new DataTable("someName");
이름을 것입니다 테이블에 무엇이로 전달된 매개 변수입니다.
참고 테이블 주어질 수 있는 언제든지 이름을 지정하여 문자열을
TableName
시설의 DataTable.var table = new DataTable(); table.TableName = "someName";
희망하는 데 도움이 될 것입니다.
다른 팁
을 진단하는 가장 좋은 방법은 이러한 종류의 WCF 오류(는 사람은 정말 당신을 말하지 않은)사용하고 추적을 설정합니다.에서 당신의 웹입니다.config 파일에 다음을 추가합니다:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information"
propagateActivity="true">
<listeners>
<add name="ServiceModelTraceListener"
type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
initializeData="wcf-traces.svclog"/>
</listeners>
</source>
</sources>
</system.diagnostics>
할 수 있습니다 다음을 열고 그 결과에서 파일 SvcTraceViewer.exe 유틸리티를 제공.NET Framework SDK(또는 Visual Studio).내 컴퓨터에서,그것은에서 찾을 수 있습니다십시 Microsoft SDKs\Windows\v6.0A\Bin\SvcTraceViewer.exe.
한 오류 메시지(굵은 붉은)및 당신을 말할 것이다 구체적으로 어떤 문제입니다.
추가 시일을 데이터로 설정 및 반환되는 테이블처럼 이렇게...
DataTable result = new DataTable("result");
//linq to populate the table
Dataset ds = new DataSet();
ds.Tables.Add(result);
return ds.Tables[0];
그것을 희망하는 데 도움이 :)
이외의 다른 설정 최대값에 대한 모든 속성을 결합.
지 확인하는 각 테이블을 전달하고 있/에서 돌아오는 웹 서비스에 테이블이 있어야합 이름을 의미하는 table.tablename
제공하지 않아야 공백입니다.
특성 당신이 원하는 OperationContract(에서 인터페이스)/작업 동작(방법):
[ServiceContract]
public interface ITableProvider
{
[OperationContract]
DataTable GetTbl();
}
[OperationBehavior]
public DataTable GetTbl(){
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
또한,에서...내가 생각하는 서비스를 구성...지정하려면 원하는 오류를 보낼 수 있습니다.수도 있습을 치는 오류를 무언가가 다음과 같은 메시지 크기가 큰,etc.당신이 해결할 수 있는 것으로 꾸며 독자량 및니다.
기본적으로 wsHttpBinding 는 받는 크기 할당량의 65KB 면,그래서 직렬화된 데이터는 XML 테이블의보다 더 많은 것,그것을 던져 오류가(그리고 내가 95%확실한 데이터를 테이블보다 더 65KB 데이터에서는다).
설정을 변경할 수 있습에 대한 할당량 및 리더 등에서 web.config
/ app.config
또는 당신은 설정할 수 있습니다 바인딩에 대한 인스턴스에서 코드입니다.하지만 그래,그건 아마도 어떤 당신의 문제가,변경하지 않았다면 그것은 기본적으로 합니다.
WSHttpBindingBase 원 -보 ReaderQuotas 는 시설뿐만 아니라다 제공합니다.
당신은 아마 불량-datatable 보다 큰 허용되는 최대 패킷에 대한 크기의 연결입니다.
당신은 아마 설정해야 다 고 MaxBufferSize 더 높은 값에 연결합니다.
3 에게 이 실패 반환 유형 datatable
WCF 서비스
당신은 데이터를 지정하는 테이블과 같은 이름:
MyTable=new DataTable("tableName");
를 추가하는 경우에는 클라이언트 측의 WCF 서비스를 선택합 재사용할 수 있는 dll
system.data
지정 특성
datatable
회원과 같은 변수[DataMember] public DataTable MyTable{ get; set; }
내가 생각하는 대런 가능성이 높정-제공하는 기본값 WCF 은 우습게 작고 부딪히면 그들을 끝까지와는 오류를 추적하기가 어려울 수 있습니다.그들은 나타나는 것이 곧 당신이 시도하기도 간단한 테스트 케이스.나는 더 많은 시간을 낭비하다 나 같은 인정하는 문제를 디버깅하는 것으로 밝혀졌다에 관련된 다양한 구성(size)설정에서 클라이언트와 서버입니다.내 생각에 나는 수정의 거의 모든 그들의,ex.MaxBufferPoolSize,MaxBufferSize,MaxConnections 니다,등등.
즉,SvcTraceViewer 유틸리티는 또한 언급은 좋은 것입니다.았으로 실행하고 몇 가지는 경우 그것은 없으로 도움이로 난 좋아했지만,전반적으로 좋은 도구에 대한 분석을 통한 흐름과 오류가 있습니다.