ASPNET 5:无论Content-Type标头设置为什么,如何将请求参数作为原始内容接收?

时间:2016-01-18 22:40:44

标签: asp.net-mvc asp.net-web-api

我正在构建一个API,客户端可以向我发送一大块数据,然后将其保存到某处以便以后检索。我不在乎内容类型是什么。我只想每次都获取原始数据,无论他们将Content-Type设置为什么。我知道这可以通过访问Request对象在旧版本的ASPNET中实现,但这似乎不可能用ASPNET 5,我也不想这样做,因为它会使单元测试不可能(请求不是依赖注入)。 / p>

我已经看到了一些关于IInputFormatter和IOutputFormatter接口的提及,但这些接口似乎附加到特定的Content-Type。我想我正在寻找更像[FromBody]属性的东西,但这给了我原始输出。像[RawBody]这样的东西。我做了很多搜索,似乎找不到任何简单的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以使用CustomAttribute创建Request.InputStream并阅读StreamReader,然后在任意位置保存流数据,然后将InputStream位置重置为0 httpContext.Request.InputStream.Position = 0;

我在自定义AuthorizeAttribute中使用了它,但您可以使用自定义ActionFilter并使用Request中的filterContext您可以谷歌搜索" MVC中的自定义属性c#& #34;您也可以在ActionResult

中执行此操作

答案 1 :(得分:0)

如果您仍在寻找解决方案来获取请求对象,那么解决方案

创建MessageHandler

public class MessageHandler1 : DelegatingHandler
    {
        protected async override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            HttpContextWrapper context = (HttpContextWrapper)request.Properties.ElementAt(0).Value;
        // Call the inner handler.
        var response = await base.SendAsync(request, cancellationToken);

        return response;
        }
    }

将条目添加到WebApiConfig

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.MessageHandlers.Add(new MessageHandler1());

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

现在您可以访问MessageHandler1

中的行请求