服务器方法中的额外参数

本文关键字:参数 方法 服务器 | 更新日期: 2023-09-27 18:00:53

我有一个关于在服务器上扩展方法的后果的问题,如果你能帮助我,我将不胜感激。

让我们假设如下。我在服务器上有一个方法:

public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
    someDataLocator.SaveData(someDataEntities);
}

并从客户端调用它,如:

public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{
    this.Invoke("SaveSomeData", new object[] { someDataEntities });
}

现在,我需要将其扩展到

public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
    someDataLocator.SaveData(someDataEntities, mode);
}

我需要提供向后兼容性。所以,如果用户使用旧版本,并且他试图只使用一个参数来调用此方法,会发生什么?服务器会猜测这是相同的方法并调用它吗?如果是,"mode"字符串(第二个参数(是null还是空?或者它只会抛出一个异常,表示客户端试图调用一个不存在的函数。有没有可能在不重复同时使用一个和两个参数的方法的情况下解决这个问题。

服务器方法中的额外参数

您可以简单地将旧签名标记为过时,然后用空字符串调用新签名

[Obsolete]
public void SaveSomeData(SomeDataEntity[] someDataEntities)
{
  someDataLocator.SaveData(someDataEntities, string.Empty);
}
WCF不支持方法重载,因为WSDL不允许有两个同名的方法。您可以通过在重载方法上提供OperationContract的Name属性来实现它。
[OperationContract(Name="SaveSomeDataDefault")]
public void SaveSomeData(SomeDataEntity[] someDataEntities) 
{
    this.Invoke("SaveSomeData", new object[] { someDataEntities });
}
[OperationContract(Name="SaveSomeDataWithMode")]
public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
    someDataLocator.SaveData(someDataEntities, mode);
}

但这也不是一个好的做法,因为它会导致调试跟踪等问题。这种做法是保留单独的方法,而不是在WCF中使用重载。

我通过实验找到了答案。

它理解这是必要的方法并调用它。当我从facade中只有一个参数的旧客户端调用这个方法时,

public void SaveSomeData(SomeDataEntity[] someDataEntities, string mode)
{
    someDataLocator.SaveData(someDataEntities, mode);
}

在CCD_ 1等于CCD_ 2的服务器上执行。

因此,我可以在"someDataLocator"中轻松处理它。向后兼容性本身就是提供的。