在自托管的WebApi项目中看不到我的控制器

时间:2017-12-20 13:22:45

标签: c# asp.net asp.net-mvc swagger autofac

我创建了一个自托管的web api应用程序,使用TopShelf作为Windows服务运行,使用Autofac进行依赖注入。

这是我的StartUp逻辑:

public class ApiShell : IApiShell
{
    public void Start()
    {
        using (WebApp.Start<Startup>("http://localhost:9090"))
        {
            Console.WriteLine($"Web server running at 'http://localhost:9090'");
        }
    }

    internal class Startup
    {
        //Configure Web API for Self-Host
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();

            GlobalConfiguration.Configuration
              .EnableSwagger(c => c.SingleApiVersion("v1", "Swagger UI"))
              .EnableSwaggerUi();

            //default route
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional });

            app.UseWebApi(config);
        }
    }
}

我按照以下方式启动WebApp:

public class HostService
{
    //when windows service statrts
    public void Start()
    {
        IoC.Container.Resolve<IApiShell>().Start();  //start web app
        IoC.Container.Resolve<IActorSystemShell>().Start();
    }

    //when windows service stops
    public void Stop()
    {
        IoC.Container.Resolve<IActorSystemShell>().Stop();
    }
}

TopShelf配置:

HostFactory.Run(x =>
        {
            x.Service<HostService>(s =>
            {
                s.ConstructUsing(name => new HostService());
                s.WhenStarted(sn => sn.Start());
                s.WhenStopped(sn => sn.Stop());
            });
            x.RunAsLocalSystem();
            x.SetDescription("Sample Service");
            x.SetDisplayName("Sample Service");
            x.SetServiceName("Sample Service");
        });

我的控制器:

public class PingController : ApiController
{
    private IActorSystemShell _actorSystem;

    public PingController(IActorSystemShell actorSystem)
    {
        _actorSystem = actorSystem;
    }

    [HttpGet]
    public async Task<string> Ping()
    {
        var response = await _actorSystem.PingActor.Ask<PingMessages.Pong>(PingMessages.Ping.Instance(), 
            TimeSpan.FromSeconds(10));

        return response.PongMessage;
    }
}

我也安装了Swagger,但是我无法使用以下任一尝试访问我的控制器:

  

http://localhost:9090/api/Ping

     

http://localhost:9090/swagger

我错过了什么?

1 个答案:

答案 0 :(得分:2)

你不能这样做:

$('#aht_btn').click(function(){
    var input1 = $("#data").val();
    alert("input.." + input1);   
    request_data = { input1 } 
    $.ajax({
        url: "http://localhost:5000/train",
        type: 'POST',
        dataType: "json",
        contentType: 'application/json;charset=UTF-8',//missing this
        data: JSON.stringify(request_data),
        success: function (data) {
            alert(data);

        },
        error: function (error) {
            alert(error);
       }
    });
});

在写入行之后,使用中不再有语句,因此使用将关闭,从而停止Web应用程序。这是其中一种情况,即使using (WebApp.Start<Startup>("http://localhost:9090")) { Console.WriteLine($"Web server running at 'http://localhost:9090'"); } 的结果是IDisposable,您也不应使用using语句。相反,这样做:

WebApp.Start

您尚未显示您的依赖项注册,但请确保将public class ApiShell : IApiShell { _IDisposable _webApp; public void Start() { _webApp = WebApp.Start<Startup>("http://localhost:9090"); Console.WriteLine($"Web server running at 'http://localhost:9090'"); } public void Stop() { _webApp.Dispose(); } } public class HostService { public void Start() { IoC.Container.Resolve<IApiShell>().Start(); //start web app } public void Stop() { IoC.Container.Resolve<IApiShell>().Stop(); //stop web app } } 注册为单身,以便您启动/停止相同的实例。

请注意,如果这是传统的控制台应用而不是Windows服务,您可以这样做:

IApiShell

ReadKey方法会使using语句保持活动状态,从而防止Web应用程序被处置。