0

Is it possible to use Web API within a .NET Core application that is not using MVC, but making use of app.Run?

I want to provide a simple API and would rather use Web API than roll my own. I've added in MvcCore in ConfigureServices

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.AddMvcCore(x =>
        {
            x.RespectBrowserAcceptHeader = true;
        }).AddFormatterMappings()
        .AddJsonFormatters();

        // ...
    }

I added a very simple Controller:

[Route("/api/test")]
public class TestController : Controller
{
    [HttpGet]
    [Route("")]
    public async Task<IActionResult> Get()
    {
        return Ok("Hello World");
    }
}

However, when I attempt to hit /api/test my normal processing code within App.Run processes.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        var scopeFactory = _serviceProvider.GetRequiredService<IServiceScopeFactory>();

        // ...

        app.Run(async (context) =>
        {
            using (var scope = scopeFactory.CreateScope())
            {
                var request = new Request(context);
                var response = new Response(context);

                await scope.ServiceProvider.GetRequiredService<IRequestFactory>().ProcessAsync(request, response);
            }
        });
    }

How do I defer to the Web API if I don't want to handle the request?

1
  • Look up app.Map() Commented Apr 2, 2018 at 21:44

1 Answer 1

1

In order to configure MVC,you have to add it both in ConfigureServices and Configure like below

ConfigureServices

 public void ConfigureServices(IServiceCollection services)
        {      
            services.AddMvc();
        }

Configure

  public void Configure(IApplicationBuilder app)
        {
            app.UseMvc();
        }

So in your code,you have only done the first part.

Also I see that you have used app.Run ,do not use Run if you have other middlewares to run.app.Run delegate terminates the pipeline and MVC middleware will not get chance to execute

What you have to do is to change the code to app.Map ,refer this article for the user of Run,use and map

So the order of middleware matters. you have to change the code like this

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        var scopeFactory = _serviceProvider.GetRequiredService<IServiceScopeFactory>();

        // ...

        app.Use(async (context,next) =>
        {
            using (var scope = scopeFactory.CreateScope())
            {
                var request = new Request(context);
                var response = new Response(context);

                await scope.ServiceProvider.GetRequiredService<IRequestFactory>().ProcessAsync(request, response);
            }
          await next.Invoke()

        });
       app.UseMvc();
    }
Sign up to request clarification or add additional context in comments.

1 Comment

Fantastic, all I needed to add was app.UseMvc. Thanks for your help.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.