1

私は必死にこれを機能させようとしています。以前は、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 です。

4

2 に答える 2

0

友人に助けてもらい、*.svc ファイルを web.ui プロジェクトに保持し、コードビハインド ファイルを別の UI.Services プロジェクトに保持することで解決しました。

私の *.svc ファイルのマークアップ ファイルに、次のものが追加されました。

<%@ ServiceHost Language="C#" Debug="true" Service="MyWebApp.UI.Services.MyAsyncService, MyWebApp.UI.Services"  Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>

これにより、循環参照の問題は回避されましたが、新しいアセンブリを追加するというコストがかかりました。

ブートローダーに次を追加しました。

public static class MyBootLoader
{
    public static IContainer Boot()
    {
        var builder = ConfigureContainer();
        var container = builder.Build();

        AutofacHostFactory.Container = container;

        return container;
    }
    private static ContainerBuilder ConfigureContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<PersonManager>().As<IPersonProvider>().InstancePerHttpRequest();
        return builder;
    }
}
于 2013-05-15T16:18:31.583 に答える