C# POSTing[FromBody] 数据从一个控制器到另一个控制器

本文关键字:控制器 一个 另一个 POSTing FromBody 数据 | 更新日期: 2023-09-27 18:30:31

[FromBody]是否可以使用 client.GetAsync()(或 PostAsync/SendAsync?

我必须设置一个所有 api 调用都将通过的基本控制器。

我的 ajax 调用都转到这个SecureApi控制器,它们将原始路径作为参数发送到该参数,以便它们可以重新路由到正确的控制器。像这样:

$.ajax({
    url: "./api/SecureApi/?path=/api/OtherApi/SomeRoute",
    data: {
        param1: 1,
        param2: 2
    }
});

所以我的基本控制器看起来像这样:

public class SecurityApiController : ApiController
{
    [HttpPost]
    public HttpResponseMessage SecureApi([FromBody]object data, string path)
    {
        // do some stuff
        // get uri
        var applicationPath = Request.RequestUri.Scheme + "://" + Request.GetRequestContext().VirtualPathRoot.Replace("/", String.Empty);
        Uri routeUri = new Uri(applicationPath + path);
        // then redirect to correct controller
        var config = new HttpConfiguration();
        var server = new HttpServer(config);
        var client = new HttpClient(server);
        // how can I send [FromBody]object data here?
        var response = client.GetAsync(routeUri).Result; // or PostAsync/SendAsync?
        return response;
    }
}

other控制器如下所示:

public class OtherApiController : ApiController
{
    [HttpPost]
    public HttpResponseMessage OtherApi([FromBody]OtherData data)
    {
        // do stuff
    }
}

不幸的是,我无法更改OtherApi,所以我必须以相同的方式发送[FromBody] POST数据(在POST正文中)。

这可能吗?

编辑:

根据下面@Philippe的回复,我正在使用PostAsJsonAsync,它似乎想要工作,但我得到了401未经授权的结果。更多信息:

我选择了正确的(?异步/等待路由...

public async Task<HttpResponseMessage> SecureApi([FromBody]Dictionary<string, dynamic> data, string path)
{
    ...
    var client = new HttpClient();
    var response = await client.PostAsJsonAsync(routePath, data);
    return response;
}

Other控制器具有:

[Authorize(Roles = "Admin")] // I do have the "Admin" role
[Route("Save")]
[HttpPost]
public SaveResultBase Save([FromBody]Dictionary<string, dynamic> data)
{
    ...
}

但此控制器永远不会命中(那里没有命中断点),并且它返回 401 未授权响应。

我想在调用PostAsJsonAsync之前,我必须将我的用户凭据添加到客户端标头中。不过找不到任何方法。

C# POSTing[FromBody] 数据从一个控制器到另一个控制器

HttpClient 的 GetAsync 方法将发送一个 HTTP GET 请求,因此只能有[FromUri]参数。由于[FromBody]参数根据定义是 POST 数据,因此您需要使用 PostAsJsonAsync/PostAsXmlAsync/PostAsync 。它们之间的区别在于数据的序列化方式。

var response = client.PostAsJsonAsync(routeUri, data).Result;

话虽如此,如果您考虑到安全性,任何人都很容易直接调用"正确的 api"。此外,您将通过生成两个 HTTP 请求来增加延迟。

您应该在 MSDN 上查看本指南。我相信身份验证过滤器可能是您正在寻找的。