WCF WebService不返回DataTable

时间:2017-04-06 12:08:24

标签: wcf datatable wcftestclient

我开始使用WCF编写Web服务而不是旧的asp.net asmx方式。我希望能够返回JSON,所以我不能用旧的方式来做。如果我返回一个字符串或int,Web服务工作正常,但如果我尝试返回一个DataTable它变得没有响应,我什么也得不到。我已经尝试过调试以查看它在哪里爆炸,它甚至不会在断点处停止。

我的类文件如下所示:

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

我的界面文件如下所示:

    [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();

json方法以及xml方法完美无缺。当我调用TestDT时,我得到一个标准的IE页面,显示没有连接。我已尝试使用数据或数据中没有数据,但结果相同。

另一个注意:当我在本地运行WCF服务(点击播放)时,我的测试应用程序现在显示我看到的服务:

enter image description here

如何才能使用数据?

编辑#1:我实际上解决了数据未返回的问题。我最终放弃了尝试返回数据集,而是创建了一个锯齿状数组,最后将其作为JSON返回。我稍后会将其发布作为答案,以便人们知道我是如何做到的。我现在更感兴趣的是第2部分。为什么我的WCF测试客户端没有显示任何方法(参见附图)我的预感与web.config有关,所以我在下面发布:

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

1 个答案:

答案 0 :(得分:0)

您应该返回DataSet而不是DataTable但是从Web服务返回数据集通常不被视为“良好做法”。在这里你可以阅读它: Why returning dataset or data table from WCF service is not a good practice? What are the Alternatives?

我强烈建议使用DataSet’s方法以XML格式获取数据,并将XML字符串而不是DataSet本身传递给服务。

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