我是品牌嗅探 - 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}
在此先感謝您的幫助。
謝謝,這工作!解決這個問題的另一種方法是使用DataContract屬性(System.Runtime.Serialization)。這使您可以指定XML樹。 – Ryan 2013-05-09 17:05:12
我不知道這是如何被接受的答案,因爲它不適合我。正確的方法是將此行添加到WebApiRegister.Register:config.Formatters.Remove(config.Formatters.XmlFormatter); – newman 2013-07-31 17:51:30
這經常出現XML驗證問題。像一些缺少無參數的構造函數,一些xml屬性定義了兩次或不可序列化的子類型等。 首先嚐試首先檢查一些單元測試,或者如果您的類/層次結構是可序列化的。然後看看別的地方。 – Eleasar 2013-08-20 11:42:15