我的ASP.Net WebAPI需要返回可以XML或Json格式使用的数据。 get方法返回一个包含其他类型对象的对象,因此Response类中的Data属性被定义为object。
响应类
public class Response
{
public int StatusCode { get; set; }
public string StatusMessage { get; set; }
public object Data { get; set; }
}
这会在接受XML格式的数据时抛出错误
' ObjectContent`1'类型无法序列化内容类型' application / xml的响应正文;字符集= UTF-8'
但是,当我更改属于强类型的数据类型(如IList)时,它会以json和xml格式返回数据。
我需要Response类是通用的,所以我可以将它重用于多个控制器和操作。我怎样才能做到这一点?
答案 0 :(得分:2)
或者你可以自己管理它。
[HttpGet]
[Auth(Roles = "User")]
public HttpResponseMessage Get(Guid id, [FromUri]string format = "json")
{
Guid userGuid = GetUserID(User as ClaimsPrincipal);
HttpStatusCode sc = HttpStatusCode.OK;
string sz = "";
try
{
sz = SerializationHelper.Serialize(format, SomeDataRepository.GetOptions(id, userGuid));
}
catch (Exception ex)
{
sc = HttpStatusCode.InternalServerError;
sz = SerializationHelper.Serialize(format,
new ApiErrorMessage("Error occured",
ex.Message));
}
var res = CreateResponse(sc);
res.Content = new StringContent(sz, Encoding.UTF8, string.Format("application/{0}", format));
return res;
}
您可以从参数传递格式,也可以从请求标题中读取格式。 您也可以使用 StreamContent 而不是 StringContent ,因为 StackTrace 和 Newtosnoft.Json 等序列化程序可以处理它。
答案 1 :(得分:1)
处理此问题的一种方法是在路线配置中使用AddUriPathExtensionMapping
在WebApiConfig.cs
中config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{format}/{id}",
defaults: new { format= RouteParameter.Optional, id = RouteParameter.Optional }
);
//Uri format config
config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");
然后,当您调用api时,您可以在URL中定义响应的格式
http://yourdomain.com/api/controller/xml
http://yourdomain.com/api/controller/json
答案 2 :(得分:0)
这是我采取的一种相当迂回的方法。我没有返回响应对象,而是像这样返回HttpResponse
return Request.CreateResponse(HttpStatusCode.OK, terms);