読者です 読者をやめる 読者になる 読者になる

WCF サービスでメソッドをオーバーロードする方法

.net

WCF のサービスコントラクトでは、OperationContractAttribute を付けたメソッドのオーバーロードが出来ません。厳密に言えば、同じ名前のメソッドをクライアントに公開できません。

例えば次のサービス。同名のメソッドが3つ定義されていて、その全てに OperationContractAttribute が付いています。

[ServiceContract]
public interface ISampleService
{
    [OperationContract]
    string GetName(string userCode);

    [OperationContract]
    string GetName(Guid userId);

    [OperationContract]
    string GetName(string userCode, int groupNo);
}

このインタフェースを実装したサービスを ServiceHost でホストしようとすると、InvalidOperationxception が発生します。

この問題は、メソッド名を変更するか、OperationContractAttribute の Name プロパティを使えば回避可能。

OperationContractAttribute の Name プロパティを使ったサンプルは次の通りです。

[ServiceContract]
public interface ISampleService
{
    [OperationContract(Name = "GetNameByCode")]
    string GetName(string userCode);

    [OperationContract(Name = "GetNameById")]
    string GetName(Guid userId);

    [OperationContract(Name = "GetNameByCodeAndGroupId")]
    string GetName(string userCode, int groupNo);
}

個人的には、サービスコントラクトのメソッドはオーバーロードしないで、違う名前を付けた方が良いと思います。Name プロパティを使った場合でも、名前の重複を避ける必要があるので。