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
之前,我必须将我的用户凭据添加到客户端标头中。不过找不到任何方法。
HttpClient 的 GetAsync 方法将发送一个 HTTP GET 请求,因此只能有[FromUri]
参数。由于[FromBody]
参数根据定义是 POST 数据,因此您需要使用 PostAsJsonAsync
/PostAsXmlAsync
/PostAsync
。它们之间的区别在于数据的序列化方式。
var response = client.PostAsJsonAsync(routeUri, data).Result;
话虽如此,如果您考虑到安全性,任何人都很容易直接调用"正确的 api"。此外,您将通过生成两个 HTTP 请求来增加延迟。
您应该在 MSDN 上查看本指南。我相信身份验证过滤器可能是您正在寻找的。