【问题标题】:Method parameter is missing in WCF proxy classWCF 代理类中缺少方法参数
【发布时间】:2011-12-13 23:59:09
【问题描述】:

我有一个 WCF 方法定义如下:

[OperationContract]
Message GetSourceData(SourceDataQuery sourceDataQuery);

而实际的实现是这样的:

public Message GetSourceData(SourceDataQuery sourceDataQuery)
    {

        IEnumerable<ExportRow> sourceData = repo.GetData();

        var customBodyWriter = new CustomBodyWriter(sourceData);
        var message = Message.CreateMessage(MessageVersion.Soap11, "GetSourceData", customBodyWriter);

        return message;
    }

SourceDataQuery 对象:

[MessageContract]
public class SourceDataQuery
{
    [MessageBodyMember]
    public int DataSourceId { get; set; }

    [MessageBodyMember]
    public int[] FiledIds { get; set; }

    [MessageBodyMember]
    public string Filter { get; set; }

    [MessageBodyMember]
    public string Sort { get; set; }
}

我的问题是当我将此 WCF 服务添加到另一个项目并通过添加服务引用创建代理时,我的代理类有一个 GetSourceData 方法,但它的输入参数丢失。它不带任何参数。我可以看到 SourceDataQuery 对象是在代理类中正确生成的。

知道为什么缺少输入参数吗?

【问题讨论】:

  • 检查 WSDL。很可能用于引用服务的 URL 具有较旧的代码,即没有此参数的方法。
  • @amit_g,我从scrath创建了一个新项目,它也有同样的问题。
  • 正如@amit_g 所说,听起来您的服务运行的版本不正确。要检查这一点,您可以尝试重建服务并在不同的服务路径下发布。
  • 如果在添加服务引用对话框的高级设置中加厚/取消加厚始终生成消息合同会怎样?

标签: wcf message proxy-classes messagecontract


【解决方案1】:

尝试改用 DataContract。它可能会解决您的问题

[DataContract]
      public class SourceDataQuery
        {

            [DataMember]
            public int DataSourceId { get; set; }

            ....
        }

【讨论】:

  • 不能使用 DataContract,因为我的返回类型是使用 MessageContractAttribute 的 Message。
  • @Otake msdn.microsoft.com/en-us/library/ms734675.aspx我没试过,但它似乎工作......
  • 感谢您的回复。我知道,如果我使用 Message 作为输入参数并使用 Message.CreateMessage 从 SourceDataQuery 对象实例化它,它将起作用。我必须将 SourceDataQuery 上的 MessageContgract 属性更改为 DataContract 属性,但不知道为什么。但我不明白的是,为什么 SourceDataQuery 作为输入参数在使用 MessageContractAttribute 时不起作用?我有几种方法,我宁愿不在我的客户端和服务器上进行这种转换。同样根据 msdn 它应该可以工作...
【解决方案2】:

尝试将serviceclient对象包装在IService接口中,例如写:

ServiceReference1.IService1 serviceclient = new ServiceReference1.Service1Client();

而不是

ServiceReference1.Service1Client serviceclient = new ServiceReference1.Service1Client();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多