WCF - CODEGEN:生成消息合同,因为消息FileRequest具有标头

时间:2010-04-09 07:40:16

标签: wcf

我知道有一个类似的问题here没有解决方案。

我正在通过HTTP开展WCF流媒体服务。

以下是我的MessageContract

[MessageContract]
public class FileRequest
{
    #region Message Header

    [MessageHeader(MustUnderstand = true)]
    public Credential Credentials { get; set; }

    #endregion

    #region Message body

    [MessageBodyMember(Order = 1)]
    public FileInfo FileInfo { get; set; }

    #endregion

    #region Ctor

    // ...

    #endregion

}

[MessageContract]
public class FileRequestResponse
{
    #region Message Header

    [MessageHeader(MustUnderstand = true)]
    public FileInfo FileHeader { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public OperationResult<bool> OperationResult { get; set; }

    #endregion

    #region Message Body

    [MessageBodyMember]
    public Stream FileStream { get; set; }

    #endregion


    #region Constructor

    // ...

    #endregion

}

这是我的ServiceContract

[ServiceContract(Namespace = "https://service.contract.example.com")]
public interface IUpdateService
{
    [OperationContract(Action = "GetUpdates")]
    OperationResult<List<FileInfo>> GetUpates(ApplicationInfo applicationInfo, Credential credential);

    [OperationContract(Action = "GetFile")]
    FileRequestResponse FileRequest(FileRequest fileRequest);
}

现在的问题是我收到此错误的原因:

  

// CODEGEN:生成消息   自FileRequest消息以来的合同   头

当我添加我的服务参考时。最终结果是服务契约将FileRequest操作包装到我不想要的包装器中。

public FileInfo FileRequest(Credential Credentials, FileInfo, out OperationResult<bool> OperationResult, out System.IO.Stream FileStream)

注意: 我没有在服务参考中检查“始终生成消息合同”。

2 个答案:

答案 0 :(得分:1)

为服务中的所有邮件合同设置[MessageContract(IsWrapped=true)],然后尝试生成代理。

答案 1 :(得分:0)

您可能想尝试在邮件合同中使用IsWrapped属性:

[MessageContract(IsWrapped=false)]

不是100%确定您需要哪一个(truefalse),但这是您可以尝试的选项之一。

另外,另一个观察:我认为有一个名为FileRequest的方法和一个名为FileRequest的消息合同有点冒险。

普遍接受的最佳实践是拥有一个方法GetFile,一个名为GetFileRequest的请求消息和一个响应消息类型GetFileResponse。不要对不同的东西使用相同的名称。

相关问题