2015年6月21日日曜日

WCF サービスとオーバーロード

WCF サービスでオーバーロードで取得データを初期化時とそうでない時とで切り替えようと画策してみましたが、WCF サービスではオーバーロードがサポートされていませんでした。

自分はこんなかんじで引数の違う、同一名の関数を用意していました。
[OperationContract]
public Dictionary<int, string> GetWork()
{
    ...
}

[OperationContract]
public Dictionary<int, string> GetWork(int id)
{
    ...
}

WCF サービス(例えば Service1.cs) で定義した関数は、aspx 側でインテリセンスが自動的にクラス名や関数をリストアップしてくれているのですが、このオーバーロードを仕込んだ後はインテリセンスも表示されなくなりました。あと、上記のオーバーロード状態では、ビルドは通るのですがクライアントサイドの JavaScript でサービスを初期化しようとするとサービスが見つかりません。

そのまま実行するとこんなランタイムエラーが出ます。












ワークアラウンドとしては2つ

1.関数を全く異なる名前にしてしまう
2.OperationContract 属性に Name プロパティを指定して関数を別名登録

[OperationContract(Name = "GetAllWork")]
public Dictionary<int, string> GetWork()
{
    ...
}
1と2両方とも、JavaScript 的には別名の関数になりますが、C# コードはオーバーロードとなりますので管理はし易くなるはず!


参考情報:
Can we implement method overloading in web service class?
http://stackoverflow.com/questions/10320006/can-we-implement-method-overloading-in-web-service-class

0 件のコメント:

コメントを投稿