1

我目前的 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 ReadCost 方法按预期工作,问题是在所有(!)我的 Write 方法中,任何其他数据集都被 TimeDataDataset 替换。这不会发生在除写入方法之外的任何其他方法中,无论使用哪些数据集。

我已经解决这个问题将近一天了,但无法取得任何改善。

我已经尝试过:

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

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

4

2 回答 2

2

通常,当发生这种情况时,正在使用的 dll 不是您认为正在使用的 dll。

例如:

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

发生这种情况时,我在 JustDecompile 中打开 dll 以确保其中有什么。

于 2013-09-19T18:19:03.780 回答
1

我只是在拼写错误的帮助下“意外”解决了这个问题。

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

这段代码:

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

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

 [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);

解决了。

于 2013-09-22T18:24:44.297 回答