2017-03-17 41 views
2

我的ASP.Net WebAPI需要返回可用于XML或Json格式的数据。 get方法返回一个包含其他类型对象的对象,因此Response类中的Data属性被定义为对象。ASP.Net WebApi:以json和xml格式返回数据

Response类

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

这是我采取的一种相当迂回的方法。而不是返回响应对象的,我回来的HttpResponse像这样

return Request.CreateResponse(HttpStatusCode.OK, terms);
来处理这个

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 
1

或者你可以自己管理它。

[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原因串行像堆栈跟踪Newtosnoft.Json可以处理它。