jqGrid,POST使用带有REST的WCF返回错误请求

时间:2015-07-03 00:21:14

标签: c# jquery ajax wcf jqgrid

我使用jqGrid显示我的服务数据,我以前使用jsonp检索数据但我不允许再使用它,所以我改变了所有其他的ajax应用程序的调用(他们使用jQuery ajax),他们工作正常,但jqGrid给我的问题,以前我用过:

以前拨打服务的方式:

myObj.jqGrid({
    url: externalUrlOfMyService,
    datatype: 'json',
    mtype: 'GET',
    postData: {
        obj1: JSON.stringify(valueObj1),
        obj2: JSON.stringify(valueObj2)
    })
    ...
});

最新且无法调用服务的方式:

myObj.jqGrid({
    url: externalUrlOfMyService,
    datatype: 'json',
    mtype: 'POST',
    postData: JSON.stringify({
        obj1: valueObj1,
        obj2: valueObj2
    }),
    ajaxGridOptions: { contentType: "application/json", cache: true },
    ...
})

我知道它到达了服务器,因为我的Application_BeginRequest global.asax上有一个断点,但总而言之,它永远不会进入该方法。

如果我尝试使用GET方法,则会输入方法,但所有参数都为null

注意:我使用的是jqGrid 4.5.2

有什么想法吗?

提前致谢。

更新

<OperationContract()>
<WebInvoke(Method:="*",
           RequestFormat:=WebMessageFormat.Json,
           ResponseFormat:=WebMessageFormat.Json,
           BodyStyle:=WebMessageBodyStyle.WrappedRequest)>
<FaultContract(GetType(ServiceFault))>
Function RetrievePhones(userCompany As LookUpValue,
                    recordOwnerType As Enumerations.EnumRecordOwnerType,
                    recordOwnerId As String,
                    consumer As ConsumerObject)

更新2

我这样做了,但我得到了不好的请求,有什么不对吗?

postData: {
    userCompany: userCompany,
    recordOwnerType: recordOwnerType,
    recordOwnerId: recordOwnerId,
    consumer: consumer
},
ajaxGridOptions: { contentType: "application/json" },
serializeGridData: function (data) {
    return JSON.stringify({
        userCompany: data.userCompany,
        recordOwnerType: data.recordOwnerType,
        recordOwnerId: data.recordOwnerId,
        consumer: data.consumer
    });
},

更新3

的Fiddler

enter image description here

更新4

也许它无关紧要,但继承了我的global.asax:

的信息
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", WebConfigurationManager.AppSettings("AllowOrigin"))
'HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true")
'AuthenticateAJAXRequest()
If HttpContext.Current.Request.HttpMethod = "OPTIONS" Then
    'These headers are handling the "pre-flight" OPTIONS call sent by the browser
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST")
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With")
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000")
    HttpContext.Current.Response.[End]()
End If

更新5

我只是检查了我的jqGrid选项的末尾我ajaxGridOptions: { timeout: 30000 }覆盖了我之前设置的ajaxGridOptions: { contentType: "application/json" },因此我在提琴手上给了Content-Type: text/html并给予了我是400个坏请求。

1 个答案:

答案 0 :(得分:1)

您使用BodyStyle:=WebMessageBodyStyle.WrappedRequest proeprty。这意味着所有参数一起需要JSON编码为一个对象。请参阅the answer

因此,您必须使用serializeGridData序列化所有参数(您在postData中添加的自定义参数和标准jqGrid参数):

serializeGridData: function (data) {
    return JSON.stringify(data);
}

我建议您另外删除cache: true选项,这在使用mtype: 'POST'时无效。