Vra

Ek het 'n BWF diens waaruit ek wil 'n DataTable terugkeer. Ek weet dat dit dikwels 'n hoogs-gedebatteer onderwerp, so ver as of terugkeer DataTables is 'n goeie praktyk. Kom ons sit dit eenkant vir 'n oomblik.

As ek 'n DataTable van nuuts af te skep, soos hieronder, daar is hoegenaamd geen probleme. Die tafel is geskep, wat gevul is, en teruggekeer na die kliënt, en alles in orde is:

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

Maar so gou as ek uitgaan en druk die databasis na die tafel te skep, soos hieronder, kry ek 'n CommunicationException "Die onderliggende verband gesluit. Die verbinding is onverwags gesluit"

[DataContract]
public DataTable GetTbl()
{
    DataTable tbl = new DataTable("testTbl");
    //Populate table with SQL query

    return tbl;
}

Die tafel word korrek bevolk op die bediener kant. Dit is aansienlik kleiner as die toets tafel wat ek haak deur en teruggegaan en die soektog is klein en vinnig - daar is geen probleem hier met outs of groot data-oordrag. Presies dieselfde funksies en DataContracts / Service Contracten / BehaviorContracts gebruik word.

Waarom sou die manier waarop die tafel word bevolk het 'n invloed op die tafel terugkeer suksesvol?

Was dit nuttig?

Oplossing

Vir iemand met soortgelyke probleme, het ek my saak opgelos. Dit was 'n hele paar-vou.

  • As Darren voorgestel en Paul gerugsteun, die Max..Size eiendomme in die opset moes word vergroot. Die SvcTraceViewer nut gehelp in die bepaling van hierdie, maar dit nog nie altyd die mees nuttige fout boodskappe gee.
  • Dit blyk ook dat wanneer die Diens verwys opgedateer op die kliënt kant, die opset sal soms nie behoorlik werk (bv verandering config waardes op die bediener sal nie altyd behoorlik werk op die kliënt. Ek moes in gaan en verander die Max..Size eienskappe meer as een keer op beide die kliënt en bediener kante in die loop van my debugging)
  • Vir 'n DataTable om serialiseerbaar wees, dit moet 'n naam gegee. Die verstek konstruktor gee nie die tafel 'n naam, so:

    return new DataTable();
    

    sal nie serialiseerbaar wees, terwyl:

    return new DataTable("someName");
    

    sal die tafel wat ook al as die parameter is verby te noem.

    Let daarop dat 'n tafel kan gegee word 'n naam te eniger tyd deur die toeken van 'n string om die TableName eiendom van die DataTable.

    var table = new DataTable();
    table.TableName = "someName";
    

Hopelik dat iemand sal help.

Ander wenke

Die beste manier om hierdie soort van WCF foute (die een wat regtig jy nie veel weet vertel) diagnoseer is om in staat te stel opsporing. In jou Web.config lêer, voeg die volgende:

  <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>

Jy kan dan open die lêer in die SvcTraceViewer.exe nut wat kom in die NET Framework SDK (of met Visual Studio). Op my masjien, kan dit gevind word by% program files% \ Microsoft SDK \ Windows \ v6.0A \ Bin \ SvcTraceViewer.exe.

Kyk net vir 'n fout boodskap (in vet rooi) en dit sal vir jou sê spesifiek wat jou probleem is.

Ek het ook die Datable om 'n datastel en teruggekeer die tafel soos so ...

DataTable result = new DataTable("result");

//linq to populate the table

Dataset ds = new DataSet();
ds.Tables.Add(result);
return ds.Tables[0];

Hoop dit help :)

Anders as die opstel van maksimum waardes vir alle bindend eienskappe.

Maak seker dat elke tabel wat jy is verby / haar terugkeer uit webservice moet 'n tafel naam het, wat beteken dat die eiendom table.tablename moet nie leeg wees nie.

Die kenmerk wat jy wil hê, is OperationContract (op koppelvlak) / Operation Gedrag (op metode):

[ServiceContract]
public interface ITableProvider
{
    [OperationContract]
    DataTable GetTbl();
}


[OperationBehavior]
public DataTable GetTbl(){
    DataTable tbl = new DataTable("testTbl");
    //Populate table with SQL query

    return tbl;
}

Ook in die ... Ek dink diens opset ... jy wil spesifiseer wat foute kan gestuur word. Jy kan slaan 'n fout wat iets soos die boodskap grootte is te groot, ens Jy kan regmaak wat deur fudging met die leser kwotas en so.

Deur verstek wsHttpBinding het 'n grootte ontvang kwota soos 65 KB, so as XML die serialized data tafel is meer as dit, sou dit 'n fout te gooi (en ek is 95% seker die datatabel is meer as 65 KB met data in dit).

Jy kan die instellings vir die leser kwotas en so in die web.config / app.config verander of jy kan dit op 'n bindende byvoorbeeld in kode. Maar ja, dit is waarskynlik wat jou probleem is, as jy dit nie verander het by verstek.

WSHttpBindingBase Lede - Kyk na ReaderQuotas eiendom sowel as die eiendom MaxReceivedMessageSize

.

Jy het waarskynlik blaas jou kwota -. Die datatable is groter as die toegelate maksimum grootte pakkie vir jou verbinding

Jy moet waarskynlik te stel MaxReceivedMessageSize en MaxBufferSize om hoër waardes op jou verband.

Daar is 3 rede vir mislukte terugkeer tipe as datatable in WCF dienste

  • Jy moet datatabel naam soos spesifiseer:

    MyTable=new DataTable("tableName");
    
  • As jy die toevoeging van verwysing op die kliënt kant van WCF diens kies herbruikbare dll system.data

  • Spesifiseer kenmerk op datatable lid veranderlike soos

    [DataMember]
    public DataTable MyTable{ get; set; }
    

Ek dink Darren is waarskynlik korrek - die standaard waardes waarvoor BWF is laughably klein en as jy stamp in hulle beland jy met foute wat moeilik is om op te spoor kan wees. Hulle lyk te verskyn sodra jy probeer om enigiets verder as 'n eenvoudige toets geval doen. Ek vermors meer tyd as wat ek wil erken debugging probleme wat blyk te wees wat verband hou met die verskillende verstellings (grootte) instellings op beide die kliënt en bediener. Ek dink ek het uiteindelik verander byna almal van hulle, bv. MaxBufferPoolSize, MaxBufferSize, MaxConnections, MaxReceivedMessageSize, ens

Noudat dit gesê is, die SvcTraceViewer nut ook genoem is groot. Ek het loop in 'n paar gevalle waar dit nie was as nuttig as ek sou wou hê, maar dit algeheel is 'n lekker hulpmiddel vir die ontleding van die kommunikasie vloei en foute.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top