好的,这是其中一个基本问题,但我现在用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永远不会被调用。
发生了什么事?
答案 0 :(得分:3)
"{'lastId':'17'}" to '{"lastId":"17"}'
//i know you tried something similar but try putting the brackets around the number as well
如果它不起作用,请告诉我,我会编辑我的帖子以便与您一起解决问题。
P.S。你也应该试试@ Bryce的建议!
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
//note the response and request format
答案 1 :(得分:0)
我不确定,但我有兴趣知道在OperationContract下面添加这个属性是否有效:
[WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)
也遇到过这个链接: Creating a Webservice Proxy with jQuery
答案 2 :(得分:0)
首先,您应该验证您的方法是否以JSON格式(ResponseFormat = WebMessageFormat.Json
)返回数据。使用[WebInvoke (Method = "POST", ResponseFormat = WebMessageFormat.Json)]
作为TestMeWithParam
的附加属性就足够了。如果您在配置文件中定义相同的信息,它也将起作用。
您应该通过以下调用解决主要问题:
BaseServiceCall("TestMeWithParam", JSON.stringify(17), successCB, errorCB);
或
BaseServiceCall("TestMeWithParam", "17", successCB, errorCB);
JSON.stringify(17)等于“17”(在JSON编码期间整数不会更改,但会是原因的字符串)。
如果输入参数是一个类,那么您应该发送相应JavaScript对象的JSON序列化数据,而不需要编写WCF方法的参数名称(没有'lastId')。仅当您调用ASMX Web服务而不是WFC时,参数名称才会使用。请参阅我的this old answer进行比较。
答案 3 :(得分:0)
所以,现在它有效。我不太清楚为什么,因为我没有经常改变。我担心一个因素是我的超时对于调试来说太小了(但即便如此它应该有效)。
所以,现在服务器代码对我有用(有和没有参数)
[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的经历:你玩游戏并玩游戏,然后它可以工作,你不知道为什么。 :(