Po návratu DataTables v WCF / .NET

hlasů
45

Mám WCF službu, ze kterého chci vrátit DataTable. Vím, že je to často velmi diskutované téma, pokud jde o tom, zda se vrátí DataTables Je dobrým zvykem. Nechme to stranou na chvíli.

Když jsem se vytvořit DataTable od nuly, jak je uvedeno níže, nevznikne vůbec žádné problémy. vytvoření tabulky, osídlené, a vrátil se ke klientovi, a všechno je v pořádku:

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

Nicméně, jakmile jsem jít ven a narazí na databázi vytvořit tabulku, jak je uvedeno níže, jsem si CommunicationException „Nadřízené připojení bylo uzavřeno:. Připojení bylo neočekávaně uzavřeno“

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

    return tbl;
}

V tabulce je naplněna správně na straně serveru. To je podstatně menší než zkušební tabulce I prosmyčkovat a vrátil se a dotaz je malý a rychlý - není tam žádný problém zde časové limity nebo velký přenos dat. Stejné přesné funkce a DataContracts / ServiceContracts / BehaviorContracts jsou používány.

Proč by se tak, že tabulka je naplněn mít žádný vliv na stole úspěšně vrací?

Položena 15/08/2008 v 21:26
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
76

Pro každého, kdo má podobné problémy, jsem vyřešit můj problém. Bylo to několik-násobně.

  • Jako Darren navrhl a Paul zálohovány, vlastnosti Max..Size v konfiguraci bylo třeba zvětšit. Nástroj SvcTraceViewer pomáhal při určování toho, ale to ještě ne vždy dávají nejvíce užitečné chybové zprávy.
  • Rovněž se zdá, že když služba Reference je aktualizován na straně klienta, konfigurace se někdy není správně aktualizovat (např Změna konfigurační hodnoty na serveru nebude vždy správně aktualizovat na straně klienta. Musel jsem jít a změnit Max .. Velikost reality několikrát na obou stranách klienta a serveru v průběhu mé ladění)
  • Pro DataTable za serializovatelný, je třeba dát jméno. Výchozí konstruktor nedává stole jméno, takže:

    return new DataTable();
    

    Nebude serializable, zatímco:

    return new DataTable("someName");
    

    bude název tabulky, co je předán jako parametr.

    Všimněte si, že tabulka může být pojmenována kdykoli přiřazením řetězec do TableNamemajetku DataTable.

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

Doufejme, že pomůže někdo.

Odpovězeno 03/09/2008 v 20:14
zdroj uživatelem

hlasů
14

Nejlepším způsobem, jak diagnostikovat tyto druhy chyb WCF (ty, které opravdu nemají říct moc) je umožnit sledování. V souboru web.config, přidejte následující:

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

Potom můžete otevřít výsledný soubor v nástroji SvcTraceViewer.exe která přichází v .NET Framework SDK (nebo s Visual Studio). Na mém počítači, lze nalézt na adrese% ProgramFiles% \ Microsoft SDK \ Windows \ v6.0A \ Bin \ SvcTraceViewer.exe.

Stačí se podívat na chybové hlášení (tučně červeně), a že vám řekne, co konkrétně je váš problém.

Odpovězeno 23/08/2008 v 19:56
zdroj uživatelem

hlasů
5

přidal jsem datována do období sadě dat a vrací tabulku tak jako ...

DataTable result = new DataTable("result");

//linq to populate the table

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

Doufám, že to pomůže :)

Odpovězeno 24/10/2011 v 09:29
zdroj uživatelem

hlasů
5

Jiné než stanoví maximální hodnoty pro všechny závazné atributy.

Ujistěte se, že každá tabulka jsou předávání / návratu z webové služby, musí mít název tabulky, což znamená, že table.tablenamemajetek by neměl být prázdný.

Odpovězeno 21/12/2010 v 14:33
zdroj uživatelem

hlasů
3

Atribut, který chcete je OperationContract (na rozhraní) / Operation chování (na metodě):

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


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

    return tbl;
}

Také v konfiguraci ... Myslím, že servisní ... Chcete-li určit, že chyby mohou být zaslány. Ty by mohly být bít chybu, která je něco jako velikosti zprávy je velký, atd. Lze opravit, že překrucování se čtečkou kvótami a podobně.

Ve výchozím nastavení wsHttpBinding má velikost pro přijetí kvótu jako je 65 kB, takže pokud XML serializované datové tabulky je více než to, že by se to hodit chybu (je mi 95%, zda je tabulka dat je větší než 65 KB s údaji v něm ).

Můžete změnit nastavení pro čtenáře kvót a tak v web.config/ app.config, nebo si můžete nastavit na závazném Například v kódu. Ale jo, to je pravděpodobně to, co je váš problém, pokud jste nezměnili to ve výchozím nastavení.

WSHttpBindingBase Members - Podívejte se na pozemku ReaderQuotas stejně jako vlastnost MaxReceivedMessageSize.

Odpovězeno 15/08/2008 v 21:35
zdroj uživatelem

hlasů
2

Pravděpodobně jste vyhodil svoji kvótu - DataTable je větší než povolená maximální velikost paketu pro připojení.

Pravděpodobně budete muset nastavit MaxReceivedMessageSize a MaxBufferSize na vyšší hodnoty na vašem připojení.

Odpovězeno 24/10/2008 v 14:33
zdroj uživatelem

hlasů
1

K dispozici jsou 3 důvodem neúspěšného návratový typ jako datatableslužby WCF

  • Musíte zadat název tabulky dat, jako jsou:

    MyTable=new DataTable("tableName");
    
  • Při přidávání odkaz na straně klienta služby WCF vybrat k opakovanému použití dll system.data

  • Specifikovat atribut datatablečlenské proměnné, jako je

    [DataMember]
    public DataTable MyTable{ get; set; }
    
Odpovězeno 02/12/2016 v 05:14
zdroj uživatelem

hlasů
0

Myslím, že Darren je s největší pravděpodobností správný - výchozí hodnoty stanovené WCF jsou směšně malé a pokud narazíte na nich můžete skončit s chybami, které mohou být obtížné vystopovat. Zdá se, že se objeví, jakmile se pokusíte udělat něco nad rámec jednoduchého testovacího případu. plýtvání víc času, než bych chtěl připustit dohledávání problémů, které se ukázaly být ve vztahu k různým konfiguraci nastavení (velikost) na klienta i serveru. Myslím, že jsem skončil úpravou téměř všichni, ex. MaxBufferPoolSize, MaxBufferSize, MaxConnections, MaxReceivedMessageSize, atd.

Který uvedl, že nástroj SvcTraceViewer rovněž zmínil, je skvělý. Já jsem běžet do několika málo případech, kdy není tak užitečné, jak bych si přál, ale celkově je to pěkný nástroj pro analýzu průtoku a chyby komunikace.

Odpovězeno 02/09/2008 v 15:18
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more