私は必死にこれを機能させようとしています。以前は、WCF サービスを使用して、手間をかけずに JQuery で AJAX を実行していました。
現在、私は DI に Autofac を使用していますが、UI プロジェクトの WCF サービスを AJAX のベースにするまでは、これまでのところ順調に進んでいます。通常の Web アプリケーションでは、Global.asax 'Application_Start' を使用してコンテナーを登録しています。これは、'MyBootstrapper' プロジェクトで Boot() メソッドを呼び出すことによって行われます。Boot() メソッドは、すべてのモジュールを登録するだけです。
ここで、WCF サービスがあり、「AJAX 対応の WCF サービス」テンプレートを使用すると、サービスが呼び出されると Global.asax が呼び出されないことに気付きました。
このために、Bootstrapper で Boot() メソッドを呼び出す void host_Opening メソッドを使用して、単純な MyServiceHostFactory を作成しました。これはうまくいきそうです。何も設定されていませんが。
ここに私のWCFコードがあります:
[ServiceContract(Namespace = "MyWebApp.UI.Ajax")]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyAsyncService
{
public IPersonProvider PersonManager { get; set; }
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public List<Person> GetPersons()
{
var persons = PersonManager.GetPersons();
return persons;
}
}
MyAsyncService のマークアップ
<%@ ServiceHost Language="C#" Debug="true" Service="MyWebApp.UI.Ajax.MyAsyncService" CodeBehind="MyAsyncService.svc.cs" Factory="MyWebApp.UI.Ajax.MyAsyncServiceHostFactory"%>
MyAsyncServiceHostFactory:
public class MyAsyncServiceHostFactory : ServiceHostFactory, IContainerProviderAccessor
{
static IContainerProvider _containerProvider;
public IContainerProvider ContainerProvider
{
get { return _containerProvider; }
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var host = base.CreateServiceHost(serviceType, baseAddresses);
host.Opening += host_Opening;
return host;
}
void host_Opening(object sender, EventArgs e)
{
// Setup Autofac stuff.
var container = MyBootLoader.Boot();
_containerProvider = new ContainerProvider(container);
}
}
そして MyBootLoader:
public static class MyBootLoader
{
public static IContainer Boot()
{
var builder = ConfigureContainer();
return builder.Build();
}
private static ContainerBuilder ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<PersonManager>().As<IPersonProvider>().InstancePerHttpRequest();
return builder;
}
}
私のweb.config:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="MyWebApp.UI.Ajax.MyAsyncServiceAspNetAjaxBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="MyWebApp.UI.Ajax.MyAsyncService">
<endpoint address="" behaviorConfiguration="MyWebApp.UI.Ajax.MyAsyncServiceAspNetAjaxBehavior"
binding="webHttpBinding" contract="MyWebApp.UI.Ajax.MyAsyncService" />
</service>
</services>
</system.serviceModel>
何が欠けていますか?すべてがうまくいっているように見えますが、私の PersonManager は MyAsyncService で NULL です。