c# - 获取请求的 URL 或操作参数 i MediaTypeFormatter.ReadFromStreamAsync

标签 c# asp.net-web-api self-hosting

我有一个带有自定义 MediaTypeFormatter

的自托管 WebApi 应用程序

根据“名称”参数(或 URL 的一部分),应用程序应将请求正文格式化为不同的类型。

这是 Action

// http://localhost/api/fire/test/ 
// Route: "api/fire/{name}",

public HttpResponseMessage Post([FromUri] string name, object data)
{
    // Snip
}

这是自定义的 MediaTypeFormatter.ReadFromStreamAsync

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
    var name = "test"; // TODO this should come from the current request

    var formatter = _httpSelfHostConfiguration.Formatters.JsonFormatter;

    if (name.Equals("test", StringComparison.InvariantCultureIgnoreCase))
    {
        return formatter.ReadFromStreamAsync(typeof(SomeType), readStream, content, formatterLogger);
    }
    else
    {
        return formatter.ReadFromStreamAsync(typeof(OtherType), readStream, content, formatterLogger);
    }
}

最佳答案

这是您可以执行此操作的一种方法。让消息处理程序读取请求并添加这样的内容 header 。

public class TypeDecidingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // Inspect the request here and determine the type to be used
        request.Content.Headers.Add("X-Type", "SomeType");

        return await base.SendAsync(request, cancellationToken);
    }
} 

然后,您可以从 ReadFromStreamAsync 中的格式化程序读取此 header 。

public override Task<object> ReadFromStreamAsync(
                             Type type, Stream readStream,
                                    HttpContent content,
                                         IFormatterLogger formatterLogger)
{
    string typeName = content.Headers.GetValues("X-Type").First();

    // rest of the code based on typeName
}

关于c# - 获取请求的 URL 或操作参数 i MediaTypeFormatter.ReadFromStreamAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17962778/

相关文章:

server - 是否可以免费托管一个 Realm-Database?

c# - 类型 'System.Int32' 的表达式不能用于返回类型 'System.Object'

c# - ASP.Net (C#) 如何从 HTTP 页面 POST 到 HTTPS

c# - 如何通过像 ASMX Web 服务一样创建它的实例来使用 WebAPI

asp.net-mvc - 从 MVC Controller 调用 Web API 来构建和传递模型以查看

c# - 自托管在 Mono 下运行的简单 NancyFX HelloWorld 应用程序的延迟问题

docker - 使用 traefik 将 DNS 重定向到不同的端口

c# - 使用 Newtonsoft 反序列化 JSON 对象 C#

C# ArgumentOutOfRangeException 参数智能感知

asp.net-web-api - ASP.NET Web Api 2.0 中哪个优先,ExceptionFilter 还是 ExceptionHandler?