Вызов службы WCF с jquery и параметрами - PullRequest
2 голосов
/ 07 октября 2010

Хорошо, это один из этих основных вопросов, но я уже два часа гуглял и отлаживал, и ошибка уходит от меня.

Простой сценарий: служба WCF с методами с параметрами, которые я хотел бы вызвать через jquery.Я могу нормально вызывать методы без параметров, но с параметрами вызов никогда не достигает моей точки останова в .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 code

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 ]

3 голосов
/ 07 октября 2010

У меня были похожие проблемы, когда я пытался использовать 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. Вы также должны попробовать предложение @ Брайс!

[WebInvoke(Method = "POST",
           BodyStyle = WebMessageBodyStyle.Wrapped,
           ResponseFormat = WebMessageFormat.Json,
           RequestFormat = WebMessageFormat.Json)]
//note the response and request format
0 голосов
/ 07 октября 2010

Итак, теперь это работает.Я не очень уверен, почему, так как я не сильно изменился.Боюсь, одним из факторов было то, что мой тайм-аут был слишком мал для отладки (но даже тогда он должен был работать).

Итак, теперь серверный код, который работает для меня (с параметрами и без них)

[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);}

Я изменил кавычки в соответствии с предложением Муханнада, хотя я уверен, что пробовал это раньше.

Я также пытался без "lastId", который не работал.

У меня был такой опыт раньше с WCF: ты играешь и играешь, потом он работает, и ты не уверен, почему.(

0 голосов
/ 07 октября 2010

Прежде всего вы должны убедиться, что ваш метод возвращает данные в формате 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, но будут строками причины).

Если входной параметр является классом, то выдолжен посылать JSON-сериализованные данные соответствующего объекта JavaScript без кодирования имени параметра метода WCF (без 'lastId').Имена параметров будут использоваться только в том случае, если вы вызовете веб-службу ASMX вместо WFC.Смотрите мой этот старый ответ для сравнения.

0 голосов
/ 07 октября 2010

Я не уверен, но мне было бы интересно узнать, сработает ли добавление этого атрибута OperationContract ниже:

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

наткнулся и на эту ссылку: Создание прокси веб-сервиса с помощью jQuery

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...