返回JSON内容类型而不是XML的Web API
我是全新的网络API。我正在为我的团队进行一个概念验证项目,我们将基于Web API XML数据源创建SSRS 2012报告。但是,不应将Web API配置为仅协商XML作为内容类型。在未来的阶段,我们的web应用程序应该能够从相同的控制器/操作检索json对象 我从跟随开始,一切顺利,没问题 接下来,我配置了路由,以便可以直接调用操作,并将QueryStringMappings添加到我的Global.asax中,以便指定内容类型返回JSON内容类型而不是XML的Web API,xml,json,api,web,reporting-services,Xml,Json,Api,Web,Reporting Services,我是全新的网络API。我正在为我的团队进行一个概念验证项目,我们将基于Web API XML数据源创建SSRS 2012报告。但是,不应将Web API配置为仅协商XML作为内容类型。在未来的阶段,我们的web应用程序应该能够从相同的控制器/操作检索json对象 我从跟随开始,一切顺利,没问题 接下来,我配置了路由,以便可以直接调用操作,并将QueryStringMappings添加到我的Global.asax中,以便指定内容类型 public class RouteConfig { p
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/Products/GetAllProducts/?$format=xml作为SSRS中的数据源连接字符串。我不确定这是否是最好的方法,但它奏效了,所以我坚持下去。如果没有查询字符串映射,数据源就无法在SSRS中工作
这就是我遇到麻烦的地方。我分支并创建了我的第一个模型/控制器/动作。当我在浏览器(chrome或IE 10)中运行项目并尝试将格式指定为XML(localhost:XXXXX/api/Calcs/ComputeFooCalculation?$format=XML)时,我会得到一个json结果。对于json或xml内容类型,Products controller仍然可以正常工作。但由于某些原因,我的操作将只呈现为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}
提前感谢您的帮助。在模型类中放置一个无参数构造函数。XML格式正在尝试在您检索所有数据之前实例化一个空XML树。谢谢,成功了!解决此问题的另一种方法是使用DataContract属性(System.Runtime.Serialization)。这允许您指定XML树。我不知道这是如何被接受的答案,因为它不适合我。正确的方法是将此行添加到webapirester.Register:config.Formatters.Remove(config.Formatters.XmlFormatter);当存在一些XML验证问题时,通常会出现这种情况。像一些缺少参数的构造函数一样,一些xml属性定义了两次或不可序列化的子类型等。首先尝试使用一些单元测试之类的方法检查您的类/层次结构是否可序列化。那就去别的地方看看。