2013-05-08 101 views
3

我是品牌嗅探 - Web API的新手。我正在爲我的團隊開發一個概念驗證項目,我們將根據Web-API XML數據源創建SSRS 2012報告。但是,不應將Web-API配置爲僅將XML作爲內容類型進行協商。在未來階段,我們的Web應用程序應該能夠從相同的控制器/操作中檢索json對象。返回JSON內容類型而不是XML的Web API

我從this tutorial開始,一切正常,沒問題。

接下來我配置我的路線,以便我可以直接調用動作,並且我將QueryStringMappings添加到我的Global.asax中,以便可以指定內容類型。

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

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { id = UrlParameter.Optional } 
     ); 
    } 
} 

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

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

     GlobalConfiguration.Configuration.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json"); 
     GlobalConfiguration.Configuration.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml"); 
    } 
} 

這個偉大的工程,我現在可以使用localhost:XXXXX/API /產品/ GetAllProducts/$格式= XML作爲在SSRS我的數據源的連接字符串。我不確定這是否是最好的方式,但它工作,所以我堅持下去。如果沒有查詢字符串映射,數據源在SSRS中不起作用。

這是我遇到麻煩的地方。我分手並創建了我的第一個模型/控制器/動作。當我在瀏覽器(chrome或IE 10)中運行項目並嘗試將格式指定爲XML(localhost:XXXXX/api/Calcs/ComputeFooCalculation?$ format = xml)時,我得到一個json結果。產品控制器繼續爲json或xml內容類型正常工作。但出於某種原因,我的行爲只會呈現爲json。這是我的代碼的樣子。讓我知道你是否需要模型或其他東西。 FooCalculation有一個嵌套的對象欄。 FooCalculation和Bar都有字符串,雙打和日期時間。

控制器:

public class CalcsController : ApiController 
{ 

    public FooCalculation ComputeFooCalculation() 
    { 
     var Foo = GetFoo(); 
     var Bar = GetBar(); 
     var FooCalculation = new FooCalculation(Foo, Bar); 

     return FooCalculation; 
    } 

} 

樣品JSON結果:

{"Foo":"XXX","FooRate":{"Foo":"XXX","Bar":"SN","FooBar":-1.00813E-05,"BarFoo":-3.2644199999999995E-06,"FoooBarrr":-4.17501E-06,"BarDate":"2013-05-14T00:00:00"},"BarRate":{"Foo":"XXX","Bar":"1W","FooBar":-2.08687E-05,"BarFoo":-3.11313E-05,"FoooBarrr":-3.3E-05,"BarDate":"2013-05-21T00:00:00"},"BarDate":"2013-05-20T00:00:00","FooDays":6,"FooBar":-7.3741306716417904E-06,"Bar":-0.0011149741306716415} 

在此先感謝您的幫助。

回答

1

在您的模型類中放置一個無參數構造函數。在檢索所有數據之前,XML格式化嘗試實例化一個空的XML樹。

+0

謝謝,這工作!解決這個問題的另一種方法是使用DataContract屬性(System.Runtime.Serialization)。這使您可以指定XML樹。 – Ryan 2013-05-09 17:05:12

+1

我不知道這是如何被接受的答案,因爲它不適合我。正確的方法是將此行添加到WebApiRegister.Register:config.Formatters.Remove(config.Formatters.XmlFormatter); – newman 2013-07-31 17:51:30

+0

這經常出現XML驗證問題。像一些缺少無參數的構造函數,一些xml屬性定義了兩次或不可序列化的子類型等。 首先嚐試首先檢查一些單元測試,或者如果您的類/層次結構是可序列化的。然後看看別的地方。 – Eleasar 2013-08-20 11:42:15

相關問題