【问题标题】:Sending XML response from MVC Rest API从 MVC Rest API 发送 XML 响应
【发布时间】:2014-07-02 19:37:45
【问题描述】:

我正在尝试实现一个返回 XML 的 MVC Rest API 服务。

代码有点像这样:

public IEnumerable<XDocument> getXml(...)
        {
            XDocument responseXml = MakeHttpRequestAndGetResponseXML(...);
            return responseXml;
        }

但这当然行不通,只是我的尝试失败了。当我在 XDocument 对象中有 XML 响应时,如何通过我的 Web 服务将其作为有效的 XML 返回?

【问题讨论】:

    标签: .net xml asp.net-mvc asp.net-mvc-4 rest


    【解决方案1】:

    我过去通常为此做的是创建 DTO 来表示您的 XML,并为您的 DTO 属性提供序列化属性来描述 XML:

    [DataContract(Name = "Service", Namespace = "")]
    public class ServiceApiDTO
    {
        [DataMember(IsRequired = true, Order = 0, EmitDefaultValue = false)]
        public string Name { get; set; }
    
        [DataMember(IsRequired = true, Order = 1, EmitDefaultValue = false)]
        public string Description { get; set; }
    
        [DataMember(IsRequired = true, Order = 2, EmitDefaultValue = false)]
        public string Url { get; set; }
    
        [DataMember(IsRequired = false, Order = 3, EmitDefaultValue = false)]
        public DepartmentApiDTO Department { get; set; }
    
        [DataMember(IsRequired = false, Order = 4, EmitDefaultValue = false)]
        public string SLA { get; set; }
    
        [DataMember(IsRequired = false, Order = 5, EmitDefaultValue = false)]
        public string Cost { get; set; }
    
        [DataMember(IsRequired = true, Order = 6, EmitDefaultValue = false)]
        public ServiceStatusApiDTO CurrentStatus { get; set; }
    
        [DataMember(IsRequired = true, Order = 7, EmitDefaultValue = false)]
        public UserApiDTO CreatedBy { get; set; }
    }
    

    然后创建一个 WebApiController 以通过 HttpGet 公开这些 DTO:

    public class ServicesController : ApiController
    {
        private readonly IServiceService _serviceService;
    
        public ServicesController(IServiceService serviceService)
        {
            _serviceService = serviceService;
        }
    
        //
        // GET: /api/Services/Service.{ext}/{url}
    
        [HttpGet]
        public ServiceApiDTO Service(string url)
        {
            var service = _serviceService.GetServiceByUrl(url);
    
            if (service == null)
            {
                var error = new HttpError(String.Format("No service found with URL = '{0}'", url));
    
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, error));
            }
    
            var serviceDTO = Mapper.Map<Service, ServiceApiDTO>(service);
    
            return serviceDTO;
        }
    }
    

    然后告诉我的 WebApiConfig 处理 Xml 和 Json 扩展:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}.{ext}",
                defaults: new { ext = "xml|json" }
            );
    
            config.Routes.MapHttpRoute(
                name: "ActionApiServiceUrl",
                routeTemplate: "api/{controller}/{action}.{ext}/{url}",
                defaults: new { url = RouteParameter.Optional, ext = "xml|json" }
            );
    
            var jsonFormatter = config.Formatters.JsonFormatter;
            var xmlFormatter = config.Formatters.XmlFormatter;
    
            jsonFormatter.AddUriPathExtensionMapping("json", "application/json");
            xmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");
        }
    }
    

    一切就绪后,您可以访问您的 API,例如 http://localhost/api/Services/Service.xml/urlParameter 以获取 XML 响应或 http://localhost/api/Services/Service.json/urlParameter 以获取 JSON 响应。

    此示例通常是从我的一个应用程序中复制/粘贴的,但希望您能理解。

    仅供参考,这里使用的一些技术是 AutoMapper,用于从域实体映射到 DTO,以及 CastleWindsor,用于将服务依赖注入到 WebApiController。

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多