Intereting Posts

Ошибка WCF webHttpBinding с параметрами метода. «Не более одного параметра тела можно сериализовать без элементов обертки»

Операция ” контракта ” задает несколько параметров тела запроса, которые должны быть сериализованы без каких-либо элементов-оберток. Не более одного параметра тела можно сериализовать без элементов обертки. Удалите дополнительные параметры тела или установите свойство BodyStyle в атрибуте WebGetAttribute / WebInvokeAttribute для обертывания.

Я пытаюсь открыть службу WCF C # 4.0 с помощью JSON через следующую конфигурацию (установленную с помощью редактора конфигурации WCF):

                                 

Когда я обращаюсь к /API.svc, я получаю ранее указанное сообщение исключения.

Если я укажу только следующий (без параметра) контракт, служба работает:

 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "test")] GenericApiResult<IEnumerable> test(); 

Если у меня есть методы, для которых требуются параметры, не являющиеся строками, я получаю исключение, указанное ранее.

Пример:

 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login")] LoginApiResult Login(String UserName, String Password); 

Если я изменю эту функцию так:

 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}/{Password}")] LoginApiResult Login(String UserName, String Password); 

Оно работает; но это возможно только для параметров типа String. Как мне отрегулировать это для моих других функций, таких как:

 [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "logout")] GenericApiResult Logout(Guid SessionKey); 

Пробовал много поисковых запросов Google, но оказался пустым, любая помощь была оценена.

Ура,

Ник.

Пробовали ли вы установить параметр WebInvokeAttribute.BodyStyle для обертывания, как рекомендует ошибка?

Проблема в том, что ваш UriTemplate должен указать все передаваемые значения, кроме одного. Хорошо иметь сложные типы, отличные от строк, в качестве параметров, мы часто отправляем легкие json-объекты в наши сервисы, и они в порядке. Вот пример, использующий ваш последний пример.

 [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "logout")] GenericApiResult Logout(Guid SessionKey); 

Будет работать, потому что в него передается только один параметр, и ожидается, что он будет находиться в теле сообщения, потому что он не передается как параметр URL, но вы можете передавать только один параметр тела (параметр, переданный в теле сообщение, а не URL-адрес).

Вы можете изменить свой первый метод следующим образом:

 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}")] LoginApiResult Login(String UserName, String Password); 

и это сработает, но Пароль появится в теле сообщения. Лучший пример в этом конкретном примере – сделать то, что вы сделали для второго примера, например:

 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}/{Password}")] LoginApiResult Login(String UserName, String Password); 

Имеет ли это смысл? В основном все переданные значения должны быть представлены как параметр URL, за исключением одного, который может быть передан в тело сообщения. Если вам нужно несколько значений, переданных в тело сообщения, сделайте легкий объект, который имеет несколько значений, которые вам нужны, и примите этот объект целиком в теле сообщения.

WCF не поддерживает более одного параметра с голым телом, если вам нужно пройти несколько параметров в одной операции с методом post, тогда нам нужно установить BodyStyle в Wrapped .

Таким образом, в вашем случае вам придется сменить свой рабочий контракт на следующее:

 [WebInvoke(Method = "POST", UriTemplate = "evals", BodyStyle = WebMessageBodyStyle.WrappedRequest)] [OperationContract] void SubmitVideoPOST(Video videoArg, string userId); 

Источник: Нажмите здесь