【问题标题】:ASP.Net WebApi: return data in json and xml formatsASP.Net WebApi:以 json 和 xml 格式返回数据
【发布时间】:2017-08-08 13:38:50
【问题描述】:

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

响应类

public class Response
{
    public int StatusCode { get; set; }

    public string StatusMessage { get; set; }

    public object Data { get; set; }
}

这在接受 XML 格式的数据时会引发错误

“ObjectContent`1”类型未能序列化内容类型“application/xml;”的响应正文; charset=utf-8'。

但是,当我更改归因于 IList 等强类型的数据类型时,它返回 json 和 xml 格式的数据就好了。

我需要 Response 类是通用的,以便我可以将它重用于多个控制器和操作。我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案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 因为像 StackTraceNewtosnoft.Json 这样的序列化程序可以处理它。

    【讨论】:

      【解决方案2】:

      处理这个问题的一种方法是在路由配置中使用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 
      

      【讨论】:

        【解决方案3】:

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

        return Request.CreateResponse(HttpStatusCode.OK, terms);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-05
          • 2011-06-11
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 2012-05-28
          • 2015-06-07
          • 2017-07-22
          相关资源
          最近更新 更多