我在一个共享点服务器上运行一个非常简单的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
?
答案 0 :(得分:1)
问题不在于枚举。这与WCF流的概念有关。您有一个Web方法,它接受两个参数,其中第一个参数类型为Stream
。这不受支持,因为保存要流式传输的数据的参数可以作为方法中唯一的参数存在。请参阅here。
我认为,对于您当前的OperationContract,如果您尝试创建服务主机,则会得到InvalidOperationException
,并说操作必须有一个类型为Stream的参数。
您可以通过引入新类型并将流和封装封装在其中来解决此问题。