2

我有一个奇怪的问题正在困扰我。

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

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 的部分抽象实现。这是我问题的根源吗?如果是这样,我该如何解决它?

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

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(...) {...}

(不太确定第二个)

于 2009-04-21T07:28:05.513 回答
0

WebService 中公开的类是在服务引用内的不同命名空间中创建的。

我通常会创建一个类似的方法

WebServiceReferenceNS.AbstractUnitModel ToWebServiceModel(AbstractUnitModel unitModel)
{
}

为 WebService 准备类。但我想看看是否有更优雅的解决方案。

于 2009-04-21T09:09:13.070 回答