一个WCF,数据协定:
[ServiceContract]
public interface IService
{
[OperationContract]
string dd(string s);
}
[DataContract]
public enum Gender
{
[EnumMember]
Girl,
[EnumMember]
Boy
}
实现类:
public class MyService : IService
{
public string dd(string s)
{
Gender ge = Gender.Boy;
return ge.ToString() + s;
}
}
客户端:
private void Button_Click(object sender, RoutedEventArgs e)
{
aaa.ServiceClient client = new aaa.ServiceClient();
string s = client.dd("gh");
MessageBox.Show(s);
}
在上面的代码中,服务中有一个数据协定,是一个Gender枚举,在服务实现类中,有用到这个枚举值,在客户端也能正常输出值:Boygh
但是,为什么在客户端不能访问Gender枚举呢?如下图:
哪位知道吗?
------解决思路----------------------
你的服务
return ge.ToString() + s;
哪里向客户端输出 Gender 类型了?
------解决思路----------------------
客户端怎么可能知道服务器端内部使用了什么东东?你这个描述本身就不合逻辑。
------解决思路----------------------
你内部用到了这个枚举,但操作契约并没用到,所以生成服务引用时并不会生成这个契约
------解决思路----------------------
dll放到单独的dll中供客户端服务端使用是一种方案,另外添加服务引用时可以选择使用已经添加的数据契约
------解决思路----------------------
成员:
[EnumMember]
------解决思路----------------------
在vs里面,高级里面有
------解决思路----------------------
无需那么复杂啊,你搞这个这么长时间了,跟你说了那么多次,昨天也说了,你将服务契约、数据契约全部放在一个命名空间下,枚举的数据契约自然也放在下面,然后服务端跟客户端都引用这个命名空间,生成后两端都会有其dll,这样开发的时候即便契约有什么地方修改了,无需重新引用dll,不要再像你现在这样通过地址引用,引用dll,这条路不要去走,定义在了数据契约里,不可能找不到该枚举的。还有,我个人不建议在wcf中用枚举,这跟其他数据契约相关,一不注意取值就是错的。
------解决思路----------------------
简单一点
解决方案下:
1客户端
2服务端
3契约类库
4windows服务
5控制台
上面一个解决方案下5个项目,5个命名空间
客户端、服务端都引用契约类库的命名空间
windows服务与控制台引用服务端命名空间
控制台是用于测试调试用的