2017-04-06 4 views
0

Ich fange an, WCF zu verwenden, um einen Webdienst anstelle der alten asp.net asmx-Möglichkeit zu schreiben. Ich möchte JSON zurückgeben können, damit ich es nicht auf die alte Art machen kann. Wenn ich eine Zeichenkette oder int zurückschicke, funktioniert der Web Service gut, aber wenn ich versuche, eine DataTable zurückzugeben, reagiert sie nicht mehr und ich bekomme nichts. Ich habe versucht zu debuggen, um zu sehen, wo es explodiert und es wird nicht einmal an einem Haltepunkt anhalten.WCF-WebService, das DataTable nicht zurückgibt

My Class-Datei sieht wie folgt aus:

[OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "xml/{id}")] 
    string XMLData(string id); 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "json/{id}")] 
    string JSONData(string id); 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "testdt/")] 
    DataTable TestDT(); 

Die json Verfahren sowie die xml Methode funktioniert völlig in Ordnung:

public string XMLData(string id) 
    { 
     return "You requested " + id; 
    } 


    public string JSONData(string id) 
    { 
     return "You requested " + id; 
    } 

    public DataTable TestDT() 
    { 
     DataTable Testing = new DataTable("TestDT"); 

     return Testing; 
    } 

Meine Interface-Datei sieht wie folgt aus. Wenn ich TestDT anrufe, bekomme ich eine Standard-IE-Seite, die keine Verbindung anzeigt. Ich habe es mit Daten oder ohne Daten in der Datei mit den gleichen Ergebnissen versucht.

Ein weiterer Hinweis hier: wenn ich den WCF-Dienst lokal (Schlagen PLAY) meine Testanwendung ausführen zeigt nun Dienste, die ich sehe:

enter image description here

Wie kann ich dies mit einem datierbaren zu arbeiten?

Bearbeiten # 1: Ich löste das Problem mit den Daten nicht zurück. Ich habe es schließlich aufgegeben, einen Datensatz zurückzusenden, und stattdessen habe ich ein gezacktes Array erstellt und es als JSON zurückgegeben. Ich werde es später als Antwort veröffentlichen, damit die Leute wissen, wie ich es gemacht habe. Was ich jetzt mehr wissen möchte, ist Teil 2. Warum zeigt mein WCF-Test-Client keine Methoden an? (Siehe Bild beigefügt) Meine Vermutung bezieht sich auf die web.config, also poste ich das unten:

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
    <add name="DBDjuggleWS" connectionString="Data Source=localhost;Initial Catalog=PrayUpDev;Persist Security Info=True;User=DjuggleMaster;Password=DJPassword!" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name ="PrayUpService.PrayUp" behaviorConfiguration="ServiceBehaviour"> 
     <endpoint address="" binding="webHttpBinding" contract="PrayUpService.IPrayUp" behaviorConfiguration ="web"></endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehaviour"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 
+0

Überlegen Sie, ob Sie mit Datenvertrag zurückkehren. Wenn nur eine Spalte mit mehreren Zeilen vorhanden ist, können Sie eine Rückgabe als Liste (Zeichenfolge) in Erwägung ziehen. – Baskar

+0

Mögliches Duplikat von [Rückgabe von DataTables in WCF/.NET] (http://stackoverflow.com/questions/12702/returning-datatables-in-wcf-net) – tomcater

Antwort

0

Sie sollten DataSet anstelle von DataTable zurückgeben, aber das Zurückgeben von Datensätzen aus Webdiensten wird normalerweise nicht als "gute Praxis" betrachtet. hier kann man darüber lesen: Why returning dataset or data table from WCF service is not a good practice? What are the Alternatives?

ich sehr empfehlen die DataSet’s Methoden verwenden, um die Daten im XML-Format zu erhalten und die XML-Zeichenfolge anstelle des DataSet sich an den Dienst übergeben.

PassDataSet(dsDataSet.GetXmlSchema(), dsDataSet.GetXml()) 
Verwandte Themen