【发布时间】:2016-01-16 01:17:51
【问题描述】:
是否可以使用client.GetAsync()(或 PostAsync/SendAsync)将[FromBody] 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 数据。
这可能吗?
编辑:
根据@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 之前将我的用户凭据添加到客户端标头。但是找不到任何方法。
【问题讨论】:
标签: c# asp.net ajax asp.net-mvc asp.net-ajax