C# Can';我不能让我的WCF扩展工作

C# Can';我不能让我的WCF扩展工作,c#,wcf,dependency-injection,C#,Wcf,Dependency Injection,我有一个WCF解决方案,它由以下类库组成: 服务:包含服务的实现类 Exercise.ServiceProxy:包含在客户端中实例化的类 Exercise.HttpHost:包含服务(*.svc文件) 我从控制台应用程序调用该服务,“第一个版本”运行得非常好,因此我采取了下一步,即创建自定义ServiceHostFactory、ServiceHost和InstanceProvider,以便在我的服务中使用构造函数注入,如中所述 这些类在另一个类库中实现: 4.Exercise.Structure

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

  • 服务:包含服务的实现类
  • Exercise.ServiceProxy:包含在客户端中实例化的类
  • Exercise.HttpHost:包含服务(*.svc文件)
  • 我从控制台应用程序调用该服务,“第一个版本”运行得非常好,因此我采取了下一步,即创建自定义ServiceHostFactory、ServiceHost和InstanceProvider,以便在我的服务中使用构造函数注入,如中所述

    这些类在另一个类库中实现:
    4.Exercise.StructureMapWcfExtension

    现在,即使我已经修改了我的服务:

    <%@ ServiceHost Language="C#" Debug="true" Factory="Exercise.StructureMapWcfExtension.StructureMapServiceHostFactory" Service="Exercise.Services.PurchaseOrderService" %>
    
    
    
    我总是会遇到以下例外情况:

    System.ServiceModel.CommunicationException安全协商失败 因为远程方没有及时发回回复。 这可能是因为基础传输连接已中止

    这行代码失败:

        public class PurchaseOrderProxy : ClientBase<IPurchaseOrderService>, IPurchaseOrderService
        {
            public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
            {
                return base.Channel.CreatePurchaseOrder(purchaseOrderRequest); //Fails here
            }
    }
    
    公共类PurchaseOrderProxy:ClientBase,IPurchaseOrderService
    {
    公共PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest PurchaseOrderRequest)
    {
    return base.Channel.CreatePurchaseOrder(purchaseOrderRequest);//此处失败
    }
    }
    
    但这并不是全部,我向web.config文件添加了一个跟踪,这是日志文件中出现的错误:

    System.InvalidOperationException无法指定提供的服务类型 无法作为服务加载,因为它没有默认值 (无参数)构造函数。要解决此问题,请添加默认值 构造函数,或将该类型的实例传递给主机

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

    我已经将StructureMappwcfExtension库的引用一个接一个地添加到所有其他库(甚至控制台客户端)中,但没有任何效果

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

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

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

    多谢各位

    更新:以下是服务主机工厂代码:

    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);
           }
       }
    }
    
    namespace Exercise.StructureMapWcfExtension
    {
    公共类结构MapServiceHostFactory:ServiceHostFactory
    {
    专用只读容器;
    public StructureMapServiceHostFactory()
    {
    容器=新容器();
    新建ContainerConfigure().Configure(容器);
    }
    受保护的重写ServiceHost CreateServiceHost(类型serviceType,Uri[]baseAddresses)
    {
    返回新的StructureMapServiceHost(容器、服务类型、基本地址);
    }
    }
    公共类容器配置器
    {
    公共void配置(容器)
    {
    Configure(r=>r.For().Use());
    }        
    }
    公共类结构MapServiceHost:ServiceHost
    {
    公共结构MapServiceHost(容器容器,类型serviceType,参数Uri[]基地址)
    :base(服务类型、基本地址)
    {
    如果(container==null)抛出新的ArgumentNullException(“container”);
    var合同=已实施的合同。价值;
    foreach(合同中的var c)
    {
    var instanceProvider=新结构MapInstanceProvider(容器,服务类型);
    c、 添加(instanceProvider);
    }
    }
    }
    公共类结构MapInstanceProvider:IIInstanceProvider,IContractBehavior
    {
    专用只读容器;
    私有只读类型ServiceType;
    公共结构MapInstanceProvider(容器容器,类型serviceType)
    {
    如果(container==null)抛出新的ArgumentNullException(“container”);
    如果(serviceType==null)抛出新的ArgumentNullException(“serviceType”);
    容器=容器;
    服务类型=服务类型;
    }
    公共对象GetInstance(InstanceContext InstanceContext)
    {
    返回GetInstance(instanceContext,null);
    }
    公共对象GetInstance(InstanceContext InstanceContext,消息)
    {
    返回Container.GetInstance(ServiceType);
    }
    }
    }
    
    查看StructureMapInstanceProvider的代码,它似乎缺少dispatchRuntime.InstanceProvider的设置。我从您的链接网页复制了清单5。它是IContractBehavior接口的一部分

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

    将StructureMapServiceHostFactory代码复制到问题中。代码中可能有线索。永无止境的WCF扩展…StructureMapServiceHost代码如何。@Simon:完成。我还添加了InstanceProvider以防万一。请尝试使用。客户端是否真的产生了任何网络流量,它看起来是否正确?另外,您是否尝试过查看客户机的配置,并确保所有配置都正确无误?这并不是很有帮助,但我在尝试将StructureMap与WCF结合使用时遇到了问题。我很早就认输了,因为我发现使用Autofac要容易得多。-StructureMap需要一个认真的文档大修.OMG!我只是讨厌这种情况发生。我花了两个小时试图弄明白为什么这不起作用。非常感谢你。