情况:
我有这个服务合同:
[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);
}
在这种情况下,Group 有一个消息契约,并且这个消息契约继承了服务契约的安全级别。组如下所示:
[MessageContract]
public class Group: Entity, ICloneable
{
public Group(){}
[MessageBodyMember]
public String Name {get;set;}
}
GUIDWRAPPER 类型是一个简单的 Guid 包装器,它也有一个消息契约:
[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)
运营合同是否有任何属性允许这样做?