我有一个wcf Web应用程序,它在服务器上托管服务。我正在创建客户端(api)来阅读这些服务。
我已使用以下方法向我的服务方添加了跟踪:
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="bin\messages.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
.svclog文件没有显示任何错误,所以我猜它与客户端对象的反序列化有关。我怎么看是否是这种情况?
帮助寻找问题的方法很棒。
由于私有成员为空的错误,我不得不向SET添加if null。从那时起,我一直在收到http错误。
DTO的例子:
[DataContract]
public class PersonDTO
{
private CUSTOMType<string> givenNameField ;
private CUSTOMType<string> middleNameField ;
private CUSTOMType<string> familyNameField ;
[DataMember]
public string GivenName
{
get
{
return this.givenNameField.Value;
}
set
{
if (this.givenNameField == null)
this.givenNameField = new CUSTOMType<string>();
this.givenNameField.Value = value;
}
}
[DataMember]
public string MiddleName
{
get
{
return this.middleNameField.Value;
}
set
{
if (this.middleNameField == null)
this.middleNameField = new CUSTOMType<string>();
this.middleNameField.Value = value;
}
}
[DataMember]
public string FamilyName
{
get
{
return this.familyNameField.Value;
}
set
{
if (this.familyNameField == null)
this.familyNameField = new CUSTOMType<string>();
this.familyNameField.Value = value;
}
}
}
修改
最初我有两个对象:Business和DTO。唯一的区别是DTO只是直接的C#数据类型,其中Business层具有逻辑和我的CUSTOMType。这没有问题。现在我认为这是重复,并试图将两者结合起来。二进制序列化过程可能不喜欢我的自定义类型。
构造函数在某一点上确实有私有成员的init。私有成员为null的服务抛出错误。这就是我改为SETTERS的原因。
答案 0 :(得分:2)
在客户端添加类似的跟踪,这可能会对正在发生的事情有所了解。
您是否还为CUSTOMType<T>
定义了DataContract?
编辑;在序列化期间调用get属性时,您是否确保私有字段永远不为null?如果未设置该属性,则可能导致空引用异常。也许尝试在构造函数中实例化私有字段?
答案 1 :(得分:2)
除了客户端跟踪,您还可以下载fiddler。它作为您和服务器之间的代理运行,允许您准确查看服务器发送和接收的内容。
答案 2 :(得分:1)
havardhu和bryanmac都给了我找到我的问题。最后,这是我正在使用的ORM AutoMapper.dll的映射问题。
其中一个映射语句不存在。
Mapper.CreateMap<>();
WCF并不擅长提供错误消息,我希望WCF团队能够改进这一点。