状況:
私はこのサービス契約を持っています:
[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; }
}
問題:
サービス ホストを起動すると、戻り値の型「Group」にはメッセージ コントラクトがあり、値の型「int」には含まれていないため、操作「GetB」が無効であると不平を言います。これはセキュリティ上の欠陥の可能性があります。
戻り値の型とパラメーターの型の両方にメッセージ コントラクトがあるため、"GetA" は問題ありません。
可能な解決策:
1.) GUIDWRAPPER クラスで行ったように、すべての値の型をラップし、それらにメッセージ コントラクトを与えることができます。しかし、それは私には汚くて臭いと感じます。
2.) すべてのメッセージ コントラクトを削除し、データ コントラクトのみを使用します。次に、どのデータが送受信されるかを制御できなくなります。
私の質問:
メッセージ コントラクトの戻り値の型を持つサービス操作に単純な値の型 (この場合は int など) を渡すことは可能ですか? (この場合は GetB のように)
それを許可する操作コントラクトの属性はありますか?