使用Autofac通过ChannelFactory注册端点的WCF合约不匹配错误

| 我有一个WCF服务,当被一个简单的MVC应用程序访问时,该服务就可以工作。 当我尝试从与Autofac连接的另一个MVC应用程序在同一终结点上进行呼叫时,出现如下所示的绑定/合同不匹配异常: 内容类型application / soap + xml; 服务http:// localhost:6985 / ProductService.svc不支持charset = utf-8。 客户端和服务绑定可能不匹配。 System.Net.WebException:远程服务器返回错误:(415)不支持的媒体类型。 我有足够的信心确定我的两端没有配置失配,我有信心在不存在Autofac的WCF + MVC组合上测试完全相同的设置。配置设置位于pastebin.com/t7wfR77h上。 因此,我想分析一下我在Autofac中注册依赖项/端点的方式是否有问题... MVC应用中用于Autofac设置的* Application_Start *代码:
var builder = new ContainerBuilder();
//other registrations...

builder.Register(c => 
            new ChannelFactory<IProductService>(
                new WSHttpBinding(\"ProductService_wsHttpBinding\"),
                new EndpointAddress(\"http://localhost:6985/ProductService.svc\")
            )
        ).SingleInstance();

builder.Register(c =>
        {
            var factory = c.Resolve<ChannelFactory<IProductService>>();
            return factory.CreateChannel();
        }
      ).InstancePerHttpRequest();

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
(出于完整性考虑)我在一个只有一个要注入的依赖项的ProductController中使用它,非常简单:
public class ProductController : AsyncController
{
    private IProductService _service;

    public ProductController(IProductService ps)
    {
        _service = ps;
    }

    //...
    //later simply call
    _service.SomeMethod();
}
已邀请:
如@Nick Josevski的评论中所述,我能够得到一些与工作类似的东西。 在我的MVC3应用程序的Application_Start方法中,我具有以下代码:
protected void Application_Start()
{
    var builder = new ContainerBuilder();
    builder.Register(c => new ChannelFactory<ICartService>(\"CartService\")).SingleInstance();
    builder.Register(c => c.Resolve<ChannelFactory<ICartService>>().CreateChannel()).InstancePerHttpRequest();
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    // other MVC startup activities, like registering areas and routes
}
这些注册从Web.config收集WCF配置数据。我还注册了代码中定义的端点。为了完整起见,这里是一些相关的客户端Web.config条目:
<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name=\"BasicHttpBinding\" ... />
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint address=\"http://localhost:50930/Purchasing/CartService.svc\"
        binding=\"basicHttpBinding\" bindingConfiguration=\"BasicHttpBinding\"
        contract=\"CartService.ICartService\" name=\"CartService\" />
  </client>
</system.serviceModel>
然后,在我的控制器中,我有如下代码:
using Autofac.Features.OwnedInstances;

public class BulkCartController : Controller
{
    private readonly Owned<ICartService> cartService_;

    public BulkCartController(Owned<ICartService> cartService)
    {
        cartService_ = cartService;
    }

    protected override void Dispose(bool disposing) // defined in Controller
    {
        cartService_.Dispose();
        base.Dispose(disposing);
    }

    //
    // GET: /BulkCart/Get/1
    public ActionResult Get(int id)
    {
        var model = new ShoppingCart { ShoppingCartId = id };
        using (var cartService = cartService_)
        {
            model.Items = cartService.Value.GetCartProductItems(id);
        }
        return View(\"Get\", model);
    }
}
单元测试如下所示:
using Autofac.Features.OwnedInstances;
using Autofac.Util;
using Moq;

[TestMethod]
public void Get_ReturnsItemsInTheGivenCart()
{
    var mock = new Mock<ICartService>(MockBehavior.Strict);
    mock.Setup(x => x.GetCartProductItems(2)).Returns(new CartProductItemViewObject[0]);
    var controller = new BulkCartController(new Owned<ICartService>(mock.Object, new Autofac.Util.Disposable())); 
    var result = controller.Get(2);

    Assert.IsInstanceOfType(result, typeof(ViewResult));
    var view = (ViewResult)result;
    Assert.AreEqual(\"Get\", view.ViewName);

    Assert.IsInstanceOfType(view.ViewData.Model, typeof(ShoppingCart));
    var model = (ShoppingCart)view.ViewData.Model;
    Assert.AreEqual(2, model.ShoppingCartId);
    Assert.AreEqual(0, model.Items.Length);
}
我使用抽象控制器测试基类中定义的单元测试来验证处置:
[TestClass]
public abstract class ControllerWithServiceTestBase<TController, TService>
    where TController : Controller
    where TService : class
{
    [TestMethod]
    public virtual void Dispose_DisposesTheService()
    {
        var disposable = new Mock<IDisposable>(MockBehavior.Strict);
        disposable.Setup(x => x.Dispose()).Verifiable();

        var controller = (TController) Activator.CreateInstance(typeof(TController), new Owned<TService>(null, disposable.Object));
        controller.Dispose();

        disposable.Verify();
    }
}
我还不知道的一件事是,是否同时使用ѭ7和ѭ8提供了足够的处置空间,还是根据An Autofac Lifetime Primer,我是否需要使用ѭ9。

要回复问题请先登录注册