gpt4 book ai didi

c# - 基于抽象类公开 WCF 子类

转载 作者:太空狗 更新时间:2023-10-30 00:36:52 26 4
gpt4 key购买 nike

我有一个抽象类,我希望能够将其公开给 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”实现的契约(Contract)列表中找到契约(Contract)名称“Parent”。或者服务实现类型为接口(interface)或抽象类,未提供实现对象。

当使用 Child 作为我得到的服务类型时
Namespace.Child 类型的服务类既定义了一个 ServiceContract,又从 Namespace.Parent 类型继承了一个 ServiceContract。契约继承只能在接口(interface)类型之间使用。如果一个类标有 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 返回启动服务
契约(Contract)类型 Namespace.Child 不具有 ServiceContractAttribute 属性。为了定义有效的契约,指定的类型(契约接口(interface)或服务类)必须使用 ServiceContractAttribute 进行属性化。

最佳答案

服务契约通常是一个接口(interface),而不是一个类。将您的合约放入接口(interface)中,让抽象类实现该接口(interface),并让我们知道当您使用 Child 启动服务时会发生什么。

编辑:好的,现在您需要将您的 RunService 方法修改为如下所示。如果是 IWcfClass,则为契约(Contract)类型,而不是 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 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com