Ответ 1
На первый взгляд есть три проблемы с вашим кодом:
1: вы должны использовать ServiceKnownTypeAttribute, чтобы указать известные типы при экспонировании только базовых типов в ваших контрактах:
[ServiceContract(Namespace = "yyyWCF")]
public interface IClientBroker
{
[OperationContract]
[ServiceKnownType(typeof(Client))]
[WebInvoke(
Method="GET",
BodyStyle=WebMessageBodyStyle.WrappedRequest,
ResponseFormat=WebMessageFormat.Json)]
IClient GetClientJson(int clientId);
}
2: вместо WebMessageBodyStyle.Wrapped
следует использовать WebMessageBodyStyle.WrappedRequest
, потому что последний не совместим с WebScriptServiceHostFactory.
3: IMHO с использованием метода = "GET" будет более RESTful для метода с именем GetClientJson, чем Method = "POST"
Другим советом, который я мог бы дать вам при работе с услугами WCF, является использование SvcTraceViewer.exe в комплекте с Visual Studio. Это отличный инструмент для отладки. Все, что вам нужно, это добавить следующий раздел в ваше приложение /web.config:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "WcfDetailTrace.e2e" />
</listeners>
</source>
</sources>
</system.diagnostics>
Затем вызовите веб-метод, и файл WcfDetailTrace.e2e будет создан в корневом каталоге вашего веб-сайта. Затем откройте этот файл с помощью SvcTraceViewer.exe, и вы увидите много полезной информации. Например, он может сказать:
Невозможно сериализовать параметр типа 'MyNamespace.Client' (для работы "GetClientJson", контракт "IClientBroker" ), потому что это не точный тип "MyNamespace.IClient" в подпись метода и не находится в известных типов. Чтобы сериализуйте параметр, добавьте тип к коллекции известных типов для используя ServiceKnownTypeAttribute.
Конечно, вы не должны забывать комментировать этот раздел, прежде чем вступать в производство, или вы можете получить некоторые довольно большие файлы.