1

状況:

私はこのサービス契約を持っています:

[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 のように)

それを許可する操作コントラクトの属性はありますか?

4

0 に答える 0