2010-04-09 54 views
1

我知道有一个类似的问题here没有解决方案。WCF - CODEGEN:由于消息FileRequest具有标题而生成消息合同

我正在通过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: Generating message contract since message FileRequest has headers

。最终的结果是服务合约将FileRequest操作包装到我不想要的包装中。

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

注: 我没有检查在服务引用“始终生成消息协定”。

+0

这不是一个错误 - 它只是一个信息说明 – 2010-04-09 07:50:03

+1

我知道这不是一个错误,因为它仍然会编译,我只是表示它是一个错误,因为它是一个意外的结果。 – 2010-04-09 16:50:28

回答

0

你可能想尝试使用消息合同的IsWrapped属性:

[MessageContract(IsWrapped=false)] 

不是100%确定你需要哪一个(truefalse),但是这是你可以尝试的选择之一。另外,还有一种观察:我认为使用名为FileRequest的方法和也称为FileRequest的消息合约是有点冒险的。

一般公认最好实践的研究将是有一种方法GetFile,对于请求消息称为GetFileRequest和响应消息类型GetFileResponse。不要对不同的东西使用相同的名称。

+0

我试过IsWrapped = false/true,结果没有什么区别。我改变了MessageContract FileRequest的名字,但没有结果。任何其他想法? – 2010-04-09 16:49:51

1

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