使用MessageContract会在启动时崩溃WCF服务

时间:2011-05-24 05:58:18

标签: c# wcf messagecontract wcf-streaming

我正在尝试将MessageContract添加到我的WCF服务,类似于此问题中的内容:WCF: using streaming with Message Contracts

以下是我得到的例外情况: 无法加载“UploadFile”操作,因为它具有System.ServiceModel.Channels.Message类型的参数或返回类型,或者具有MessageContractAttribute的类型和其他不同类型的参数。使用System.ServiceModel.Channels.Message或使用MessageContractAttribute类型时,该方法不得使用任何其他类型的参数。

这是我的合同:

[ServiceContract]
public interface IFile
{
    [OperationContract]
    bool UploadFile(FileUpload upload);
}
[MessageContract]
public class FileUpload
{
    [MessageHeader(MustUnderstand = true)]
    public int Username { get; set; }
    [MessageHeader(MustUnderstand = true)]
    public string Filename { get; set; }
    [MessageBodyMember(Order = 1)]
    public Stream ByteStream { get; set; }
}

这是我在app.config中使用的绑定配置:

  <netTcpBinding>
    <binding name="TCPConfiguration" maxReceivedMessageSize="67108864" transferMode="Streamed">
      <security mode="None" />
    </binding>
  </netTcpBinding>

现在我认为这可能与我正在使用的绑定类型有关,但我不完全确定。

2 个答案:

答案 0 :(得分:7)

从评论看起来你有问题,一旦你开始使用消息合同,你必须将它们用于所有参数,这意味着你的方法不能返回bool它必须返回另一个消息合同,比如说FileUploadResult。

尝试更改它以返回void并查看它是否加载以及是否确实更改它以返回一个归类为消息合同的类。

关于this MSDN page的第一个注释警告此问题,并包含可能提供更多信息的链接。

答案 1 :(得分:0)

这基本上意味着特定操作在以下任何组合中使用消息协定类型和基本类型的组合:

MixType1: Contract type and primitive types as operation parameters
MixType2: Contract type as a parameter and primitive type as return type
MixType3: Primitive type as a parameter and Contract type as return type

上面列出的任何一种情况都会产生错误。

更多详情:http://www.codeproject.com/Articles/199543/WCF-Service-operations-can-t-be-loaded-due-to-mixi