SOAP WCF服务引用更改方法的参数

时间:2013-09-19 14:54:20

标签: c# wcf visual-studio soap strongly-typed-dataset

我目前正在使用我的一个SOAP WCF服务遇到一些非常奇怪的问题。 问题是Visual Studio中的ServiceReference-Tool改变了我的一些方法的参数。

例如:

如果这是我的界面定义(摘录):

namespace ****.PrimeTime.PrimeTime
{
    [ServiceContract]
    public interface IPrimeTimeWS
    {
        [...]
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CostDataset ReadCost(****.PrimeTime.BusinessObjects.SearchCostDataset searchDataset, ****.Framework.SharedComponents.Paging pagingInfo);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CostDataset WriteCost(****.PrimeTime.BusinessObjects.CostDataset data, bool modifyRowState);
    }
}

这是我的服务定义(摘录):

namespace ****.PrimeTime.PrimeTime
{
    public class PrimeTimeWS : IPrimeTimeWS
    {
        [...]
        public ****.PrimeTime.BusinessObjects.CostDataset WriteCost(****.PrimeTime.BusinessObjects.CostDataset data, bool modifyRowState)
        {
            [...]
        }
        public ****.PrimeTime.BusinessObjects.CostDataset ReadCost(****.PrimeTime.BusinessObjects.SearchCostDataset searchDataset, ****.Framework.SharedComponents.Paging pagingInfo)
        {
            [...]
        }
    }
}

,wsdl文件正确(WriteCost有两个参数,CostDataset和bool)。

但是当我在客户端添加服务引用时,它看起来像这样:

WriteCost in Service Reference ReadCost方法按预期工作,问题是在所有(!)我的Write方法中,任何其他数据集都被TimeDataDataset取代。除了使用哪些数据集之外,在写方法之外的任何其他方法中都不会发生这种情况。

我现在已经解决了这个问题将近一天,但无法取得任何进展。

我已经尝试过:

  • 删除并重新创建服务参考
  • 清理和重建服务和客户端
  • 向空项目添加服务引用 - >同样的事情发生了
  • CostDataset与TimeDataDataset或任何其他数据集(结构上)没有任何不同
  • 如果我手动更改Reference.cs以使参数正确,那么只要我不更新服务引用就会有效,但会覆盖我的更改。

有什么想法吗? 如果您需要更多的源代码,我可以提供它,我只是不想把所有代码放在这里,因为那会有点太多了......

2 个答案:

答案 0 :(得分:2)

通常,当发生类似这样的事情时,正在使用的dll不是您认为正在使用的dll。

例如:

  • 是否从IIS站点读取WSDL?检查网站的配置,指向它所指向的目录?
  • GAC中是否有正在使用的副本而不是bin目录中的版本?
  • 代码中是否存在阻止构建dll的错误,因此旧版本正在使用?

当发生这种情况时,我在JustDecompile中打开dll以确保其中的内容。

答案 1 :(得分:1)

我刚从拼写错误的帮助中“意外地”解决了这个问题。

问题的原因是您无法在OperationContract中重用参数名称。

此代码:

 [OperationContract]
        ****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset data, bool modifyRowState);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset data, bool modifyRowState);

将无效,因为“data”参数会以不同的类型重复使用。 为了使它工作,我重新命名了接口中的所有参数,以便它们的名称前缀为方法名称,如下所示:

 [OperationContract]
        ****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset WriteProject_data, bool WriteProject_modifyRowState);
        [OperationContract]
        ****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany_data, bool WriteCompany_modifyRowState);

解决。