wcf サービスからデータテーブルを返そうとしています。私はサービスを書きました。そのためのコードは以下のとおりです
[WebInvoke(Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "TableData")]
public DataTable GetData(Parameters param)
{
try
{
var Id = int.Parse(param.Id);
var tableName = param.TableName;
var listSelectCol = new ArrayList();
bool bFirst = true;
var sSelectColList = new StringBuilder();
var Query ="";
var List = from TableEntity in _TableEntityRepository.AsQueryable()
join ColumnEntity in _ColumnEntityRepository.AsQueryable() on TableEntity.Id equals ColumnEntity.Id
where sysTableEntity.TableName.Equals(tableName)
select ColumnEntity.Name;
foreach (var x in List
{
if (bFirst)
bFirst = false;
else
sSelectColList.Append(", ");
sSelectColList.Append("t." + x.ToString(CultureInfo.InvariantCulture));
listSelectCol.Add(x.ToString(CultureInfo.InvariantCulture));
}
Query =
"select " + sSelectColList + " , t.Name as MyName from " + tableName +
" t Where t.Id = " + Id;
var cmdQuery = new SqlCommand(Query, new SqlConnection(ConfigurationManager.AppSettings.Get("connectionString")));
var sdaQuery = new SqlDataAdapter(cmdQuery);
var diffTableFrom = new DiffTable();
var colValues = new DataColumn("ColValues", typeof(System.String));
var dt = new DataTable();
dt.Columns.Add(colValues);
sdaQuery.Fill(dt);
diffTableFrom.ReturnDiffTable = dt;
foreach (DataRow row1 in dt.Rows)
{
foreach (string i in listSelectCol)
{
row1["ColValues"] = row1["ColValues"] + row1[i].ToString() + ",";
}
row1["ColValues"] = row1["ColValues"].ToString().Remove(row1["ColValues"].ToString().Length - 1);
}
return dt;
}
catch (Exception e)
{
throw new WebFaultException<string>(
string.Format(
"{0}{1}",
e.Message, (e.InnerException != null ? e.InnerException.Message : string.Empty)), HttpStatusCode.BadRequest);
}
}
DiffTable のクラスは
public class DiffTable
{
public DataTable ReturnDiffTable {get;set;}
}
ビューモデルからの呼び出しのコードは
function loadData(id, tablename) {
debugger;
var input =
{
TableName: tableName,
Id: id
};
return $.ajax({
url: "../Service/TableData",
type: "PUT",
contentType: 'application/json',
processData: false,
data: JSON.stringify(input),
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
},
success: function (allData) {
var mappedData = $.map(allData, function (item) {
return new TableChangesDetail(item);
});
self.TableChangesDetailList(mappedData);
}
});
}
ajaxを使用してビューモデルからこのサービスを呼び出そうとすると、フィドラーでエラーが発生します[Fiddler] ReadResponse() failed: The server did not return a response for this request.
wcfサービスからデータテーブルを返すにはどうすればよいですか? サービスをデバッグして return dt; にブレークポイントを置くと、それから私は1行を取得します。したがって、データはデータベースから返されますが、ビューモデルには返されません。
ここで何が間違っていますか?
更新1
サービスに書かれたこの行を変更した後
var dt = new DataTable();
に
var dt = new DataTable("Test");
現在、エラーは発生していません。しかし、フィドラーはjson形式でデータを受信していません。フィドラーを開くと、TextViewタブの下にデータがいくつかの形式で表示されます。それが、私がノックアウト モデルに参加できない理由です。これを修正するにはどうすればよいですか?