作为自己的客户的服务

时间:2016-05-27 12:18:39

标签: c# wcf

考虑这种情况:

  1. WCF服务已启动并正在运行。
  2. 服务需要每隔一段时间调用一次。
  3. 我现在所做的是为同一服务添加服务引用,并在服务配置文件中添加额外的端点+客户端。在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?

1 个答案:

答案 0 :(得分:1)

杰伊设法搞清楚了! 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);