UriPathExtensionMapping控制WebAPI中的响应格式

mar*_*ine 3 asp.net-web-api asp.net-web-api-routing

我在使用ASP.NET WebAPI中的UriPathExtensionMapping时遇到问题.我的设置如下:

我的路线是:

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

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

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

我的全局ASAX文件是:

    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
Run Code Online (Sandbox Code Playgroud)

我的控制器是:

public IEnumerable<string> Get()
{
    return new string[] { "Box", "Rectangle" };
}

// GET /api/values/5
public string Get(int id)
{
    return "Box";
}

// POST /api/values
public void Post(string value)
{
}

// PUT /api/values/5
public void Put(int id, string value)
{
}

// DELETE /api/values/5
public void Delete(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

使用curl发出请求时,JSON是默认响应,即使我明确请求XML我仍然得到JSON:

curl http://localhost/eco/api/products/5.xml
Run Code Online (Sandbox Code Playgroud)

返回:

"http://www.google.com"
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到我的设置问题?

在配置路由后,以下代码映射Global.asax文件中的扩展:

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.
        MediaTypeMappings.Add(
            new UriPathExtensionMapping(
                "json", "application/json"
        )
    );

    GlobalConfiguration.Configuration.Formatters.XmlFormatter.
        MediaTypeMappings.Add(
            new UriPathExtensionMapping(
                "xml", "application/xml"
        )
    );
Run Code Online (Sandbox Code Playgroud)

Mar*_*nes 6

您是否需要注册扩展名映射,如下所示:

config.Formatters.JsonFormatter.MediaTypeMappings.Add(new UriPathExtensionMapping("json", "application/json"));
config.Formatters.XmlFormatter.MediaTypeMappings.Add(new UriPathExtensionMapping("xml", "application/xml"));
Run Code Online (Sandbox Code Playgroud)

示例在此处找到.

更新

如果你查看UriPathExtensionMapping扩展名占位符的代码是

/// <summary>
/// The <see cref="T:System.Uri"/> path extension key.
/// </summary>
public static readonly string UriPathExtensionKey = "ext";
Run Code Online (Sandbox Code Playgroud)

因此,您的路线需要更改为({ext}而不是{extension}):

config.Routes.MapHttpRoute(
            name: "Api UriPathExtension",
            routeTemplate: "api/{controller}.{ext}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)