我使用的ASP.NET Web API的ApiController揭露业务逻辑的Web服务。 我测试XML和JSON,因为我们对它的需求,我一直在使用招测试。 我已经把范围缩小到这样的:有一个IList<T>
由于某种原因,性质势力JSON,但改变属性List<T>
允许使用JSON或XML。 不幸的是,我需要这些使用IList<T>
所以我怎样才能使XML列的对象与IList<T>
属性?
如果我用下面的HTML头为GET http://localhost:4946/Api/MyBizLog/GetDomainObject?id=foo
:
Authorization: basic ***************
Accept: application/xml
Host: localhost:4946
我回来JSON如果一个异常被抛出。 如果我改变Content-Type
到Content-Type: application/xml
,我得到XML如果一个异常被抛出。 如果没有抛出异常,但是,我总是得到JSON。
我打电话的方法有类似的签名public virtual MyDomainObject GetDomainObject(String id)
我如何得到它返回的内容类型为我请教成功以及失败?
我有以下WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "AlternativeApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { }
);
config.Formatters.XmlFormatter.UseXmlSerializer = true;
}
}
更多信息
我安装的WebAPI每@Darren米勒的建议追查,我也得到了以下内容:
我把一个断点在行动的第一线。 我再从提琴手发送的获得。 输出呈现以下时,停止执行在断点处:
iisexpress.exe Information: 0 : Request, Method=GET, Url=http://localhost:4946/Api/MyBizLog/GetDomainObject?id=foo, Message='http://localhost:4946/Api/MyBizLog/GetDomainObject?id=foo'
iisexpress.exe Information: 0 : Message='MyBizLog', Operation=DefaultHttpControllerSelector.SelectController
iisexpress.exe Information: 0 : Message='WebApp.Api.MyBizLogController', Operation=DefaultHttpControllerActivator.Create
iisexpress.exe Information: 0 : Message='WebApp.Api.MyBizLogController', Operation=HttpControllerDescriptor.CreateController
iisexpress.exe Information: 0 : Message='Selected action 'GetDomainObject(String id)'', Operation=ApiControllerActionSelector.SelectAction
iisexpress.exe Information: 0 : Message='Parameter 'id' bound to the value 'foo'', Operation=ModelBinderParameterBinding.ExecuteBindingAsync
iisexpress.exe Information: 0 : Message='Model state is valid. Values: id=foo', Operation=HttpActionBinding.ExecuteBindingAsync
iisexpress.exe Information: 0 : Operation=TransactionalApiFilterAttribute.ActionExecuting
然后我让执行继续,我有以下几点:
iisexpress.exe Information: 0 : Message='Action returned 'DomainObjects.MyDomainObject'', Operation=ReflectedHttpActionDescriptor.ExecuteAsync
iisexpress.exe Information: 0 : Message='Will use same 'JsonMediaTypeFormatter' formatter', Operation=JsonMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message='Selected formatter='JsonMediaTypeFormatter', content-type='application/json; charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate
iisexpress.exe Information: 0 : Operation=ApiControllerActionInvoker.InvokeActionAsync, Status=200 (OK)
iisexpress.exe Information: 0 : Operation=TransactionalApiFilterAttribute.ActionExecuted, Status=200 (OK)
iisexpress.exe Information: 0 : Operation=MyBizLogController.ExecuteAsync, Status=200 (OK)
iisexpress.exe Information: 0 : Response, Status=200 (OK), Method=GET, Url=http://localhost:4946/Api/MyBizLog/GetDomainObject?id=foo, Message='Content-type='application/json; charset=utf-8', content-length=unknown'
iisexpress.exe Information: 0 : Operation=JsonMediaTypeFormatter.WriteToStreamAsync
iisexpress.exe Information: 0 : Operation=MyBizLogController.Dispose
我有一个ActionFilterAttribute
不改变结果读取基本的身份验证,并告诉谁是当前用户是商业逻辑层,而是跳跃。
然而更多信息
所以,我已经把范围缩小到的IList和列表。 如果我#define WORKS
,我得到XML。 如果我#define DOESNT_WORK
,我得到JSON。 这实际上是实际运行代码。
public class Bar
{
}
public class Foo
{
#if WORKS
public virtual List<Bar> Bars { get; set; }
#elif DOESNT_WORK
public virtual IList<Bar> Bars { get; set; }
#endif
}
[HttpPost]
[HttpGet]
public Foo Test()
{
return new Foo();
}