我有一个奇怪的问题,正在努力。
我在一个项目中定义了以下类:
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的部分抽象实现。这是我的问题的根源吗?如果是这样,我该怎么办呢?
编辑解决方案:正如所指出的,客户端需要知道可以通过网络发送的所有类。我最终通过删除生成的代理类并引用公共库来解决这个问题。不理想但在这种情况下足够好。
答案 0 :(得分:1)
您可以尝试[XmlInclude]
:
[XmlInclude(typeof(BlastFurnaceUnitModel))]
public abstract class AbstractUnitModel {...}
值得一试,至少......
(编辑)或在方法级别:
[WebMethod(), XmlInclude(typeof(BlastFurnaceUnitModel))]
public AbstractUnitModel remotelyExecuteUnitModel(...) {...}
(对第二个不太确定)
答案 1 :(得分:1)
这是因为WSDL工具创建了代理类(打开服务代码文件,您将看到它们),这些类是用于在对象来自服务时实例化的类。
如果您想避免这种情况,最好使用WCF。这也处理多态返回的对象,因为webservices也不能处理多态(因此remoteExecuteUnitModel方法的返回类型总是AbstractUnitModel。
答案 2 :(得分:0)
WebService中公开的类是在服务引用中的不同命名空间中创建的。
我通常会创建一个类似
的方法WebServiceReferenceNS.AbstractUnitModel ToWebServiceModel(AbstractUnitModel unitModel)
{
}
为WebService准备类。但我想看看是否有更优雅的解决方案。