当前位置: 代码迷 >> C# >> WCF,数据协约,客户端不能访问成员
  详细解决方案

WCF,数据协约,客户端不能访问成员

热度:37   发布时间:2016-05-05 02:36:15.0
WCF,数据协定,客户端不能访问成员?
一个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 类型了?
------解决思路----------------------
引用:
在上面的代码中,服务中有一个数据协定,是一个Gender枚举,在服务实现类中,有用到这个枚举值,在客户端也能正常输出值:Boygh
但是,为什么


客户端怎么可能知道服务器端内部使用了什么东东?你这个描述本身就不合逻辑。
------解决思路----------------------
你内部用到了这个枚举,但操作契约并没用到,所以生成服务引用时并不会生成这个契约
------解决思路----------------------
dll放到单独的dll中供客户端服务端使用是一种方案,另外添加服务引用时可以选择使用已经添加的数据契约
------解决思路----------------------
成员:
[EnumMember]
------解决思路----------------------
在vs里面,高级里面有
------解决思路----------------------
无需那么复杂啊,你搞这个这么长时间了,跟你说了那么多次,昨天也说了,你将服务契约、数据契约全部放在一个命名空间下,枚举的数据契约自然也放在下面,然后服务端跟客户端都引用这个命名空间,生成后两端都会有其dll,这样开发的时候即便契约有什么地方修改了,无需重新引用dll,不要再像你现在这样通过地址引用,引用dll,这条路不要去走,定义在了数据契约里,不可能找不到该枚举的。还有,我个人不建议在wcf中用枚举,这跟其他数据契约相关,一不注意取值就是错的。
------解决思路----------------------
简单一点
解决方案下:
1客户端
2服务端
3契约类库
4windows服务
5控制台

上面一个解决方案下5个项目,5个命名空间
客户端、服务端都引用契约类库的命名空间
windows服务与控制台引用服务端命名空间
控制台是用于测试调试用的
  相关解决方案