2016-09-09 4 views
0

Недавно я реализовал Autofac в качестве контейнера IoC на нашем C# .Net-решении, которое содержит службы RESTful WCF. Это, казалось, работало достаточно хорошо, пока некоторые из наших потребителей не заметили, что они больше не могут получать ответы в XML, установив заголовок Accept в application/xml. Теперь он будет возвращать JSON, независимо от заголовка Accept.Принять: приложение/xml больше не работает после реализации Autofac в службах RESTful WCF

Я думаю, проблема связана с заменой Factory="System.ServiceModel.Activation.WebServiceHostFactory" на Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" в файле Service.svc, который требуется для реализации Autofac.

У кого-нибудь есть решение для этого?

Ниже приведен упрощенный образец репрезентативного кода.

Service.svc:

<%@ ServiceHost 
    Language="C#" 
    Service="MySolution.MyService, MySolution.MyService" 
    CodeBehind="WcfServiceImplementations/Service.cs" 
    Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" 
%> 

IMyService.cs:

... 
[ServiceContract(Name = "MyService", Namespace = "WebServices")] 
[ServiceKnownType(typeof(Object))] 
public interface IMyService 
{ 
    /// Comments 
    [OperationContract] 
    [WebGet(UriTemplate = "Method/{Id}", 
      BodyStyle = WebMessageBodyStyle.Bare, 
      RequestFormat = WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json)] 
    Object MyMethod(string Id); 
    ... 
} 

MyService.cs:

... 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class MyService : IMyService 
{ 
    private readonly IMyDependency _myDependency; 

    public MyService (IMyDependency myDependency) 
    { 
     _myDependency = myDependency;   
    } 

    public Object MyMethod(string Id) 
    { 
     // Method code here 
    } 
    ... 
} 

global.asax:

public class Global : HttpApplication 
{ 
    private void Application_Start(object sender, EventArgs e) 
    { 
     // Autofac initialization is actually in another class, but we call it here like this 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<MyService>().AsSelf(); 

     builder.RegisterType<MyDependency>().As<IMyDependency>();    

     var container = builder.Build(); 

     AutofacHostFactory.Container = container; 
     ... 
    } 
} 

сырье запрос от Скрипач:

GET http://localhost/MySolution/MyService.svc/MyMethod/12345 HTTP/1.1 
Accept: application/xml 
Authorization: meyer.john 

ответ

1

Попробуйте AutofacWebServiceHostFactory вместо AutofacServiceHostFactory.

+0

Спасибо! Это сработало! Об этом заводе нет в документации по адресу http://docs.autofac.org/en/latest/ от 9/12/2016. –

 Смежные вопросы

  • Нет связанных вопросов^_^