我目前正在使用我的一个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)。
但是当我在客户端添加服务引用时,它看起来像这样:
ReadCost方法按预期工作,问题是在所有(!)我的Write方法中,任何其他数据集都被TimeDataDataset取代。除了使用哪些数据集之外,在写方法之外的任何其他方法中都不会发生这种情况。
我现在已经解决了这个问题将近一天,但无法取得任何进展。
我已经尝试过:
有什么想法吗? 如果您需要更多的源代码,我可以提供它,我只是不想把所有代码放在这里,因为那会有点太多了......
答案 0 :(得分:2)
通常,当发生类似这样的事情时,正在使用的dll不是您认为正在使用的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);
解决。