我遇到了一个奇怪的问题。

我在单个项目中定义了以下类:

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);
            }


但是我的项目无法编译,并且出现以下错误:
错误109'CalibrationClient.UnitModelRemoteServer.RemoteModelExecutionWebService.remotelyExecuteUnitModelAsync(CalibrationClient.UnitModelRemoteServer.AbstractUnitModel)的最佳重载方法匹配具有一些无效的参数

错误110参数“ 1”:无法从“ UnitModelWrapperInterface.BlastFurnaceUnitModel”转换为“ CalibrationClient.UnitModelRemoteServer.AbstractUnitModel”

我不知道为什么会这样。我在服务器项目中引用了定义AbstractUnitModel的名称空间。对我来说,唯一让我觉得有些有趣的是,它使用的是来自'CalibrationClient'命名空间的AbstractUnitModel,而不是UnitModelWrapperInterface。似乎当VS在客户端上为Web服务生成代理时,它会创建AbstractUnitModel的部分抽象实现。这是我问题的根源吗?如果是这样,我该如何解决?

编辑解决方案:如前所述,客户端需要了解可以通过网络发送的所有类。最后,通过删除生成的代理类并引用公共库来解决此问题。在这种情况下并不理想,但足够好。

最佳答案

您可以尝试[XmlInclude]

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


值得一试,至少...

(编辑)或在方法级别:

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


(不确定第二个)

关于c# - 将派生类传递给采用抽象类型的Web服务方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/771439/

10-09 13:47