【问题标题】:WebAPI mvc 4 set default response typeWebAPI mvc 4 设置默认响应类型
【发布时间】:2016-04-08 05:12:14
【问题描述】:

我有以下代码

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.JsonFormatter.MediaTypeMappings.Add(
    new UriPathExtensionMapping("json", "application/json"));
config.Formatters.XmlFormatter.MediaTypeMappings.Add(
    new UriPathExtensionMapping("xml", "application/xml"));

现在我想如果有人不提供像 http://apuUrl/getBooks 这样的 api 扩展,它应该默认返回 JSON 值。

我的以下场景运行良好:

http://apuUrl/getBooks.json -> 返回 JSON

http://apuUrl/getBooks.xml -> 返回 XML

注意:我不想为每个 API 做额外的路由

【问题讨论】:

  • 我看到了这个......但这需要为每个 API 额外路由
  • 也可以通过设置content-type来实现。这是一个选项,还是必须在路线中?
  • 我明白了,忽略我的第一条评论。
  • 什么是mvc-api,真的有必要为它创建标签吗?

标签: c# asp.net-mvc-4 asp.net-web-api


【解决方案1】:

使用DelegatingHandler 覆盖acceptheader 怎么样?

public class MediaTypeDelegatingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var url = request.RequestUri.ToString();
        //TODO: Maybe a more elegant check?
        if (url.EndsWith(".json"))
        {
            // clear the accept and replace it to use JSON.
            request.Headers.Accept.Clear();
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }
        else if (url.EndsWith(".xml"))
        {
            request.Headers.Accept.Clear();
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

在你的配置中:

GlobalConfiguration.Configuration.MessageHandlers.Add(new MediaTypeDelegatingHandler());

还有你的控制器:

public class FooController : ApiController
{
    public string Get()
    {
        return "test";
    }
}

如果你去http://yoursite.com/api/Foo/?.json应该返回:

"test"

虽然http://yoursite.com/api/Foo/?.xml 应该返回

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test</string>

编辑: 请注意,您仍然需要处理路由参数输入,因为控制器不需要 .json 参数。这就是为什么? 可能是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2014-07-07
    相关资源
    最近更新 更多