将枚举传递给服务中的方法

时间:2014-10-16 18:03:20

标签: c# wcf enums

我在一个共享点服务器上运行一个非常简单的WCF服务,其ServiceContract看起来像这样:

[ServiceContract]
interface iSPTest
{
    [OperationContract]
    Stream Process(Stream input);
}

这很好用,我可以使用svcutil生成代理和配置文件。但是,我想改变它以获取枚举:

    [OperationContract]
    Stream Process(Stream input, MyEnumType foo);

定义enum

[DataContract]
public enum MyEnumType 
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Foo,
    [EnumMember]
    Bar
};

但是,当我这样做时,我再也无法生成代理了。我收到一个错误:

Metadata contains a reference that cannot be resolved: 'http://myserver/_vti_
bin/SPTest/SPTest.svc'.

The requested service, 'http://myserver/_vti_bin/SPTest/SPTest.svc' could not
be activated. See the server's diagnostic trace logs for more information.

看起来这应该是一件简单的事情。我已尝试将ServiceKnownType添加到ServiceContract,但这似乎没有帮助。为什么它似乎无法获取枚举类型?对于奖励积分,是否可以在服务器引用的程序集中使用现有的枚举但客户端不会?因为在这种情况下,无法用enum标记DataContract

1 个答案:

答案 0 :(得分:1)

问题不在于枚举。这与WCF流的概念有关。您有一个Web方法,它接受两个参数,其中第一个参数类型为Stream。这不受支持,因为保存要流式传输的数据的参数可以作为方法中唯一的参数存在。请参阅here

我认为,对于您当前的OperationContract,如果您尝试创建服务主机,则会得到InvalidOperationException,并说操作必须有一个类型为Stream的参数。

您可以通过引入新类型并将流和封装封装在其中来解决此问题。