Can't make my WCF extension work

Posted by Sergio Romero on Stack Overflow See other posts from Stack Overflow or by Sergio Romero
Published on 2011-11-29T00:54:49Z Indexed on 2011/11/29 1:50 UTC
Read the original article Hit count: 341

Filed under:
|
|

I have a WCF solution that consists of the following class libraries:

  1. Exercise.Services: Contains the implementation classes for the services.
  2. Exercise.ServiceProxy: Contains the classes that are instantiated in the client.
  3. Exercise.HttpHost: Contains the services (*.svc files).

I'm calling the service from a console application and the "first version" works really well so I took the next step which is to create a custom ServiceHostFactory, ServiceHost, and InstanceProvider so I can use constructor injection in my services as it is explained in this article.

These classes are implemented in yet another class library:
4. Exercise.StructureMapWcfExtension

Now even though I've modified my service this:

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

I always get the following exception:

System.ServiceModel.CommunicationException Security negotiation failed because the remote party did not send back a reply in a timely manner. This may be because the underlying transport connection was aborted.

It fails in this line of code:

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

But that is not all, I added a trace to the web.config file and this is the error that appears in the log file:

System.InvalidOperationException The service type provided could not be loaded as a service because it does not have a default (parameter-less) constructor. To fix the problem, add a default constructor to the type, or pass an instance of the type to the host.

So this means that my ServiceHostFactory is never being hit, I even set a breakpoint in both its constructor and its method and they never get hit.

I've added a reference of the StructureMapWcfExtension library to all the other ones (even the console client), one by one to no avail.

I also tried to use the option in the host's web.config file to configure the factory like so:

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

That didn't work either.

Please I need help in getting this to work so I can incorporate it to our project.

Thank you.

UPDATE: Here's the service host factory's code:

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>());
        }        
    }
}

© Stack Overflow or respective owner

Related posts about c#

Related posts about wcf