Можно ли смешивать потоковую передачу и не потоковую передачу WCF OperationContracts в рамках одной и той же службы? - PullRequest
2 голосов
/ 21 января 2012

У меня есть набор операций, которые определены в одном ServiceContract, и теперь две из них были переключены для непосредственного получения и возврата MessageContracts, которые содержат тело потока, как описано в документации MSDN. Я протестировал это, и, похоже, теперь он работает нормально, когда я вызываю другие мои операции внутри того же ServiceContract, которые принимают простые параметры стиля RPC и возвращаемые типы, я получаю следующее исключение.

System.ServiceModel.ProtocolException occurred
  Message=The remote server returned an unexpected response: (400) Bad Request.
  Source=mscorlib
  StackTrace:
    Server stack trace: 
       at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
       at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
       at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       ...
  InnerException: System.Net.WebException
       Message=The remote server returned an error: (400) Bad Request.
       Source=System
       StackTrace:
            at System.Net.HttpWebRequest.GetResponse()
            at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
       InnerException: 

Если я понимаю, что происходит, я думаю, что проблема в том, что я установил для TransferMode значение Streamed в обоих направлениях как для сервера, так и для клиента, чтобы упростить операции на основе MessageContract, но это должно нарушать мои операции, не основанные на MessageContract, которые работали, прежде чем я представил потоковые.

Тогда, возможно, у меня есть только эти два варианта:

  1. Переписать все мои рабочие контракты в этом сервисе, чтобы они основывались на MessageContract и, возможно, также чтобы они представляли поток для тела. На данный момент я не уверен, понадобится ли Stream или я мог бы просто установить его в null или вообще исключить из сообщения.
  2. Разделить мои рабочие контракты на отдельные ServiceContracts в зависимости от режима их передачи.

Это звучит точно? Есть ли другие варианты? Я посмотрел, есть ли способ указать TransferMode для OperationContract, но я не могу найти какой-либо способ сделать это, так как это параметр для привязки, и я не знаю, как указать отдельные привязки для OperationContract .

Каковы мои лучшие варианты для продвижения вперед с набором услуг, которые мне нужно предоставить?

...