只是想让一个小型的演示工作。我有一个域类库,一个控制台应用程序和一个wcf服务项目。
接口[ServiceContract]位于Domain classlib:
中[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet]
CompositeType GetDataUsingDataContract(string id);
}
该实现位于wcf服务应用程序(visual studio模板)中:
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Service1 : IService1
{
public CompositeType GetDataUsingDataContract(string id)
{
if (id != null)
{
return new CompositeType() { StringValue = id, BoolValue=true };
}
return null;
}
}
当我在IIS中正确绑定它时,它可以正常工作:
http://test123/Service1.svc/GetDataUsingDataContract?id=42
输出:
{ “d”:{ “__类型”: “的CompositeType:#Domain”, “BoolValue”:真 “的StringValue”: “42”}}
然后我写了消费者:
static void Main(string[] args)
{
var factory = new ChannelFactory<IService1>(new WebHttpBinding(), new EndpointAddress("http://test123/Service1.svc"));
factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
var service = factory.CreateChannel();
CompositeType result = service.GetDataUsingDataContract("42");
}
这会编译并运行,但CompositeType结果的属性为null和false。序列化没有正常进行。我使用fiddler来验证http调用是否正确,这与我手动使用浏览器完全一样。 当我将参数“42”更改为null时,它还为我提供了一个CompositeType对象而不是null。 Fiddler按预期显示{“d”:null}。
我很无能为力!
更新
CompositeType的代码
[DataContract]
public class CompositeType
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}