WCF HTTP 204 ответ - PullRequest
       2

WCF HTTP 204 ответ

1 голос
/ 21 марта 2011

Я использую веб-сервис WCF с сервера, над которым у меня мало контроля.Методы, не возвращающие никаких данных, запускают HTTP-код 204, что совершенно нормально с точки зрения HTTP, однако у меня есть проблема с обработкой ответа самим WCF (все другие методы, возвращающие 400, работают нормально).

Вот мой методобъявление:

  [OperationContract]
  [WebInvoke(UriTemplate = "methodpath/V1",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void Operation1(
     [MessageParameter(Name = "username")]
     string userName,

     [MessageParameter(Name = "password")]
     string password);

Ошибка, возникающая после вызова метода: CommunicationException: Ошибка в десериализации тела ответного сообщения для операции «Операция1».OperationFormatter не удалось десериализовать какую-либо информацию из сообщения, поскольку сообщение пустое (IsEmpty = true).

Также пытались с IsOneWay = true: InvalidOperationException: односторонняя операция вернула ненулевое сообщение с Action =''.

Вот необработанный HTTP-ответ:

HTTP/1.1 204 No Content
Set-Cookie: ...
Content-Length: 0
Connection: Close
Date: Mon, 21 Mar 2011 18:41:37 GMT

трассировка стека исключений:

трассировка стека серверов:

   at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeReply(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.DemultiplexingClientMessageFormatter.DeserializeReply(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.CompositeClientFormatter.DeserializeReply(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Будетблагодарен всем, кто знает, как заставить WCF изящно принять ответ.

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Я столкнулся с той же проблемой, что и вы, в ситуации, когда у меня был нулевой контроль над сервисным кодом. Это была подпись метода, взятая из Справочника по службам Visual Studio 2010, созданного для меня:

        [System.ServiceModel.OperationContractAttribute(IsOneWay=false, Action="NotificaMessaggioAssenza")]
    void NotificaMessaggioAssenza(string CodiceMessaggio, string StatoRecapito);

Мне удалось написать специальный инспектор сообщений, который ничего не делал, кроме проверки, был ли ответ пустым, и, если он был, заменил его пустым соответствующего типа, выведенного из Action, Namespace и имени метода, который завершился up (после некоторых проб и ошибок) как сериализованный как:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://rti.mediaset.it/soa/Turni/RPARS/RPARS_PortType/NotificaMessaggioAssenzaResponse</Action>
</s:Header>
<s:Body>
<NotificaMessaggioAssenzaResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://rti.mediaset.it/soa/Turni/RPARS" />
</s:Body>
</s:Envelope>

Эти ссылки мне очень помогли: 1 , 2 , 3 , 4 .

0 голосов
/ 21 марта 2011

Я думаю, вам нужно написать собственный класс канала.Взгляните на эту ссылку Обзор модели канала

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