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