C#将[FromBody]数据从一个控制器发布到另一个控制器

时间:2016-01-14 23:10:47

标签: c# asp.net ajax asp.net-mvc asp.net-ajax

是否可以使用[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之前将我的用户凭据添加到客户端标头中。但是找不到任何办法。

1 个答案:

答案 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可能就是你想要的。