是否可以使用[FromBody]
(或PostAsync / SendAsync?
client.GetAsync()
POST数据发送到控制器
我必须设置一个所有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
,因此我必须以相同的方式(在POST正文中)发送[FromBody]
POST数据。
这可能吗?
修改
Per @ Philippe的回复如下,我正在使用PostAsJsonAsync,它似乎想要工作,但我得到401 Unauthorized结果。更多信息:
我选择了正确的(?)ASYNC / AWAIT路线......
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 Unauthorized响应。
我想我必须在调用PostAsJsonAsync
之前将我的用户凭据添加到客户端标头中。但是找不到任何办法。
答案 0 :(得分:2)
HttpClient的GetAsync方法将发送HTTP GET请求,因此只能有[FromUri]
个参数。由于[FromBody]
参数定义为POST数据,因此您需要使用PostAsJsonAsync
/ PostAsXmlAsync
/ PostAsync
。所有这些之间的区别在于数据的序列化方式。
var response = client.PostAsJsonAsync(routeUri, data).Result;
话虽如此,如果你有安全感,那么任何人都可以直接调用“正确的api”。此外,您将通过生成两个HTTP请求来增加延迟。
您应该查看MSDN上的this guide。我相信authentication filter可能就是你想要的。