Несколько параметров POST для службы WCF - PullRequest
8 голосов
/ 06 февраля 2011

Я пытаюсь понять WCF, поэтому мои вопросы могут быть глупыми.Я считаю, что у меня есть четкое понимание операций "GET".Сейчас я работаю над некоторыми операциями "POST".У меня вопрос, могу ли я написать операцию службы WCF с WebInvoke, которая принимает несколько параметров?Или, когда я POST-данные, он будет принимать только один сериализованный параметр?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 06 февраля 2011

Кажется, что есть некоторая путаница между wcf (это имя, данное общей абстракции microsofts для сетевого программирования) и конкретным протоколом HTTP , который определяет глаголы типа "POST" и "GET msgstr ", что wcf будет использовать для общения.

Когда вы определяете операцию службы wcf и связываете ее с [WebInvoke], вы получаете доступ к службе, используя REST по HTTP. См. webinvoke для получения более подробной информации, однако замечания хорошо суммируют

Атрибут WebInvokeAttribute применяется к сервисной операции в дополнение к OperationContractAttribute и связывает операцию с UriTemplate, а также основной транспортный глагол, представляющий вызов (например, HTTP POST, PUT или DELETE). Атрибут WebInvokeAttribute является поведение пассивной операции ( Методы IOperationBehavior ничего не делают) это добавляет метаданные к операции описание. Применяя Атрибут WebInvokeAttribute для сервисная операция не имеет никакого эффекта, если только поведение, которое ищет это метаданные в описании операции (например, WebHttpBehavior) добавляется в коллекция поведения сервиса. WebInvokeAttribute определяет, что HTTP метод, что сервисная операция отвечает на. По умолчанию все методы которые имеют атрибут WebInvokeAttribute применяется ответ на запросы POST.

Также далее в статье описывается, как сопоставить значения с вашим контрактом на обслуживание. Нечто подобное ..

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Mod?x={x}&y={y}")]
long Mod(long x, long y);

РЕДАКТИРОВАТЬ: Чтобы сделать это немного более информативным для новичков в этой области.

7 голосов
/ 06 февраля 2011

Да, но ваш POST должен быть передан с использованием общего понимания данных, также называемого «контрактом данных».

В WCF типичный подход здесь состоит в том, что вы создаете класс контракта (просто пример с моей головы, а не на 100% работающий))

[DataContract(Namespace="http://yournamespace.com")]
public class MyContract
{
   [DataMember(Order=1)]
   public string MyData1 { get(); set{};}

   [DataMember(order=2)]
   public string MyData2 { get(); set{};}

}

Затем вы должны указать свою операцию WCF, чтобы принять этот тип контракта в качестве параметра

[WebInvoke(method="POST")]
public string DoSomethingFromPost(MyContract postedData)
{
}

На вашем клиенте вы бы сериализовали данные в формат xml / json, соответствующий вашему контракту. Опять свободный пример:

<MyContract xmlns="http://yournamespace.com">
<MyData1>value</MyData1>
<MyData2>value</MyData2>
</MyContract>

Когда контракт совпадает, WCF десериализует ваш POST в объект контракта, после чего вы можете использовать его как любой другой класс.

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