2009-04-26 18 views
1

WebサービスとWebサイト(どちらもC#)を同じソリューションに用意しています。私はまた、ソリューションにクラスライブラリを持っています。 WebサービスとWebサイトの両方がこのクラスライブラリを参照します。C#WebサービスとWebサイト共有ライブラリ、サービスはライブラリオブジェクトの異なる "タイプ"を返す

Webサービスには、ライブラリからオブジェクトを作成して返すWebMethodがあります。

「ProFitLibrary.Trainerに型ProFitWebService.Trainerを変換できません」:ウェブサイトは、これを起動し、次のことが起こるしかし

ProFitWebService.Service serviceConn = new ProFitWebService.Service(); 
    ProFitLibrary.Trainer authenticatedTrainer = (ProFitLibrary.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName); 

(同じライブラリーから、もう一度)トレーナーオブジェクトにそれを置くことを試みますここではWebMethod属性は次のとおりです。

[WebMethod] 
public ProFitLibrary.Trainer GetAuthenticatedTrainer(string email) 
{ 
    ProFitLibrary.Trainer returnTrainer = new ProFitLibrary.Trainer(); 
    SqlCommand cmd = new SqlCommand("SELECT * FROM Trainers WHERE EmailAddress = '" + email + "'", conn); 
    conn.Open(); 

    SqlDataReader reader; 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     returnTrainer.TrainerId = reader.GetInt32(reader.GetOrdinal("TrainerId")); 
     returnTrainer.FirstName = reader.GetString(reader.GetOrdinal("FirstName")); 
     returnTrainer.LastName = reader.GetString(reader.GetOrdinal("LastName")); 
     returnTrainer.PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber")); 
     returnTrainer.Address = reader.GetString(reader.GetOrdinal("Address")); 
     returnTrainer.City = reader.GetString(reader.GetOrdinal("City")); 
     returnTrainer.PostalCode = reader.GetString(reader.GetOrdinal("PostalCode")); 
     returnTrainer.EmailAddress = reader.GetString(reader.GetOrdinal("EmailAddress")); 
    } 

    return returnTrainer; 
} 

更新:は、Webサイト上のProFitWebService.Trainerにトレーナーのオブジェクトを変更するには、問題を修正:

ProFitWebService.Service serviceConn = new ProFitWebService.Service(); 
    ProFitWebService.Trainer authenticatedTrainer = (ProFitWebService.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName); 

私は、Webサービスから返されたライブラリオブジェクトは、常にサービスに型付き/接頭辞が付けられているということです - 私はWebサイトとサービスの両方からクラスライブラリを参照すべきではありません。 WebServiceバージョンのオブジェクト(ProFitWebService.Trainerなど)を常に作成する必要があります。

Webサービス内でライブラリを使用しているときにこれを標準的な方法として確認できますか?またはこれをもっと難しくしているのなら、それは本当にです!

答えて

3

WebサービスへのWeb参照を作成すると、プロキシクラスが生成されます。これらのプロキシクラスは、ライブラリのクラスのように見えますが、同じタイプではありません。共有ライブラリの型としてWebサービスから返されたオブジェクトを処理する場合は、ライブラリバージョンとこれらの型のプロキシバージョンを変換するメソッドが必要です。

1

このタイプのことは、リフレクションを使用するときに、実際のアセンブリが異なる場合に発生することがあります。異なるバージョン、コンパイル時、または異なるアセンブリのコピーを使用する場合もあります。あなたのコードがリフレクションを使用しているかどうかはわかりません...

1

ここで問題となるのは、Webサービスのクライアントが、あなたが期待していた通常のタイプではなく、プロキシまたは生成オブジェクトです。私はあなたが必要なインスタンスに型をマップする必要がありますと思います。

1

私がしたことは、各クラスの拡張メソッドを作成して正しいシグネチャに変換することでした。 6つのWebサービス間で共有される20種類のビジネスクラスがある場合はあまり面白くありません: '(

関連する問題