2013-02-06 14 views
3

我在使用UriPathExtensionMapping在ASP.NET WebAPI中工作時遇到問題。我的設置如下:UriPathExtensionMapping來控制WebAPI中的響應格式

我的路線是:

  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 } 
      ); 

我的全球ASAX文件是:

AreaRegistration.RegisterAllAreas(); 

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

我的控制器是:

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) 
{ 
} 

當使用curl發出請求,JSON是默認響應,即使當我明確請求XML時,我仍然得到JSON:

curl http://localhost/eco/api/products/5.xml 

返回:

"http://www.google.com" 

任何人都可以看到我的設置問題?

下面的代碼映射在Global.asax文件擴展名的路線已配置完成後:

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

    GlobalConfiguration.Configuration.Formatters.XmlFormatter. 
     MediaTypeMappings.Add(
      new UriPathExtensionMapping(
       "xml", "application/xml" 
     ) 
    ); 

回答

5

你需要註冊的擴展名映射,像這樣:

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

例子是發現here

更新

如果你看一下代碼UriPathExtensionMapping爲擴展名的佔位符

/// <summary> 
/// The <see cref="T:System.Uri"/> path extension key. 
/// </summary> 
public static readonly string UriPathExtensionKey = "ext"; 

所以,你的路線將需要改變({轉}不{分機}) :

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

感謝您的回覆,但是我已經有類似的代碼來設置擴展映射(更新了問題)。然而,我確實將代碼更改爲您的建議,但它仍然無效。 – markpirvine

+0

@markpirvine - 好的謝謝澄清。看到我的更新,看看是否有幫助。 –

+0

非常感謝您花時間再次查看代碼 - 我將表單'extension'更改爲'ext',並按預期工作。 – markpirvine

1

作爲此答案的附錄,因爲我還不能評論,您還應該確保您的web.config包含s線

<modules runAllManagedModulesForAllRequests="true" /> 

<system.webServer>節內。

我沒有,這個例子沒有爲我工作,直到我添加該行。

+0

雖然設置'runAllManagedModulesForAllRequests'可以工作,但它可能不是最好的選擇,因爲所有的靜態資源現在都會被所有的http模塊處理並且對性能有影響。將它關閉並添加一個http處理程序來強制所有WebAPI URL通過管道可能會更好。我添加了以下內容來允許我的圖像緩存API處理*的請求。jpg文件 '' – Phil

+0

是的,我幾乎失去了這種情況的希望,但你的解決方案再次倖存下來。謝謝 –