gpt4 book ai didi

.net - 托管实现通用接口(interface)的 C# 通用类的 WCF 服务

转载 作者:行者123 更新时间:2023-12-01 11:05:35 24 4
gpt4 key购买 nike

我有一个公开通用接口(interface)的 WCF 服务(并且该服务有一个实现此接口(interface)的通用类)。

然后我尝试在托管控制台应用程序中托管此服务(目前仅用于测试目的)。 ThreadStart 行导致错误提示找不到 T 的类型。

现在我不能通过执行 Main< T >(string[] args) where T: IComparable< T > 使 Main 通用,因为那时它说,Main entry point not found。

我的问题是一般如何处理这种情况?

    // Service Hosting app
static void Main(string[] args)
{
new Thread(new ThreadStart(StartBSTService<T>)).Start();
}

static void StartBSTService<T>() where T : IComparable<T>
{
string baseAddress = "http://localhost:8080/bst";

StartAService(typeof(BSTService<T>), baseAddress);
}

编辑:同时添加服务类

  [ServiceContract(Namespace = "http://Microsoft.Samples.GettingStarted")]
public interface IBSTService<T> where T : IComparable<T> //: ICollection<T>
{
[OperationContract]
void Add(T toAdd);
// For brevity, not providing all other methods
// but they are similar IColleciton methods.
}

public class BSTService<T> : IBSTService<T> where T : IComparable<T>
{
BinarySearchTree<T> tree = new BinarySearchTree<T>();

public void Add(T toAdd)
{
tree.Add(toAdd);
}
}

客户端将像使用任何通用类型一样使用它:

    BSTService<string> client = new BSTService<string>; 
// OR
BSTService<int> client = new BSTService<int>;

编辑 2:@asawyer 的观点似乎合乎逻辑,Main 是泛型类的使用者,因此它应该提供类型,但是我是否必须为每种类型启动一个新端点?以及如何处理。就像我可以编写一个服务包装器,它只公开一种方法,比如 INIT(Type typeOfBST)。客户端调用它来告诉服务他想要启动 int 或 string BST。然后客户端调用具有给定类型的真实方法,服务将这些调用引导到不同的端点,每个端点都暴露不同类型的 BST。

一般如何处理这种情况?

最佳答案

当您托管服务时,您不能使用开放泛型。您必须指定具体类型来托管具体服务。如果您想为更通用的参数托管服务,您确实必须为每个参数类型创建一个新主机,并为每个参数公开一个具有唯一地址的端点。托管服务后,它必须能够说明它接受的类型并在服务描述(WSDL 的来源)中描述它们。

WCF 在您托管服务的基础上工作,该服务必须能够描述它接受的消息 - 因此它生成服务描述。服务能够根据描述序列化消息。任何平台上的任何客户端都可以使用描述并将正确的消息发送到服务 - 客户端将从描述中了解消息的允许内容,并且由于该服务主机必须使用具体类型 - 而不是 T。

您可以通过将基本类型指定为泛型参数来克服这个问题,但即使在那之后您的服务也必须知道所有可以使用的派生类型而不是基本类型(有多种技术可以解决这个问题,但没有一种提供随机类型) .

编辑:

从技术上讲,您要求的意思是:将类型的名称从客户端发送到主服务。主服务将检查该类型的服务是否已经存在。如果是,它会将服务的 URL 发送回客户端。如果不是,它将通过反射创建服务并启动它。它将存储有关新托管服务的信息并将 url 发送回客户端。

另一种变体是预先启动所有服务并具有单个 WCF 路由服务,该服务会将请求路由到正确的服务。

这样的解决方案看起来像是维护噩梦,第一个的性能会差得多,因为每个操作都需要两次网络调用。此外,它通常不可互操作,因为您的客户必须预先获得通用契约(Contract)才能调用此类服务​​。不要这样做 - 定义有限的已用类集,并使用 KnownTypeDataContractResolver 进行单一服务。

关于.net - 托管实现通用接口(interface)的 C# 通用类的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6226832/

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