古き良き .asmx Web サービス (「メッセージ」Web サービスと呼びましょう) があり、下位互換性のために保持する必要があります。.asmx サービスは、次のメソッドを公開します。
[WebMethod(Description = "Do Something")]
public int DoSomething(Entity1 e)
{
...
}
この Web サービスは、DLL から参照されるいくつかのエンティティを使用します。次に例を示します。
namespace Software.Project.Entities
{
[DataContract]
public class Entity1
{
[DataMember]
public string property1{ get; set; }
// Lots of other properties...
}
}
この DLL は、新しい WCF サービスでも使用されます。ここで、WCF から古い .asmx メソッドを呼び出す必要があります。これを行うには、WCF プロジェクトで、"サービス参照の追加" ウィザード ([高度] - [Web 参照の追加]) を使用して、.asmx プロジェクトへの参照を追加しました。
さて、素晴らしい!次のように、WCF から DoSomething メソッドを呼び出すことができます。
Entity1 e1 = new Entity1();
Software.Project.WCFService.ServiceReferenceName.Message m = new Software.Project.WCFService.ServiceReferenceName.Message();
m.Url = ConfigurationManager.AppSettings["MessageWebServiceURL"];
int r = m.DoSomething(e1);
残念ながら、そうしてもうまくいきません。WCF の Entity1 がメソッド DoSomething の引数として適切でない場合のようなコンパイラ エラーが発生します。私がしなければならないことは次のとおりです。
Entity1 e2 = new Software.Project.WCFService.ServiceReferenceName.Entity1();
Software.Project.WCFService.ServiceReferenceName.Message m = new Software.Project.WCFService.ServiceReferenceName.Message();
m.Url = ConfigurationManager.AppSettings["MessageWebServiceURL"];
int r = m.DoSomething(e2);
そうすることで、コンパイラは呼び出しを受け入れます。問題は、WCF サービスの Entity1 がフィールドとデータでいっぱいであり、すべてのデータを新しいエンティティにコピーする必要があることです。
また、サービス参照として .asmx への参照を追加し、「参照アセンブリで型を再利用する」というフラグを立ててみましたが、結果はまったく同じでした。
Entity1 がまったく同じエンティティであることを理解させる方法がないなんて信じられません! それは本当に不可能ですか?