Перенос сервиса ASMX в сервис WCF - AJAX Post - PullRequest
4 голосов
/ 02 апреля 2012

У меня есть служба asmx asp.net, и я хотел бы преобразовать ее в службу wcf.

У меня проблемы с вызовом службы wcf из POST-запроса jquery ajax с параметрами.

если я вызываю службу WCF без параметров или передаю параметр в формате json, это работает нормально.

При выполнении нижеприведенного сообщения jquery для службы wcf я получаю ошибку 500.

Обратите внимание, я не могу изменить способ выполнения запроса jquery.

Оригинальный сервис ASMX:

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void SendStatus(string param1, string param2)
{
..................
}

jQuery POST:

var d = { param1: 1, param2: 2 };
        $.ajax({
            type: "POST",
            url: "/Service1.asmx/SendStatus",
            data: d,
            success: function () { }
        });

НОВЫЙ WCF Сервис:

[OperationContract]
[WebInvoke]

public void SendStatus(string param1, string param2)
{
}

jQuery POST:

var d = { param1: 1, param2: 2 };
 $.ajax({
            type: "POST",
            url: "/Service2.svc/SendStatus",
            data: d,
            success: function () { }
        });

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

- РЕДАКТИРОВАТЬ - Я вспоминаю, что этот вопрос сводил меня с ума однажды, поэтому я вернулся к другому взгляду. Конечно же ... Учитывая требование, чтобы Javscript оставался таким, как написано, я утверждаю, что это буквально невозможно в текущей версии WCF. Рассмотрим следующие моменты:

1) Вам необходимо использовать webHttpBinding, потому что это единственная привязка, которая поддерживает службы в стиле REST (basicHttpBinding и WSHttpBinding используют обертки SOAP). (ссылка здесь: BasicHttpBinding против WsHttpBinding против WebHttpBinding )

2) В вызове AJAX, как написано в этом вопросе, используется тип содержимого «application / x-www-form-urlencoded» (вы можете подтвердить это с помощью Fiddler).

3) Вы также можете подтвердить, что WCF выдает исключение еще до того, как метод сервиса будет вызван. Исключение составляют следующие:

Стиль тела 'Голый' не поддерживается 'WebScriptEnablingBehavior'. Измените стиль тела на WrappedRequest.

Но «голый» стиль тела - это язык Microsoft для REST-запроса с использованием основных параметров (т. Е. Не «обернутый» в JSON или XML). То есть, нет никакой возможной конфигурации, которая позволила бы WCF обрабатывать этот конкретный запрос AJAX. Вы даже можете реализовать свой собственный WebContentTypeMapper, и он все равно не будет работать. Этот парень к ним: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2473190-consider-making-the-system-servicemodel-channels-r

Мой вывод заключается в том, что (учитывая, что вы не можете использовать MVC, что могло бы сделать это очень просто), вам нужно каким-то образом перенаправить этот запрос на базовую страницу .ASPX и использовать надежные старые методы Webforms (Page. IsPostBack, Request.Params ["param1"] и т. Д.).

- КОНЕЦ РЕДАКТИРОВАНИЯ -

Согласно другой теме выше, похоже, что есть несколько параметров, которые необходимо добавить / исправить в вызове AJAX:

...
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(d)
...
1 голос
/ 02 апреля 2012

Если вы не можете изменить код на стороне клиента, вам следует не перенести эти конечные точки из ASMX в WCF. WCF использует другой, менее гибкий сериализатор, чем ASMX, и вполне вероятно, что вы столкнетесь с проблемами, которые могут быть решены только путем изменения способа отправки, получения и / или обработки данных на стороне клиента.

Если вы все равно готовы справиться с этой суматохой, гораздо более эффективный путь миграции будет заключаться в том, что ASP.NET Web API будет отправлен и перейдет к нему. Если вы перейдете в WCF сейчас, вы просто отстанете позже в этом году, когда выйдет Web API.

0 голосов
/ 02 апреля 2012

Я думаю, что вы должны передавать значения параметров строки в двойных кавычках ("").Вот так:

var d = { param1: "1", param2: "2" };
     $.ajax({
                type: "POST",
                url: "/Service2.svc/SendStatus",
                data: d,
                success: function () { }
            });

Надеюсь, это сработает.

500 Код ошибки означает, что значения параметров не соответствуют требуемым значениям.

...