考虑这种情况:
我现在所做的是为同一服务添加服务引用,并在服务配置文件中添加额外的端点+客户端。在net.tcp上工作。
它工作正常,但我在某个地方读到你可以使用"在过程中#34;托管以在不使用代理的情况下连接到服务。通过这种方式,您可以摆脱配置并获得更清晰的代码。
所以使用配置设置设置而不是这个:
DeliveryOwnClient.DeliveryClient deliveryObject = new DeliveryOwnClient.DeliveryClient("netTcpDeliveryService");
我想在没有任何配置的情况下使用它:
IDelivery deliveryObject = InProcessFactory.CreateInstance<DeliveryService.Delivery, IDelivery>();
但是这引发了一个例外,即#{3}}的ChannelDispatcher与合同&#34; IMetadataExchange&#34;无法打开IChannelListener。 Uri net.tcp:// localhost:9003 / DeliveryService&#34;
已经存在注册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 基地址,但由于已经在 net.tcp 上运行了某些内容,因此失败了。
**编辑**
至少弄明白为什么。
该服务在app.config中配置了两个baseaddresses
<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?
答案 0 :(得分:1)
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);