Методы WebGet и не WebGet в WCF Rest Service - PullRequest
8 голосов
/ 06 мая 2011

Ниже приведены мой Контракт и OperationContracts, моя проблема заключается в том, что я использую атрибут WebGet для всех методов, с которыми мой сервис работает нормально, когда я удаляю Атрибут WebGet для любого из OperationContracts, я получаю следующую ошибку. *

Операция 'ProductDetails' из контракт 'IDemo' определяет несколько параметры тела запроса должны быть сериализованный без какой-либо обертки элементы. Максимум один параметр тела можно сериализовать без оболочки элементы. Либо удалить лишнее тело параметры или установить BodyStyle собственность на WebGetAttribute / WebInvokeAttribute to Облаченный.

Это мои методы

string AddNumbers(int x,int y);  --- using [WebGet]

string SubtractNumbers(int x, int y); -- using [WebGet]

String ProductDetails(string sName, int cost, int Quntity, string binding); -- not using using [WebGet]

CompositeType GetDataUsingDataContract(CompositeType composite); -- not using [WebGet]

Обязательно ли включать атрибут [WebGet] во все контракты операций, если мы используем WebHttpbinding ??.

public interface IService1
{
    [OperationContract]        
    string GetData(int value,string binding);

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
           ResponseFormat = WebMessageFormat.Xml,
           UriTemplate = "/Add?num1={x}&num2={y}")]
    string AddNumbers(int x,int y);

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
           ResponseFormat = WebMessageFormat.Xml,
           UriTemplate = "/Subtract?num1={x}&num2={y}")]
    string SubtractNumbers(int x, int y);

    [OperationContract]
    String ProductDetails(string sName, int cost, int Quntity, string binding);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
}

1 Ответ

17 голосов
/ 06 мая 2011

Сообщение об ошибке действительно говорит, в чем именно проблема:

Операция «ProductDetails» договора 'IDemo' указывает на несколько запросов параметры тела для сериализации без каких-либо элементов обертки. Максимум один параметр тела может быть сериализован без элементов обертки.

У вас не может быть методов, которые ожидают более одного параметра, если вы не заключите их в оболочку, например указав параметр BodyStyle в атрибуте WebGet.

Так что да: либо вы должны применить [WebGet] к каждому методу службы REST, либо вы можете реорганизовать свои методы так, чтобы они включали только один параметр (например, объединяя два или три параметра, которые у вас сейчас есть, в один класс, который содержит эти несколько параметров, а затем передает экземпляр объекта этого класса Request).

[DataContract]
public class AddNumbersRequest
{
   [DataMember]
   public int X { get; set; }
   [DataMember]
   public int Y { get; set; }
}   

[OperationContract]
string AddNumbers(AddNumbersRequest request);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...