从jQuery DataTables到WCF服务的json ajax调用获取错误请求400?

从jQuery DataTables到WCF服务的json ajax调用获取错误请求400?,json,wcf,jquery-datatables,Json,Wcf,Jquery Datatables,我在从jQuery DataTables.Net ajax POST调用中获取有效json到我的WCF服务(4.0)服务时遇到问题。我尝试了许多组合,但无法将aoData值转移到我的服务中 [太多的代码…我想我最好粘贴我能想到的所有东西!] 这是来自IE F12调试的调用: Key Value Request POST /CustomerService.svc/json/GetCustomerDataTable HTTP/1.1 Accept application/json, text/ja

我在从jQuery DataTables.Net ajax POST调用中获取有效json到我的WCF服务(4.0)服务时遇到问题。我尝试了许多组合,但无法将
aoData
值转移到我的服务中

[太多的代码…我想我最好粘贴我能想到的所有东西!]

这是来自IE F12调试的调用:

Key Value
Request POST /CustomerService.svc/json/GetCustomerDataTable HTTP/1.1
Accept  application/json, text/javascript, */*; q=0.01
Content-Type    application/json; charset=utf-8
Referer http://localhost:51901/Home/ListCustomers
Accept-Language en-gb
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Host    localhost:51900
Content-Length  1651
Connection  Keep-Alive
Cache-Control   no-cache
以及请求机构

"{ jsonAOData : [{"name":"sEcho","value":1},{"name":"iColumns","value":7},{"name":"sColumns","value":""},{"name":"iDisplayStart","value":0},{"name":"iDisplayLength","value":10},{"name":"mDataProp_0","value":"CustomerNumber"},{"name":"mDataProp_1","value":"FirstName"},{"name":"mDataProp_2","value":"FamilyName"},{"name":"mDataProp_3","value":"MobileNumber"},{"name":"mDataProp_4","value":"CustomerIdNumber"},{"name":"mDataProp_5","value":"CustomerIdType"},{"name":"mDataProp_6","value":"DateOfBirth"},{"name":"sSearch","value":""},{"name":"bRegex","value":false},{"name":"sSearch_0","value":""},{"name":"bRegex_0","value":false},{"name":"bSearchable_0","value":true},{"name":"sSearch_1","value":""},{"name":"bRegex_1","value":false},{"name":"bSearchable_1","value":true},{"name":"sSearch_2","value":""},{"name":"bRegex_2","value":false},{"name":"bSearchable_2","value":true},{"name":"sSearch_3","value":""},{"name":"bRegex_3","value":false},{"name":"bSearchable_3","value":true},{"name":"sSearch_4","value":""},{"name":"bRegex_4","value":false},{"name":"bSearchable_4","value":true},{"name":"sSearch_5","value":""},{"name":"bRegex_5","value":false},{"name":"bSearchable_5","value":false},{"name":"sSearch_6","value":""},{"name":"bRegex_6","value":false},{"name":"bSearchable_6","value":false},{"name":"iSortCol_0","value":0},{"name":"sSortDir_0","value":"asc"},{"name":"iSortingCols","value":1},{"name":"bSortable_0","value":true},{"name":"bSortable_1","value":true},{"name":"bSortable_2","value":true},{"name":"bSortable_3","value":true},{"name":"bSortable_4","value":true},{"name":"bSortable_5","value":false},{"name":"bSortable_6","value":false}]}"
这是一个错误:

There was an error deserializing the object of type System.String. The token 'null' was expected but found 'name'.
There was an error deserializing the object of type System.String. End element 'root' from namespace '' expected. Found element 'jsonAOData' from namespace ''.
我尝试了各种方法来构建
数据:“{jsonAOData:'+jsonAOData+'}”,
但还没有找到任何有效的组合

我已经看了很多东西,但还没有找到解决办法

注意:
如果我发送:

data: '{ "jsonAOData" : "' + 'BOBBLE' + '"}',
然后我返回错误:

There was an error deserializing the object of type System.String. The token 'null' was expected but found 'name'.
There was an error deserializing the object of type System.String. End element 'root' from namespace '' expected. Found element 'jsonAOData' from namespace ''.
我不知道这是什么意思!这是一个字符串,而不是XML,那么为什么它要寻找“根”-此外,我想要jsonAOData,不是吗

注意
如果我用相同的调用调用MVC3控制器(只是一个不同的URI),那么它会按预期工作,并且正确地传递jsonAOData字符串

代码


-

-

-


通过大量的谷歌搜索解决了这个问题:

将我的服务修改为

字符串GetCustomerDataTable(列出jsonAOData)

ajax调用现在是:

"fnServerData": function (sSource, aoData, fnCallback) {
                var jsonAOData = JSON.stringify(aoData);
                //alert(aoData.toString());
                $.ajax({
                    dataType: 'json',
                    crossDomain: true,
                    contentType: "application/json; charset=utf-8",
                    type: "POST",
                    url: sSource,
                    **data: jsonAOData,**
                    dataType: "json",
                    success: function (data) {
                        //alert('success');
                        fnCallback($.parseJSON(data));
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert("Status: " + XMLHttpRequest.status + "\r\n" + textStatus + "\r\n" + errorThrown);
                    }
                });
并添加了一个数据合同

[DataContract]
    public class NameValuePair<TName, TValue>
    {
        [DataMember(Name="name")]
        public TName Name { get; set; }

        [DataMember(Name = "value")]
        public TValue Value { get; set; }

        public NameValuePair(TName name, TValue value)
        {
            Name = name;
            Value = value;
        }

        public NameValuePair() { }
    } 
[DataContract]
公共类名称值对
{
[数据成员(Name=“Name”)]
公共TName名称{get;set;}
[DataMember(Name=“value”)]
公共TValue值{get;set;}
公共名称值对(TName名称、TValue值)
{
名称=名称;
价值=价值;
}
public NameValuePair(){}
} 
现在,这将序列化为名称-值对列表…但这正是我对DataTables所需要的:)

"fnServerData": function (sSource, aoData, fnCallback) {
                var jsonAOData = JSON.stringify(aoData);
                //alert(aoData.toString());
                $.ajax({
                    dataType: 'json',
                    crossDomain: true,
                    contentType: "application/json; charset=utf-8",
                    type: "POST",
                    url: sSource,
                    **data: jsonAOData,**
                    dataType: "json",
                    success: function (data) {
                        //alert('success');
                        fnCallback($.parseJSON(data));
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert("Status: " + XMLHttpRequest.status + "\r\n" + textStatus + "\r\n" + errorThrown);
                    }
                });
[DataContract]
    public class NameValuePair<TName, TValue>
    {
        [DataMember(Name="name")]
        public TName Name { get; set; }

        [DataMember(Name = "value")]
        public TValue Value { get; set; }

        public NameValuePair(TName name, TValue value)
        {
            Name = name;
            Value = value;
        }

        public NameValuePair() { }
    }