C#将[FromBody]数据从一个控制器发布到另一个控制器
是否可以使用C#将[FromBody]数据从一个控制器发布到另一个控制器,c#,asp.net,ajax,asp.net-mvc,asp.net-ajax,C#,Asp.net,Ajax,Asp.net Mvc,Asp.net Ajax,是否可以使用client.GetAsync()(或PostAsync/SendAsync)将[FromBody]POST数据发送到控制器 我必须设置一个基本控制器,所有api调用都将通过该控制器 我的ajax调用都会转到这个SecureApi控制器,它们会将原始路径作为参数发送到该控制器,以便将其重新路由到正确的控制器。类似于: $.ajax({ url: "./api/SecureApi/?path=/api/OtherApi/SomeRoute", data: {
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;
}
}
所以我的基本控制器看起来像:
$.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;
}
}
其他
控制器如下所示:
public class OtherApiController : ApiController
{
[HttpPost]
public HttpResponseMessage OtherApi([FromBody]OtherData data)
{
// do stuff
}
}
不幸的是,我无法更改其他API
,因此我必须以相同的方式发送[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;
}
但是这个控制器从未被命中(没有断点被命中),并且它返回一个401未经授权的响应
我想在调用
PostAsJsonAsync
之前,我必须将我的用户凭据添加到客户端头。但是,我找不到任何方法来这样做。HttpClient的GetAsync方法将发送HTTP GET请求,因此只能使用[FromUri]
参数。因为[FromBody]
参数根据定义是POST数据,您需要使用PostAsJsonAsync
/PostAsXmlAsync
/PostAsync
。它们之间的区别在于数据的序列化方式
var response = client.PostAsJsonAsync(routeUri, data).Result;
也就是说,如果您考虑到安全性,那么任何人都可以很容易地直接调用“正确的api”。此外,您还可以通过生成两个HTTP请求来增加延迟
您应该看看MSDN。我相信an可能就是您想要的。谢谢!我们确实使用了用户身份验证和身份验证过滤,但我们希望能够在标准API调用上使用AES加密,这样就不容易向用户公开。不确定这是否是最好的方法,但这是我们想到的。Definitel不过,我还是想听听其他的建议。(我将尝试PostAsJsonAsync,并在它运行时将其标记为“答案”)。我在“EDIT”@dmathisen下面添加了更多信息。此实现的主要问题是,您要么阻止到其他API的路由,这样您就可以确保无法直接调用它们(但是,在这种情况下,你也在阻止你自己的连接),或者让标准的路由(和安全的API变得无用,因为任何人都可以通过查看URL获得直接地址)。关于你的401个错误,我确信你有这个问题,因为服务器不认为SeCueAPI与“真实”相同。客户端…可能有一种方法可以从客户端设置HTTPClient的cookie容器。。。