Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将[FromBody]数据从一个控制器发布到另一个控制器_C#_Asp.net_Ajax_Asp.net Mvc_Asp.net Ajax - Fatal编程技术网

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容器。。。