我正在构建一个API,客户端可以向我发送一大块数据,然后将其保存到某处以便以后检索。我不在乎内容类型是什么。我只想每次都获取原始数据,无论他们将Content-Type设置为什么。我知道这可以通过访问Request对象在旧版本的ASPNET中实现,但这似乎不可能用ASPNET 5,我也不想这样做,因为它会使单元测试不可能(请求不是依赖注入)。 / p>
我已经看到了一些关于IInputFormatter和IOutputFormatter接口的提及,但这些接口似乎附加到特定的Content-Type。我想我正在寻找更像[FromBody]属性的东西,但这给了我原始输出。像[RawBody]这样的东西。我做了很多搜索,似乎找不到任何简单的解决方案。
答案 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