使用jquery和参数调用WCF服务

时间:2010-10-06 20:53:57

标签: jquery ajax 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永远不会被调用。

发生了什么事?

4 个答案:

答案 0 :(得分:3)

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

"{'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的经历:你玩游戏并玩游戏,然后它可以工作,你不知道为什么。 :(