ASP.Net WebApi:以json和xml格式返回数据

时间:2017-03-17 05:42:00

标签: c# asp.net json xml asp.net-web-api

我的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类是通用的,所以我可以将它重用于多个控制器和操作。我怎样才能做到这一点?

3 个答案:

答案 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);