我开始使用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服务(点击播放)时,我的测试应用程序现在显示我看到的服务:
如何才能使用数据?
编辑#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>
答案 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())