2

私は頭を悩ませている奇妙な問題を抱えています。

1 つのプロジェクトで次のクラスを定義しています。

public abstract class AbstractUnitModel {

      public void executeRemoteModel(){}

}

//this class also implements a seperate interface, but I dont think that is the issue
public class BlastFurnaceUnitModel : AbstractUnitModel, IUnitModel {}

今、このようなことを試してみると、期待どおりに動作します:

class Class1
{

    public void method1() {

        BlastFurnaceUnitModel b = new BlastFurnaceUnitModel();
        method2(b);
    }

    public void method2(AbstractUnitModel a) {}

 }

これで、Web メソッドを公開する別のプロジェクトができました。このメソッドは AbstractUnitModel を取得してリモートで実行し、結果をクライアントに返します。したがって、サーバーには次のものがあります。

 [WebMethod]
 public AbstractUnitModel remotelyExecuteUnitModel(UnitModelWrapperInterface.AbstractUnitModel unitModel)
        {

           unitModel.executeRemoteModel();
           return unitModel;

         }

そして、クライアントにはこれがあります:

   public void remoteExecution() {

                var unitModelWebService = new UnitModelRemoteServer.RemoteModelExecutionWebService();
                unitModelWebService.remotelyExecuteUnitModelCompleted += new UnitModelRemoteServer.remotelyExecuteUnitModelCompletedEventHandler(remoteExecutionCompleted);
                unitModelWebService.remotelyExecuteUnitModelAsync(this.remoteBF);
            }

しかし、私のプロジェクトはコンパイルされず、次のエラーが発生 します。

エラー 110 引数 '1': 'UnitModelWrapperInterface.BlastFurnaceUnitModel' から 'CalibrationClient.UnitModelRemoteServer.AbstractUnitModel' に変換できません

なぜこれが起こっているのかわかりません。サーバー プロジェクトには、AbstractUnitModel が定義されている名前空間への参照があります。少しおかしいと思ったのは、UnitModelWrapperInterface ではなく「CalibrationClient」名前空間の AbstractUnitModel を使用していることだけです。VS がクライアントで Web サービスのプロキシを生成すると、AbstractUnitModel の部分的な抽象実装が作成されるようです。これが私の問題の原因ですか?もしそうなら、どうすればそれを修正できますか?

解決策の編集: 指摘したように、クライアントはネットワーク経由で送信される可能性のあるすべてのクラスについて知る必要があります。生成されたプロキシ クラスを削除し、共通ライブラリを参照することで、これを解決しました。理想的ではありませんが、この状況では十分です。

4

3 に答える 3

1

これは、オブジェクトがサービスから取得されたときにインスタンス化するために使用されるクラスであるプロキシ クラス (サービス コード ファイルを開くと表示されます) が WSDL ツールによって作成されるために発生します。

これを回避したい場合は、WCF を使用することをお勧めします。これは、Web サービスもポリモーフィズムを処理できないため、返されるポリモーフィック オブジェクトも処理します (したがって、remoteExecuteUnitModel メソッドの戻り値の型は常に AbstractUnitModel.

于 2009-04-21T07:44:52.820 に答える
0

あなたが試すかもしれません[XmlInclude]

[XmlInclude(typeof(BlastFurnaceUnitModel))]
public abstract class AbstractUnitModel {...}

少なくとも試してみる価値はあります...

(編集)またはメソッドレベルで:

[WebMethod(), XmlInclude(typeof(BlastFurnaceUnitModel))]
public AbstractUnitModel remotelyExecuteUnitModel(...) {...}

(2番目についてはあまり確信が持てません)

于 2009-04-21T07:28:05.513 に答える
0

WebService で公開されるクラスは、サービス参照内の別の名前空間に作成されます。

私は通常、次のようなメソッドを作成します

WebServiceReferenceNS.AbstractUnitModel ToWebServiceModel(AbstractUnitModel unitModel)
{
}

WebService のクラスを準備します。しかし、よりエレガントなソリューションがあるかどうかを確認したいと思います。

于 2009-04-21T09:09:13.070 に答える