Клиент WCF (Add Service Reference) ненавидит WebGet и WebInvoke ... действительно, это так - PullRequest
5 голосов
/ 23 октября 2009

Я работал над созданием служб WCF, которые будут работать независимо от клиентов .Net. Благодаря Google и StackOverflow я смог создать как простые xml, так и json-сервисы без Soap-оберток и кучу необычных вещей WCF, которые мне просто не нужны. Это был болезненный опыт, отсюда и сюжетная линия этого вопроса. WCF безумно глючит на стороне клиента при использовании WebGet и WebInvoke при автоматическом добавлении ссылки на службу.

Чтобы проверить связь, я создал клиента WCF локально и пропустил все через Fiddler . Таким образом, работает ли он или нет, я могу, по крайней мере, увидеть, что клиент пытается отправить. И когда это, наконец, работает, я вижу данные, отправляемые с обоих концов, а затем дублирую это сообщение в клиенте, отличном от .Net.

Моя текущая проблема заключается в том, что, когда я изменяю службу на ожидание данных POST в виде json (поведение enableWebScript), клиент понятия не имеет, и он все еще пытается отправить объекты в формате xml. У меня было множество проблем с неправильной настройкой конфигурации клиента при использовании Add Service Reference, поэтому я надеюсь, что это что-то простое, что я могу добавить в app.config на клиенте. При использовании XML объекты, которые я создаю и использую в сервисе, автоматически сериализуются клиентом в формате xml (что наиболее удобно). Это вообще возможно сделать как json в текущей версии WCF?

Следует отметить, что мне удалось выяснить, что мне нужно сделать вручную, и заставить его работать в необработанном виде с Fiddler (построителем запросов), чтобы я мог сериализовать свои объекты в коде и отправлять данные вручную через http post ... вот как я это делаю в своих не-Net клиентах в любом случае. Это больше вопрос о том, чтобы лучше понять аспекты WCF, и почему я пропускаю так много атрибутов на стороне клиента, где практически нет документации для решения проблем.

Ответы [ 2 ]

3 голосов
/ 09 января 2010

ссылки на службы WCF предназначены для полезных нагрузок RPC с самоописанием, т. Е. SOAP, wsHttp и т. Д. В равной степени клиенты со строгой типизацией WCF предназначены только для работы с полезными нагрузками RPC, поскольку только они способны передавать всю информацию о типе и т. Д. для правильной работы.

Когда вы используете webget и webinvoke, вы создаете не-rpc-сервисы (предназначенные для написания REST-сервисов), которые также не имеют самоописания и поэтому не идеально подходят для функциональных ссылок на сервисы.

Конечно, вы можете написать .Net-клиент для этого - но вам будет гораздо проще написать его, используя WebClient / WebRequest, вручную форматируя / читая запросы / ответы XML / Json (или используйте DataContractSerializer и DataContractJsonSerializer для помочь с этим).

1 голос
/ 09 января 2010

SOAP - самоописание (через WSDL).

WebGet / WebInvoke не предоставляют метаданные, которые бы указывали клиенту использовать JSON вместо XML.

...