C# WCF:将值类型参数传递给返回消息协定的操作
情况: 我有这份服务合同:C# WCF:将值类型参数传递给返回消息协定的操作,c#,wcf,soap,value-type,messagecontract,C#,Wcf,Soap,Value Type,Messagecontract,情况: 我有这份服务合同: [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] public interface IMyServiceContract { //This WORKS! Because GUIDWRAPPER and Group have a MessageContract [OperationContract] Group GetA(GUIDWRAPPER id);
[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IMyServiceContract
{
//This WORKS! Because GUIDWRAPPER and Group have a MessageContract
[OperationContract]
Group GetA(GUIDWRAPPER id);
//This DOES NOT WORK, because int has no MessageContract!
[OperationContract]
Group GetB(int id);
}
[MessageContract]
public class GUIDWRAPPER
{
public GUIDWRAPPER() { }
public GUIDWRAPPER(Guid id)
{
Id = id;
}
[MessageBodyMember]
public Guid Id { get; set; }
}
在这种情况下,组有一个消息约定,此消息约定从服务约定继承安全级别。组看起来像这样:
[MessageContract]
public class Group: Entity, ICloneable
{
public Group(){}
[MessageBodyMember]
public String Name {get;set;}
}
GUIDWRAPPER类型是一个简单的包装器für a Guid,它还有一个消息约定:
[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IMyServiceContract
{
//This WORKS! Because GUIDWRAPPER and Group have a MessageContract
[OperationContract]
Group GetA(GUIDWRAPPER id);
//This DOES NOT WORK, because int has no MessageContract!
[OperationContract]
Group GetB(int id);
}
[MessageContract]
public class GUIDWRAPPER
{
public GUIDWRAPPER() { }
public GUIDWRAPPER(Guid id)
{
Id = id;
}
[MessageBodyMember]
public Guid Id { get; set; }
}
问题:
当我启动服务主机时,它会抱怨操作“GetB”无效,因为返回类型“Group”有消息约定,而值类型“int”没有。这可能是一个安全漏洞
“GetA”没有问题,因为返回类型和参数类型都有消息约定
可能的解决方案:
1.)我可以像包装GUIDWRAPPER类一样包装所有的值类型,并给它们一个消息约定。但我觉得那又脏又臭
2.)删除所有消息契约,只需使用数据契约即可。然后我失去了控制,发送和接收数据
我的问题:
是否可以将简单的值类型(如本例中的int)传递给具有消息约定返回类型的服务操作?(如本例中的GetB)
运营合同是否有任何属性允许这样做?Hmm为什么除了
[MessageBodyMember
之外还有[DataMember]
?请忽略[DataMember]现在,因为这都是关于消息约定的问题。谢谢。@MickyD是的,正如您从我的示例代码中看到的,我已经知道了。类GUID是GUID的包装器,并且有一个消息约定。正如我在讨论中所写的,它是有效的。我唯一简单的问题是,是否可以传递一个简单的值类型而不是任何消息合同。在我写这个问题之前,我读过这篇文章,但我找不到答案。哦,我没有看到GUID
我的不好。也许可以称之为GuidWrapper
,或者更好的做法是在GetARequest
中用请求作为后缀,这是惯例。你是否开始使用MessageContract
?如果不使用DataContract
。否则您需要仔细研究为什么除了[MessageBodyMember
之外还有[DataMember]
?请忽略[DataMember]现在,因为这都是关于消息约定的问题。谢谢。@MickyD是的,正如您从我的示例代码中看到的,我已经知道了。类GUID是GUID的包装器,并且有一个消息约定。正如我在讨论中所写的,它是有效的。我唯一简单的问题是,是否可以传递一个简单的值类型而不是任何消息合同。在我写这个问题之前,我读过这篇文章,但我找不到答案。哦,我没有看到GUID
我的不好。也许可以称之为GuidWrapper
,或者更好的做法是在GetARequest
中用请求作为后缀,这是惯例。你是否开始使用MessageContract
?如果不使用DataContract
。否则您需要尽职尽责