Ошибка IsEmpty при вызове метода без параметров WCF из Flex - PullRequest
2 голосов
/ 12 апреля 2010

У меня есть веб-сервис WCF (с использованием basicHTTPBinding), к которому я подключаюсь из приложения Flex. Я использую генерацию кода FlexBuilder для создания прокси для веб-службы.

Это прекрасно работало, пока я не попытался вызвать метод в веб-сервисе, у которого нет параметров. Вот это объявление интерфейса:

    [OperationContract]
    DateTime GetCurrentDateTime();

Затем я начал получать ответы HTTP 500 кода от службы.

Проверка ответа HTTP с помощью Fiddler показывает, что WCF сообщает о следующей ошибке:

Error in deserializing body of request message for operation 'GetCurrentDateTime'. 
The OperationFormatter could not deserialize any information from the Message because the Message is empty (IsEmpty = true)

Похоже, что между Flex и WCF существует несовместимость, когда вызывающие методы не имеют параметров - Flex ничего не включает в сообщение, но WCF ожидает, что что-то там будет.

Есть ли способ настроить Flex или WCF, чтобы обойти это, или мне придется включать фиктивные параметры в такие контракты на эксплуатацию?

1 Ответ

0 голосов
/ 04 августа 2011

Я могу вызвать веб-запрос без параметров.

WCF:

[ServiceContract]
public interface ICurrentDateTimeService
{
    [OperationContract]
    DateTime GetCurrentDate();
}

public class Service1 : ICurrentDateTimeService
{
    public DateTime GetCurrentDate()
    {
        return DateTime.Now;
    }
}

Flex:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="init()">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import services.currentdatetimeservice.CurrentDateTimeService;

        private var service:CurrentDateTimeService = new CurrentDateTimeService();

        public function init():void {
            service.addEventListener(ResultEvent.RESULT, serviceResult);
            service.addEventListener(FaultEvent.FAULT, serviceFault);
            service.GetCurrentDate();
        }

        public function serviceResult(e:ResultEvent):void {
            trace(e.result);
        }

        public function serviceFault(e:FaultEvent):void {
            trace("Oh no! :(");
        }

    ]]>
</fx:Script>
</s:Application>

Результат Thu Aug 4 01:11:12 GMT-0600 2011

У вас есть слушатель для события сбоя?

...