Можно ли смешивать потоковую передачу и не потоковую передачу WCF OperationContracts в рамках одной и той же службы?
У меня есть набор операций, которые определены в одном 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, которые работали до Я представил потоковые.
Тогда, возможно, у меня есть только эти два варианта:
- Перепишите все мои рабочие контракты в этом сервисе, чтобы они основывались на MessageContract и, возможно, также чтобы они представляли поток для тела. На данный момент я не уверен, понадобится ли Stream или я мог бы просто установить его в null или вообще исключить из сообщения.
- Разделите мои операционные контракты на отдельные сервисные контракты на основе их режима передачи.
Это звучит точно? Есть ли другие варианты? Я посмотрел, есть ли способ указать TransferMode для OperationContract, но я не могу найти какой-либо способ сделать это, так как это параметр для привязки, и я не знаю, как указать отдельные привязки для OperationContract,
Каковы мои лучшие варианты для продвижения вперед с набором услуг, которые мне нужно предоставить?