1

我正在开发一个 Web API,我想使用带有文件扩展名的内容协商来允许浏览器客户端指定他们想要接收的内容。例如

http://localhost:54147/data.xslx.  

根据这篇文章(http://msdn.microsoft.com/en-us/magazine/dn574797.aspx),我应该能够使用类似这样的东西设置路由

//setup default routes
config.Routes.MapHttpRoute(
    name: "Default",
    routeTemplate: "{controller}/{id}",
    defaults: new {id = RouteParameter.Optional}
);

//设置带有扩展名的路由 config.Routes.MapHttpRoute( name: "Url extension", routeTemplate: "{controller}/{action}.{ext}/{id}", defaults: new { id = RouteParameter.Optional } ) ;

这是我的简单控制器

public class TestController : ApiController
{
    public HttpResponseMessage Get()
    {
        var items = new[] {"test1", "test2", "test3"};
        return Request.CreateResponse(HttpStatusCode.OK, items);
    }
}

使用这个网址

http://localhost:54147/test/get.xlsx 

我总是得到浏览器的默认值(chrome 中的 xml,IE11 中的 json)。

或者可能

http://localhost:54147/test.xlsx 

我得到错误

No HTTP resource was found that matches the request URI 'http://localhost:54147/test.xlsx'.

我应该能够使用我的自定义格式化程序。但它没有发生。这是我的自定义格式化程序的构造函数。

public ExcelFormatter()
{
    MediaTypeMappings.Add(new UriPathExtensionMapping("xlsx", ContentType.Excel));
    SupportedMediaTypes.Add(new MediaTypeHeaderValue(ContentType.Excel));
}

再次根据文章,这应该有助于 API Content Negotiator 使用我的自定义格式化程序。我很感激任何帮助。

4

1 回答 1

1

由于问题很老,但仍然没有答案:

通常,此链接应有所帮助:


对于问题中的代码:

  • 看来您需要从BufferedMediaTypeFormatter(sync) 或 MediaTypeFormatter`(async)扩展
  • 你需要让你的格式化程序知道HttpConfiguration.Formatters链接

您可能希望在整个应用程序的配置中执行此操作。对于测试,您可以添加到单个 ApiController 中,如下所示。

未经测试的例子

public class TestController : ApiController
{
    TestController() {
      Configuration.Formatters.Add(new ExcelFormatter());
    }

    public HttpResponseMessage Get()
    {
        var items = new[] {"test1", "test2", "test3"};
        return Request.CreateResponse(HttpStatusCode.OK, items);
    }
}
```



于 2019-03-18T13:01:27.743 回答