Сервисный прокси WCF генерирует исключение, когда в методе [OperationContract] используется более одного параметра - PullRequest
9 голосов
/ 03 декабря 2010

У меня есть WebServiceHost, который используется для размещения некоторых веб-служб в консольном приложении.Я добавил ссылку на службу в своем клиентском приложении и создал прокси-сервер следующим образом:

var binding = new WebHttpBinding();
var endPoint = new EndpointAddress(string.Format(Settings.serviceBase, Settings.wcfPort));

ChannelFactory<IzWaveSVC> factory = new ChannelFactory<IzWaveSVC>(new WebHttpBinding(), endPoint);

factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
// **Exception occurs here**
var proxy = (IzWaveSVC)factory.CreateChannel();

Это работает, но как только я добавил новый метод, требующий более одного параметра, я начал получать это исключение, когдапрокси был создан (это было еще до того, как произошла какая-либо связь):

Operation 'setDeviceState' of contract 'IzWaveSVC' specifies multiple request 
body parameters to be serialized without any wrapper elements. At most one 
body parameter can be serialized without wrapper elements. Either remove the 
extra body parameters or set the BodyStyle property on the WebGetAttribute / 
WebInvokeAttribute to Wrapped.

Добавление атрибута WebInvokeAttribute и установка BodyStyle в обертке не имеет никакого эффекта:

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]        
bool setDeviceState(byte nodeId, bool powered, byte level);

Следует отметитьчто у меня есть другие методы, которые работают, но у них есть только один параметр, поэтому у них нет вышеуказанной проблемы.

Просто к сведению, вот как я настраиваю хост:

endPoint = new EndpointAddress(string.Format(Settings.serviceBase, port));
binding = new WebHttpBinding();

host = new WebServiceHost(singletonObject, new Uri(string.Format(Settings.serviceBase, port)));

host.AddServiceEndpoint(typeof(IzWaveSVC), binding, ""); 
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();                
mexBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(mexBehavior);                
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), endPoint.Uri.AbsoluteUri + "mex");    
host.Open();            

Любая помощь приветствуется.

Спасибо!

Ответы [ 4 ]

15 голосов
/ 03 декабря 2010

Кажется, вы создали прокси-код, используя диалоговое окно Add Service Reference в VS. Диалог VS ASR не полностью поддерживает WCF REST, поэтому в коде прокси отсутствует атрибут [WebInvoke]. Можете ли вы попробовать добавить атрибут [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] для операций на клиентском прокси?

5 голосов
/ 15 июля 2011

Два решения, которые я нашел:

Если вы можете удалить <webHttp/>

С

<behaviors>
  <endpointBehaviors>
    <behavior>
      <!--<webHttp/>-->
    </behavior>
  </endpointBehaviors>
</behaviors>

Если вы не можете, я должен был добавить атрибут

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]

выше контактного метода операции

1 голос
/ 16 октября 2012

Попробуйте изменить среду размещения вашего сервиса в Visual Studio.
Измените его с Use local IIS на «Использовать Visual Studio Development Server».

Очевидно, что в зависимости от среды размещения, существует другое поведение.

0 голосов
/ 04 февраля 2016

У меня есть другой сценарий для этой проблемы, даже если я добавил [WebInvoke (BodyStyle = WebMessageBodyStyle.WrappedRequest)] в метод контакта операции, он все еще не работает, я обнаружил, что это сообщение решает мою проблему. http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html

Нам нужно просто найти сгенерированный файл «reference.cs». после добавления сервисной ссылки. Ключевое слово поиска: «открытый интерфейс ITestService »в рамках клиентского проекта вы найдете сгенерированный контракт на обслуживание, добавьте [System.ServiceModel.Web.WebGet] поверх OperationContract.

Итак, я добавил [System.ServiceModel.Web.WebGet] поверх OprationContract на прокси-классе на стороне клиента, он работает.

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