2011-04-20 5 views
2

간단한 MVC 응용 프로그램에서 액세스 할 때 작동하는 WCF 서비스가 있습니다.Autofac을 사용하여 ChannelFactory를 통해 끝점을 등록하는 WCF 계약 불일치 오류

내가 Autofac와 최대 유선의 다른 MVC 응용 프로그램에서 같은 엔드 포인트에 전화를 할 때 나는이 같은 바인딩/계약 불일치 예외를 얻을 :

Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost:6985/ProductService.svc . The client and service bindings may be mismatched.

System.Net.WebException: The remote server returned an error: (415) Unsupported Media Type.

나는 합리적 해요 양쪽 모두의 구성 설정이 일치하지 않는다고 확신하며 Autofac이없는 WCF + MVC 조합에서 동일한 설정을 테스트 할 때이 자신감을 바탕으로합니다. 구성 설정은 pastebin.com/t7wfR77h입니다.

내가 Autofac와 종속성/엔드 포인트를 등록하는 방식에 문제가 있는지 나는 때문에 도움이 분석을하고자

...

* 위해 Application_Start * Autofac 설정을위한 MVC 애플리케이션 코드 :

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)); 
I이 활용 (완전성)

은 주입 만 1 종속성을 가지는 ProductController 매우 간단에 주석에서 설명한 바와 같이

public class ProductController : AsyncController 
{ 
    private IProductService _service; 

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

    //... 
    //later simply call 
    _service.SomeMethod(); 
} 
+0

나에게 WCF 구성 문제처럼 보이지만, 제안 할 것이 많지 않습니다. 웹의 단서 ... http://blogs.msdn.com/b/endpoint/archive/2010/11/01/wcf- webhttp-service-returns-http-415-unsupported-media-type.aspx 행운을 빌어 요! –

+0

@Nicholas, 이것을 보아 주셔서 감사합니다. WCF 문제가 아니기를 바래서 쉽게 해결할 수 있습니다. –

+0

@neontapir 어쩌면 당신이 대답을 포기해야합니다, 내가 포기하고 그것을 작동시키지 않았다;) –

답변

2

@ 닉 요셉 스키, 나는 일과 비슷한 것을 얻을 수있었습니다.

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 구성 데이터를 수집 : 내 MVC3 응용 프로그램의 위해 Application_Start 방법에

, 나는 다음과 같은 코드가 있습니다. 또한 코드에 정의 된 끝점을 사용하기 위해 등록을 받았습니다. 완성도를 들어, 다음은 관련 클라이언트 측의 Web.config 항목의 일부입니다 :

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

단위 테스트는 다음과 같습니다 :

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

내가 추상 컨트롤러 테스트의 기본 클래스에 정의 된 단위 테스트와 처분의 유효성을 검사 :

나는 아직까지 모릅니다

한 가지 Owned<T>Dispose()의 사용은 나에게 적절한 처리를 제공하거나, 내가 LifetimeScopeAn Autofac Lifetime Primer 당을 사용해야합니다 있는지 여부입니다.