C# WCF忽略数据协定不起作用
我有一个托管在IIS上的WCF服务。这是我的界面:C# WCF忽略数据协定不起作用,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,我有一个托管在IIS上的WCF服务。这是我的界面: [ServiceContract] [SilverlightFaultBehavior] public interface IETC { [OperationContract] [PrincipalPermission(SecurityAction.Demand, Role = "XYZ")] string GetStampXML(); [OperationContract] [PrincipalPermissi
[ServiceContract]
[SilverlightFaultBehavior]
public interface IETC
{
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "XYZ")]
string GetStampXML();
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "XYZ")]
List<Stamp> GetStamps();
}
我的邮票班是:
[DataContract]
public class Stamp
{
private string _Name;
private string _SmallIcon = "";
private string _MediumIcon = "";
private string _LargeIcon = "";
private BitmapImage _SmallImage;
private BitmapImage _MediumImage;
private BitmapImage _LargeImage;
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string SmallIcon
{
get { return _SmallIcon; }
set { _SmallIcon = value; }
}
[DataMember]
public string MediumIcon
{
get { return _MediumIcon; }
set { _MediumIcon = value; }
}
[DataMember]
public string LargeIcon
{
get { return _LargeIcon; }
set { _LargeIcon = value; }
}
[IgnoreDataMember]
public BitmapImage SmallImage
{
get { return _SmallImage; }
set { _SmallImage = value; }
}
[IgnoreDataMember]
public BitmapImage MediumImage
{
get { return _MediumImage; }
set { _MediumImage = value; }
}
[IgnoreDataMember]
public BitmapImage LargeImage
{
get { return _LargeImage; }
set { _LargeImage = value; }
}
}
这就像IgnoreDataMember未被识别一样。我在没有IgnoreDataMember的情况下尝试了它,但它只会序列化DataMember,这也不起作用。你知道为什么它试图序列化BitmapImage吗?你运行的是哪个版本的.net吗。NET4数据协定不要求您显式设置忽略属性。您可以通过使用DataContractSerializer并将内容写入文件来测试生成的内容。创建控制台应用程序并引用您的服务项目
namespace SO_10281928
{
class Program
{
static void Main(string[] args)
{
var instance = new Stamp
{
Name = "Test",
SmallIcon = "Small Icon",
LargeIcon = "LargeIcon",
MediumIcon = "MediumIcon"
};
using (var stream = new FileStream(@"c:\temp\stamp.xml", FileMode.Create))
{
var ds = new DataContractSerializer(typeof (Stamp));
ds.WriteObject(stream, instance);
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
[DataContract]
public class Stamp
{
private string _Name;
private string _SmallIcon = "";
private string _MediumIcon = "";
private string _LargeIcon = "";
private BitmapImage _SmallImage;
private BitmapImage _MediumImage;
private BitmapImage _LargeImage;
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string SmallIcon
{
get { return _SmallIcon; }
set { _SmallIcon = value; }
}
[DataMember]
public string MediumIcon
{
get { return _MediumIcon; }
set { _MediumIcon = value; }
}
[DataMember]
public string LargeIcon
{
get { return _LargeIcon; }
set { _LargeIcon = value; }
}
public BitmapImage SmallImage
{
get { return _SmallImage; }
set { _SmallImage = value; }
}
public BitmapImage MediumImage
{
get { return _MediumImage; }
set { _MediumImage = value; }
}
public BitmapImage LargeImage
{
get { return _LargeImage; }
set { _LargeImage = value; }
}
}
public class BitmapImage
{
}
}
结果是:
<Stamp xmlns="http://schemas.datacontract.org/2004/07/SO_10281928" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<LargeIcon>LargeIcon</LargeIcon>
<MediumIcon>MediumIcon</MediumIcon>
<Name>Test</Name>
<SmallIcon>Small Icon</SmallIcon>
</Stamp>
拉盖孔
医务人员
试验
小图标
您正在运行的.net版本是什么。NET4数据协定不要求您显式设置忽略属性。您可以通过使用DataContractSerializer并将内容写入文件来测试生成的内容。创建控制台应用程序并引用您的服务项目
namespace SO_10281928
{
class Program
{
static void Main(string[] args)
{
var instance = new Stamp
{
Name = "Test",
SmallIcon = "Small Icon",
LargeIcon = "LargeIcon",
MediumIcon = "MediumIcon"
};
using (var stream = new FileStream(@"c:\temp\stamp.xml", FileMode.Create))
{
var ds = new DataContractSerializer(typeof (Stamp));
ds.WriteObject(stream, instance);
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
[DataContract]
public class Stamp
{
private string _Name;
private string _SmallIcon = "";
private string _MediumIcon = "";
private string _LargeIcon = "";
private BitmapImage _SmallImage;
private BitmapImage _MediumImage;
private BitmapImage _LargeImage;
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string SmallIcon
{
get { return _SmallIcon; }
set { _SmallIcon = value; }
}
[DataMember]
public string MediumIcon
{
get { return _MediumIcon; }
set { _MediumIcon = value; }
}
[DataMember]
public string LargeIcon
{
get { return _LargeIcon; }
set { _LargeIcon = value; }
}
public BitmapImage SmallImage
{
get { return _SmallImage; }
set { _SmallImage = value; }
}
public BitmapImage MediumImage
{
get { return _MediumImage; }
set { _MediumImage = value; }
}
public BitmapImage LargeImage
{
get { return _LargeImage; }
set { _LargeImage = value; }
}
}
public class BitmapImage
{
}
}
结果是:
<Stamp xmlns="http://schemas.datacontract.org/2004/07/SO_10281928" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<LargeIcon>LargeIcon</LargeIcon>
<MediumIcon>MediumIcon</MediumIcon>
<Name>Test</Name>
<SmallIcon>Small Icon</SmallIcon>
</Stamp>
拉盖孔
医务人员
试验
小图标
在对象上指定DataContract时,不应该需要IgnoreDataMember属性,只有在类上设置了具有DataMember属性的属性。您应该检查您的服务接口,也许您使用的是XmlSerializer而不是DataContract序列化程序。我尝试过没有显式添加IgnoreDataMember,但没有成功。我怎么知道我正在使用XmlSerializer?我认为DataContract属性将使其使用DataCotnract序列化程序。我刚刚意识到您的错误消息说“考虑使用DataContract序列化程序中的DataContractAttribute标记它”。所以这可能没问题。您发布的代码看起来也不错,因此错误可能在服务接口中使用的其他对象中的其他地方。您应该知道,默认情况下,未标记DataContract的对象将序列化所有公共属性。您可以先尝试在WCF外部序列化测试对象。请参见,您不应该需要IgnoreDataMember属性,在对象上指定DataContract时,仅在类上设置具有DataMember属性的属性。您应该检查您的服务接口,也许您使用的是XmlSerializer而不是DataContract序列化程序。我尝试过没有显式添加IgnoreDataMember,但没有成功。我怎么知道我正在使用XmlSerializer?我认为DataContract属性将使其使用DataCotnract序列化程序。我刚刚意识到您的错误消息说“考虑使用DataContract序列化程序中的DataContractAttribute标记它”。所以这可能没问题。您发布的代码看起来也不错,因此错误可能在服务接口中使用的其他对象中的其他地方。您应该知道,默认情况下,未标记DataContract的对象将序列化所有公共属性。您可以先尝试在WCF外部序列化测试对象。看,这也是我所期望的。也许这与我的Stamp类在Silverlight库中,而我在.NET4WCF项目中使用它有关?这也是我所期望的。也许这与我的Stamp类在Silverlight库中以及我在.NET4WCF项目中使用它有关?