不能使我的WCF扩展工作

本文关键字:扩展 工作 WCF 我的 不能 | 更新日期: 2023-09-27 18:15:56

我有一个由以下类库组成的WCF解决方案:

  1. 运动。Services:包含服务的实现类。
  2. 运动。ServiceProxy:包含在客户端实例化的类。
  3. 运动。HttpHost:包含服务(*.)svc文件)。

我从控制台应用程序调用服务,"第一个版本"工作得很好,所以我采取了下一步,即创建自定义ServiceHostFactory, ServiceHost和InstanceProvider,这样我就可以在我的服务中使用构造函数注入,正如本文所解释的那样。

这些类在另一个类库中实现:
4. 锻炼。StructureMapWcfExtension

现在,尽管我已经修改了我的服务this:

<%@ ServiceHost Language="C#" Debug="true" Factory="Exercise.StructureMapWcfExtension.StructureMapServiceHostFactory" Service="Exercise.Services.PurchaseOrderService" %>

我总是得到以下异常:

System.ServiceModel。通信异常安全协商失败因为远程方没有及时回复。这可能是因为底层传输连接被中止。

在这行代码中失败:

    public class PurchaseOrderProxy : ClientBase<IPurchaseOrderService>, IPurchaseOrderService
    {
        public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.CreatePurchaseOrder(purchaseOrderRequest); //Fails here
        }
}

但这还不是全部,我添加了一个跟踪网络。下面是日志文件中出现的错误:

系统。不能提供服务类型作为服务加载,因为它没有默认值(parameter-less)构造函数。要解决这个问题,请添加一个默认值或将该类型的实例传递给宿主。

所以这意味着我的ServiceHostFactory永远不会被击中,我甚至在它的构造函数和方法中设置了一个断点,它们永远不会被击中。

我已经将StructureMapWcfExtension库的引用添加到所有其他库(甚至控制台客户端),一个接一个地无效。

我还尝试在主机的web中使用该选项。配置文件来配置工厂,如下所示:

<serviceHostingEnvironment>
  <serviceActivations>
    <add service="Exercise.Services.PurchaseOrderService" relativeAddress="PurchaseOrderService.svc" factory="Exercise.StructureMapWcfExtension.StructureMapServiceHostFactory"/>
  </serviceActivations>
</serviceHostingEnvironment>

那也不行。

请我需要帮助,让这个工作,所以我可以把它纳入我们的项目。

谢谢。

UPDATE:这是服务主机工厂的代码:

namespace Exercise.StructureMapWcfExtension
{
    public class StructureMapServiceHostFactory : ServiceHostFactory
    {
        private readonly Container Container;
        public StructureMapServiceHostFactory()
        {
            Container = new Container();
            new ContainerConfigurer().Configure(Container);
        }
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new StructureMapServiceHost(Container, serviceType, baseAddresses);
        }
    }

    public class ContainerConfigurer
    {
        public void Configure(Container container)
        {
            container.Configure(r => r.For<IPurchaseOrderFacade>().Use<PurchaseOrderFacade>());
        }        
    }

   public class StructureMapServiceHost : ServiceHost
   {
       public StructureMapServiceHost(Container container, Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
       {
           if (container == null) throw new ArgumentNullException("container");
           var contracts = ImplementedContracts.Values;
           foreach (var c in contracts)
           {
               var instanceProvider = new StructureMapInstanceProvider(container, serviceType);
               c.Behaviors.Add(instanceProvider);
           }
       }
   }

   public class StructureMapInstanceProvider : IInstanceProvider, IContractBehavior
   {
       private readonly Container Container;
       private readonly Type ServiceType;
       public StructureMapInstanceProvider(Container container, Type serviceType)
       {
           if (container == null) throw new ArgumentNullException("container");
           if (serviceType == null) throw new ArgumentNullException("serviceType");
           Container = container;
           ServiceType = serviceType;
       }
       public object GetInstance(InstanceContext instanceContext)
       {
           return GetInstance(instanceContext, null);
       }
       public object GetInstance(InstanceContext instanceContext, Message message)
       {
           return Container.GetInstance(ServiceType);
       }
   }
}

不能使我的WCF扩展工作

查看StructureMapInstanceProvider的代码,它看起来缺少dispatchrtime . instanceprovider的设置。我从链接的web页面复制了清单5。它是icontrackbehavior接口的一部分。

public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = this;
}