gpt4 book ai didi

c# - 作为自己的客户的服务

转载 作者:行者123 更新时间:2023-11-30 12:41:25 27 4
gpt4 key购买 nike

考虑这个场景:

  1. WCF 服务已启动并正在运行。
  2. 服务需要每隔一段时间调用一次。

我现在所做的是添加对同一服务的服务引用,并在服务配置文件中添加额外的端点 + 客户端。在 net.tcp 上工作。

它工作正常,但我在某处读到您可以使用“进程中”托管来连接到服务而无需使用代理。这样您就可以摆脱配置并拥有更简洁的代码。

所以用随附的配置设置代替这个:

DeliveryOwnClient.DeliveryClient deliveryObject = new DeliveryOwnClient.DeliveryClient("netTcpDeliveryService");

我想在没有任何配置的情况下使用它:

IDelivery deliveryObject = InProcessFactory.CreateInstance<DeliveryService.Delivery, IDelivery>();

但这会引发异常,“位于 http://localhost:8003/DeliveryService 的 ChannelDispatcher 与契约(Contract)“IMetadataExchange”无法打开 IChannelListener。Uri net.tcp://localhost:9003/DeliveryService 的注册已经存在”

CreateInstance 的实现如下所示:

ServiceHost host = new ServiceHost(typeof(S));
string address = "net.pipe://" + Environment.MachineName + "/" + Guid.NewGuid();

host.AddServiceEndpoint(typeof(I), Binding, address);
host.Open();

所以我添加了一个 net.pipe baseaddress 但它失败了,因为已经有一些东西在 net.tcp 上运行。

** 编辑 **

至少弄清楚为什么会发生这种情况。

该服务在 app.config 中配置有两个基址

<service name="DeliveryService.Delivery">
<endpoint binding="netTcpBinding" contract="DeliveryService.IDelivery"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8003/DeliveryService" />
<add baseAddress="net.tcp://localhost:9003/DeliveryService" />
</baseAddresses>
</host>
</service>

构建宿主时

ServiceHost host = new ServiceHost(typeof(S));                

它在配置文件中找到该部分并自动添加 net.tcp 和 http 基地址。我添加了 net.pipe,但这并不重要。当服务打开时,它发现 net.tcp 已经在运行,所以它不会继续。

所以我想我的问题变成了:是否可以在不读取 app.config 的情况下构造一个 ServiceHost?

最佳答案

Jay 想出了办法! ServiceHost 派生自 ServiceHostBase,该类有一个名为 ApplyConfiguration 的虚函数。所以我创建了一个派生自 ServiceHost 并覆盖 ApplyConfiguration 的类...并将其留空。

class ServiceHostNoConfig<S> : ServiceHost where S : class
{
public ServiceHostNoConfig(string address)
{
UriSchemeKeyedCollection c = new UriSchemeKeyedCollection(new Uri(address));
InitializeDescription(typeof(S), c);
}

public new void InitializeDescription(Type serviceType, UriSchemeKeyedCollection baseAddresses)
{
base.InitializeDescription(serviceType, baseAddresses);
}

protected override void ApplyConfiguration()
{
}
}

像这样使用它:

        ServiceHost host = new ServiceHostNoConfig<S>(address);

host.AddServiceEndpoint(typeof(I), Binding, address);

关于c# - 作为自己的客户的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37483402/

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