【问题标题】:Passing an enum to a method in a service将枚举传递给服务中的方法
【发布时间】:2014-10-16 18:03:19
【问题描述】:

我有一个非常简单的 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,但这似乎没有帮助。为什么它似乎无法选择枚举类型?对于奖励积分,是否可以在服务器引用但客户端没有的程序集中使用现有枚举?因为在那种情况下,不可能用DataContract 标记enum

【问题讨论】:

    标签: c# wcf enums


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,听起来不错。再搜索一些,这个:cm-bloggers.blogspot.com/2011/06/… 看起来是正确的方法。
    • 有趣的是,当使用 MySteam 自定义消息契约时,如果我有 Stream Process(MySteam input);,它将无法工作,它必须是 MySteam Process(MySteam input);,并且代理坚持创建一个带有 @ 签名的方法987654328@
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2019-07-23
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多