gor*_*ric 50 .net c# datatable wcf web-services
我有一个WCF服务,我想从中返回一个DataTable.我知道这往往是一个备受争议的话题,至于返回DataTables是否是一个好习惯.让我们暂时搁置一下.
当我从头开始创建DataTable时,如下所示,没有任何问题.该表已创建,填充并返回给客户端,一切都很好:
[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;
}
Run Code Online (Sandbox Code Playgroud)
但是,只要我出去打开数据库来创建表,如下所示,我得到一个CommunicationException"底层连接已关闭:连接意外关闭."
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
Run Code Online (Sandbox Code Playgroud)
该表正在服务器端正确填充.它比我循环并返回的测试表要小得多,并且查询小而快 - 这里没有超时或大数据传输的问题.正在使用相同的功能和DataContracts/ServiceContracts/BehaviorContracts.
为什么填充表的方式对表成功返回有什么影响?
gor*_*ric 82
对于有类似问题的人,我已经解决了我的问题.这是几倍.
要使DataTable可序列化,需要为其指定名称.默认构造函数不为表提供名称,因此:
return new DataTable();
Run Code Online (Sandbox Code Playgroud)
不可序列化,而:
return new DataTable("someName");
Run Code Online (Sandbox Code Playgroud)
将表格命名为参数传递的任何内容.
请注意,通过将字符串分配给TableNameDataTable 的属性,可以随时为表指定名称.
var table = new DataTable();
table.TableName = "someName";
Run Code Online (Sandbox Code Playgroud)希望这会对某人有所帮助.
Chr*_*lum 15
诊断这些类型的WCF错误(那些真的没有告诉你的错误)的最好方法是启用跟踪.在web.config文件中,添加以下内容:
<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>
Run Code Online (Sandbox Code Playgroud)
然后,您可以在.NET Framework SDK(或Visual Studio)中的SvcTraceViewer.exe实用程序中打开生成的文件.在我的机器上,它可以在%PROGRAMFILES%\ Microsoft SDKs\Windows\v6.0A\Bin\SvcTraceViewer.exe中找到.
只需查找错误消息(以粗体显示红色),这将告诉您具体的问题.
我将Datable添加到数据集并返回表格,如此...
DataTable result = new DataTable("result");
//linq to populate the table
Dataset ds = new DataSet();
ds.Tables.Add(result);
return ds.Tables[0];
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 :)
| 归档时间: |
|
| 查看次数: |
52661 次 |
| 最近记录: |