2011-10-13 84 views
0

當我在Hammock和WP7中使用WCF Web API時,遇到了一個有趣的問題。如您所知,WCF Web API允許您根據您在Accept標頭中指定的內容更改響應類型。對於例如如果你發送Accept:application/json,那麼響應是JSON,如果你指定了application/xml,你得到了XML等等。WCF Web API,Hammock和WP7 Woes

所以我創建了我的Web API,它在Web瀏覽器中工作得非常好。正如所料,我得到了我想要的類型。但是,當我使用WP7時,無論Accept頭是什麼,它看起來像WP7將它替換爲/,我只返回XML。

我知道一個事實,那就是不是Hammock,因爲我嘗試使用Facebook Graph API。如果我更改接受說:應用程序/你好,我得到一個錯誤的請求錯誤。然而,當我用WP7在C#代碼中這樣做時,我完全沒有錯誤,返回類型是XML,而不管我發送的是什麼。

爲了規避這個問題,我在我的WCF Web API中創建了一個JSON.Net序列化程序。一切工作很好,直到我開始在我的方法中使用HttpResponseMessage作爲返回類型。現在,即使我有一個JSON序列化程序,我也可以在所有使用HttpResponseMessage的方法中獲得XML。

正如你所看到的,我現在在拉拉地。

任何人都可以提供任何反饋?

任何幫助,高度讚賞。

回答

1

我遇到了這個問題,並在CodePlex上發佈了this issue。儘管Nuget尚未更新,但如果您拉取最新的源代碼,它已被修復。然後,您應該能夠刪除xml格式化程序或清除內置格式化程序並添加所需的格式程序。我發現的另一個解決方法是清除內置格式化程序並創建映射到接受類型的自定義媒體類型格式化程序。

更新:現已在nuget上使用WCF Web API Preview 6修復了此問題。

1

如果您願意,WCF WebApi允許您使用查詢字符串指定格式。除了默認情況下的RequestHeaderMapping之外,您還需要使用QueryStringMapping更新配置。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    var config = routes.GetDefaultHttpConfiguration(); 

    var jsonFormatters = config.Formatters.Where(f => f.SupportedMediaTypes.Any(mt => mt.MediaType == "application/json")); 
    jsonFormatters.ToList().ForEach(f => f.MediaTypeMappings.Add(new QueryStringMapping("format", "json", "application/json"))); 

    routes.MapServiceRoute<BooksService>("books", config); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 
}