我有一个做我的头在一个奇怪的问题,一个Web服务方法传递一个派生类,它接受一个抽象类型
我有一个单一的项目定义以下类:
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为客户端上的webservice生成代理时,它似乎创建了AbstractUnitModel的部分抽象实现。这是我问题的根源吗?如果是这样,我该如何解决它?
编辑解决方案:正如所指出的,客户端需要知道所有可以通过线路发送的类。我最终通过删除生成的代理类并引用公共库来解决此问题。这种情况并不理想,但足够好。
重新评论 - 我错过了您尝试在客户端使用服务器对象的事实。您必须在客户端使用“旧式”Web服务的代理对象。使用XmlInclude你应该得到BlastFurnaceUnitModel的代理版本。 – 2009-04-21 07:58:53