我已经开始了一个新的Blazor项目与新的.NET 8自动设置.

我正try 在我的服务器项目中放置一个Web API控制器,并使用我的ASP.NET身份验证功能来验证某人是否已登录等.

以下是我的API控制器设置:

[Route("api/[controller]")]
public class TestDataController : ApiController
{
    private readonly IWebHostEnvironment environment;

    public TestDataController(IWebHostEnvironment environment)
    {
        this.environment = environment;
    }

    [HttpGet]
    public IHttpActionResult Get()
    {
        string path = Path.Combine(environment.WebRootPath);

        string returnData = $"filename: {"1"} | path: {path}";

        return Ok(returnData);
    }
}

然后,在我的客户端项目中,我有这样的设置:

Program.cs个客户项目:

builder.Services.AddHttpClient("WebAPI",
client => client.BaseAddress = new Uri(builder.Configuration["BaseAddress"]));

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("WebAPI"));

剃须刀.

@page "/api-call"
@using App.Client.Services
@using System.Net.Http.Headers
@using Syncfusion.Blazor.Buttons
@using System.Text.Json

@inject IHttpClientFactory HttpClientFactory
@inject CookieService CookieService
@rendermode InteractiveWebAssembly

<h3>ApiCall</h3>

<SfButton OnClick="onToggleClick" Content="Click Me"></SfButton>

@if (APIValue != null)
{
    <h3>@APIValue</h3>
}
else
{
    <span>
        Loading products...
    </span>
}

@code {

    private string APIValue { get; set; }

    protected override async Task OnInitializedAsync()
    {
    }

    private async Task onToggleClick()
    {
        var httpClient = HttpClientFactory.CreateClient("WebAPI");

        //var cookie = await CookieService.GetCookieValue("YourCookieName");

        // httpClient.DefaultRequestHeaders.Authorization =
        //             new AuthenticationHeaderValue("Bearer", cookie);

        try
        {
            APIValue = await httpClient.GetFromJsonAsync<string>("TestData");
        }
        catch (HttpRequestException ex) // Non success
        {
            Console.WriteLine("An error occurred.");
            APIValue = $"error {ex.Message}";
        }
        catch (NotSupportedException) // When content type is not valid
        {
            Console.WriteLine("The content type is not supported.");
        }
        catch (JsonException) // Invalid JSON
        {
            Console.WriteLine("Invalid JSON.");
        }
    }
}

我一直看到错误:

未找到网址为:https://localhost:44309/api/testdata的网页

我错过了什么让它工作吗?

我还没有控制器上的授权属性,因为我只是要在没有登录的情况下首先测试它.

谢谢

推荐答案

Blazor和Webapi使用不同的路由系统.要使控制器在Blazor中工作,您需要添加

builder.Services.AddControllers();
...
app.MapControllers();

还请确保您的控制器是这样设置的

namespace MyApp.Controller
{
    [Authorize]
    [ApiController]
    [Route("api")]
    public class TestDataController : ControllerBase
    {
        private readonly IWebHostEnvironment environment;
        public TestDataController(IWebHostEnvironment environment)
        {
            this.environment = environment;
        }

        [HttpGet("GetWeatherForecast")]
        public string Get()
        {
            string path = Path.Combine(
                                environment.WebRootPath);

            string returnData = $"path: {path}";

            var myData = new MyData
            {
                Id = returnData,
                DateTime = DateTime.Now,
            };

            string jsonString = JsonConvert.SerializeObject(myData);

            return jsonString;
        }
    }

    public class MyData
    {
        public string Id { get; set; }

        public DateTime DateTime { get; set; }
    }
}

URL:Host web api in blazor server application

Csharp相关问答推荐

我应该将新的httpReportMessage()包装在using声明中吗?

如何使用Automapper映射两个嵌套列表

当Visual Studio处于升级管理模式时,无法安装Torch运行时

安装附加的. exe与Visual Studio

Select Many和默认IfEmpty内部Select Many错误工作

如何使用MoQ模拟Resources GroupCollection?

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

使用泛型可空类实现接口

如何通过寻找向量长度来优化两个循环?

System.Text.Json .NET 8多形态语法化

使用带有参数和曲面的注入失败(&Q;)

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

用于ASP.NET核心的最小扩展坞

KeyDown从我的文本框中删除输入,如何停止?

Visual Studio,Docker容器-容器调用:连接被拒绝

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

为什么Visual Studio 2022建议IDE0251将我的方法设置为只读?

我想我必须手动使用res1(字符串形式的PowerShell哈希表)

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄