ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 根据抽象类公开WCF子类

2019-06-11 01:00:20  阅读:151  来源: 互联网

标签:c wcf abstract-class


我有一个抽象类,我希望能够向WCF公开,以便任何子类也可以作为WCF服务启动.
这是我到目前为止:

[ServiceContract(Name = "PeopleManager", Namespace = "http://localhost:8001/People")]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[DataContract(Namespace="http://localhost:8001/People")]
[KnownType(typeof(Child))]
public abstract class Parent
{
    [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "{name}/{description}")]
    public abstract int CreatePerson(string name, string description);

    [OperationContract]
    [WebGet(UriTemplate = "Person/{id}")]
    public abstract Person GetPerson(int id);
}

public class Child : Parent
{
    public int CreatePerson(string name, string description){...}
    public Person GetPerson(int id){...}
}

尝试在我的代码中创建服务时,我使用此方法:

public static void RunService()
{
    Type t = typeof(Parent); //or typeof(Child)
    ServiceHost svcHost = new ServiceHost(t, new Uri("http://localhost:8001/People"));
    svcHost.AddServiceEndpoint(t, new BasicHttpBinding(), "Basic");
    svcHost.Open();
}

使用Parent作为我得到的服务类型
在服务“Parent”实施的合同列表中找不到合同名称“Parent”.
要么
服务实现类型是接口或抽象类,并未提供任何实现对象.

当我使用Child作为我得到的服务类型时
Namespace.Child类型的服务类都定义了一个ServiceContract,并从Namespace.Parent类型继承了ServiceContract.合同继承只能在接口类型中使用.如果类使用ServiceContractAttribute标记,则另一个服务类无法从中派生.

有没有办法公开Child类中的函数,所以我不必专门添加WCF属性?

编辑
所以这

[ServiceContract(Name= "WCF_Mate", Namespace="http://localhost:8001/People")]  
    public interface IWcfClass{}  

    public abstract class Parent : IWcfClass {...}  
    public class Child : Parent, IWcfClass {...}

用Child返回启动服务
合同类型Namespace.Child未归属于ServiceContractAttribute.为了定义有效的合同,必须使用ServiceContractAttribute来声明指定的类型(合同接口或服务类).

解决方法:

服务合同通常是一个接口,而不是一个类.将您的合同放入一个接口,让抽象类实现此接口,并告诉我们当您使用Child启动该服务时会发生什么.

编辑:好的,现在您需要将RunService方法修改为以下内容.合同类型,如果是IWcfClass,而不是Child或Parent.

public static void RunService()
{
        Type t = typeof(Child);
        ServiceHost svcHost = new ServiceHost(t, new Uri("http://localhost:8001/People"));
        svcHost.AddServiceEndpoint(typeof(IWcfClass), new BasicHttpBinding(), "Basic");
        svcHost.Open();
}

标签:c,wcf,abstract-class
来源: https://codeday.me/bug/20190611/1215046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有