Недавно я реализовал 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
Спасибо! Это сработало! Об этом заводе нет в документации по адресу http://docs.autofac.org/en/latest/ от 9/12/2016. –