skip to Main Content

I’m creating and testing my first api, using visual studio .net 6 core and EF core. Right now I’m just trying to make sure I have everything functioning. I have a single controller, and I want to redirect to an html page that gives general API usage info. When I run the debugger and the browser opens to https://localhost:xxxx I append /api/values to the end and this gets handled by my controller:

public class ValuesController : ControllerBase
{
    private readonly IWebHostEnvironment _env;
    public ValuesController(IWebHostEnvironment env)
    {
        _env = env;
    }

    // GET: api/<ValuesController>
    [HttpGet]
    public ActionResult Get() //was return type IEnumerable<string>
    {
        //return new string[] { _env.ContentRootPath, _env.WebRootPath }; //<- WebRootPath returns as null
        return Redirect("../Index.html");

    }
    //other stuff removed for brevity, just calling the above get function
}

In my code base directory I have the Index.html file created, and set to copy with a publish. But I can’t get the redirect to this page to work.

The error I get is:

No webpage was found for the web address: https://localhost:xxxx/api/Index.html
HTTP ERROR 404

When I open Index.html from the file browser it renders properly in Chrome.

I have tried using Index.html, /Index.html, and ../Index.html in the redirect call all with the same error, though from different locations.

When I ran with the string array return I see that my ContentRootPath is the path to my project root (where Index.html exists), and that WebRootPath = null.

In launchSettings.json the applicationURL is listed a couple of times. The first is in iiSettings and given as http://localhost:xxxxx (does not seem to be used) and the second in profiles and given as https://localhost:xxxx;http://localhost:yyyy (I use the https port and getting the redirect in the controller to work, because the address bar shows localhost:xxxx/api/Index.html but the page is the error text above.

I have created a folder api in the project and put a copy of Index.html in there, still with the same error.

Here is my Program.cs app initialization:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApiDbContext>();
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddControllers();
builder.Services.AddHealthChecks();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.MapControllers();
app.Run();

How do I serve up a static page from my api?

2

Answers


  1. Chosen as BEST ANSWER

    Ok, for some reason my googling got better after I posted this question. If anyone is looking here for a similar problem, I found the solution here.

    Simply return a ContentResult object:

    return new ContentResult
    {
        Content = System.IO.File.ReadAllText(@"./Index.html"),
        ContentType = "text/html"
    }; //new string[] { "value1", "value2" };
    

    ControllerBase has a Content() method that will do this for you as well, but what I have above is working within my public ActionResult Get() method.


  2. RedirectToAction("Directory");
    

    You can try doing this, it will throw you directly to the Index page

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search