【问题标题】:WCF MessageContract formatting issueWCF MessageContract 格式问题
【发布时间】:2011-09-26 01:51:17
【问题描述】:

我对 MessageContact 和客户端调用函数的 WCF 定义有问题。

情景;客户端使用字符串类型引用 ID 调用服务,服务器响应 AudioObject 类型的实例。 AudioObject 由作为 MessageBodyMember 的 Stream 和作为 MessageHeader 的 FormatObject 组成。

以下是 WCF 代码 sn-p。

[ServiceContract]
public interface IAudioStreamService
{
    [OperationContract]
    AudioObject GetAudioDataStream(StringMessage RefID);
}

//StringMessageContract
[MessageContract]
public class StringMessage
{
    [MessageBodyMember]
    public string Name;
}

[MessageContract]
public class AudioObject
{
    Stream _audioStream;
    AudioFormat _audioFormat;

    [MessageBodyMember (Order=1)]
    public Stream AudioStream
    {
        get { return _audioStream; }
        set { _audioStream = value; }
    }

    [MessageHeader(MustUnderstand=true)]
    public AudioFormat AudioFormat
    {
        get { return _audioFormat; }
        set { _audioFormat = value; }
    }
}

[DataContract]
public class AudioFormat
{
    int _nChannels;
    int _nKilloBitsPerSec;
    int _nSamplesPerSec;

    [DataMember(Name="nChannels", Order=0, IsRequired=true)]
    public int nChannels
    {
        get { return _nChannels; }
        set { _nChannels = value; }
    }
    [DataMember(Name = "nKilloBitsPerSec", Order = 1, IsRequired = true)]
    public int nKilloBitsPerSec
    {
        get { return _nKilloBitsPerSec; }
        set { _nKilloBitsPerSec = value; }
    }
    [DataMember(Name = "nSamplesPerSec", Order = 2, IsRequired = true)]
    public int nSamplesPerSec
    {
        get { return _nSamplesPerSec; }
        set { _nSamplesPerSec = value; }
    }
}

客户端代码如下,

BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = 176160768;                       
EndpointAddress endpointAddress = new EndpointAddress("URLToService");
AudioStreamServiceClient client = new AudioStreamServiceClient(binding, 
endpointAddress);
    AudioFormat audioFormat = client.GetAudioDataStream("000", out serverStream); 

上面的代码运行良好。但问题是,

为了OperationContract的格式,我期望客户端代码如下,

AudioObject audioObject = client.GetAudioDataStream("0000");

但我的 ServiceReference 以另一种方式生成了客户端存根(如代码所示)。谁能解释一下这件事的原因。

【问题讨论】:

  • 我从 [WCF 方法显示无效参数][1] 中找到了解决方案。简单地说,转到 ConfigureServiceReference,启用 始终生成消息协定 复选框。 [1]:stackoverflow.com/questions/3600198/…

标签: wcf


【解决方案1】:

要么通过从ClientBase 派生类来自己编写客户端,要么使用您选择的方法签名编写扩展方法。

【讨论】:

  • 谢谢你的回答,但我期待更复杂的解释;为什么要更改语法或哪些属性会进行这些更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多