На первый взгляд есть три проблемы с вашим кодом:
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.WrappedRequest
вместо WebMessageBodyStyle.Wrapped
, поскольку последний несовместим с WebScriptServiceHostFactory .
3: IMHO с использованием Method = "GET" было бы более RESTful для метода с именем GetClientJson, чем Method = "POST"
Еще один совет, который я мог бы дать вам при работе со службами WCF, - это использовать SvcTraceViewer.exe в комплекте с Visual Studio. Это отличный инструмент для отладки. Все, что вам нужно, это добавить следующий раздел в ваш app / 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.
Конечно, вы не должны забывать комментировать этот раздел перед началом работы, иначе у вас могут получиться довольно большие файлы.