使用jquery和参数调用WCF服务

好吧,这是这些基本问题之一,但我现在用Google搜索并调试了两个小时,错误让我感到惊讶。

简单场景:带有参数的WCF服务,我想通过jquery调用这些参数。 我可以调用没有params的方法,但是使用params,调用永远不会进入.NET中的断点。

ServerCode:

[ServiceContract(Namespace = "http://www.myhost.de")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class MyService { [OperationContract] public int TestMeWithParam(int lastId) { return lastId; } [OperationContract] public int TestMe() { return 5; } } 

Javascript代码

 function BaseServiceCall(serviceName, dataInput, successCB, errorCB) { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: BaseUrl + "Services/MyService.svc/" + serviceName, data: dataInput, dataType: "json", timeout: 2000, success: successCB, error: errorCB }); } function ServiceGetMessages(lastMessageId, successCB, errorCB) { BaseServiceCall("TestMeWithParam", "{'lastId':'17'}", successCB, errorCB); //BaseServiceCall("TestMe", "", successCB, errorCB); } 

因此,如果我调用TestMe服务,则返回5.它可以工作。 TestMeWithParam永远不会被调用。

这是怎么回事?

当我尝试将jquery与wcf一起使用时,我遇到了类似的问题! 试着改变这个:

 "{'lastId':'17'}" to '{"lastId":"17"}' //i know you tried something similar but try putting the brackets around the number as well 

让我知道如果它不起作用,我将编辑我的post以与您一起解决问题。

ps你还应该尝试@ Bryce的建议!

 [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] //note the response and request format 

我不确定,但我有兴趣知道在OperationContract属性下面添加这个是否有效:

 [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json) 

也遇到了这个链接: 使用jQuery创建Webservice代理

首先,您应该validation您的方法是否以JSON格式返回数据( ResponseFormat = WebMessageFormat.Json )。 使用[WebInvoke (Method = "POST", ResponseFormat = WebMessageFormat.Json)]作为[WebInvoke (Method = "POST", ResponseFormat = WebMessageFormat.Json)]的附加属性就足够了。 如果您在配置文件中定义相同的信息,它也将起作用。

您应该通过以下调用解决主要问题:

 BaseServiceCall("TestMeWithParam", JSON.stringify(17), successCB, errorCB); 

要么

 BaseServiceCall("TestMeWithParam", "17", successCB, errorCB); 

JSON.stringify(17)等于“17”(在JSON编码期间整数不会更改,但会是原因的字符串)。

如果输入参数是一个类,那么您应该发送相应JavaScript对象的JSON序列化数据, 而不需要编写WCF方法的参数名称 (没有’lastId’)。 仅当您调用ASMX Web服务而不是WFC时,才会使用参数名称。 看我比较的旧答案 。

所以,现在它的工作原理。 我不太清楚为什么,因为我没有经常改变。 我担心一个因素是我的超时对于调试来说太小了(但即便如此它应该有效)。

那么,现在服务器代码对我有用(有和没有参数)

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class MyService { [OperationContract] public int TestMeWithParam(int lastId) { return lastId; } [OperationContract] public int TestMe() { return 5; } } 

正如我在其他地方读到的那样,根本不需要WebInvoke。 只是简单的标准。

客户代码:

 function BaseServiceCall(serviceName, dataInput, successCB, errorCB) { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: BaseUrl + "Services/MyService.svc/" + serviceName, data: dataInput, dataType: "json", timeout: 200000, success: successCB, error: errorCB }); } 

function ServiceGetMessages(lastMessageId,successCB,errorCB){BaseServiceCall(“TestMeWithParam”,'{“lastId”:“’+ lastMessageId +’”}’,successCB,errorCB); // BaseServiceCall(“TestMe”,“”“,successCB,errorCB); }

我按照Mouhannad的建议更改了引号,尽管我确信之前我曾尝试过。

我也尝试过没有“lastId”但没有用。

我之前有过WCF的经历:你玩游戏并玩游戏,然后它可以工作,你不知道为什么。 🙁