首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从MVC Rest API发送XML响应

从MVC Rest API发送XML响应
EN

Stack Overflow用户
提问于 2014-07-03 03:37:46
回答 1查看 517关注 0票数 0

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

代码有点像这样:

代码语言:javascript
复制
public IEnumerable<XDocument> getXml(...)
        {
            XDocument responseXml = MakeHttpRequestAndGetResponseXML(...);
            return responseXml;
        }

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

EN

Stack Overflow用户

发布于 2014-07-03 04:10:12

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

代码语言:javascript
复制
[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:

代码语言:javascript
复制
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扩展:

代码语言:javascript
复制
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");
    }
}

设置好之后,就可以访问像http://localhost/api/Services/Service.xml/urlParameter这样的应用编程接口,或者以JSON作为响应的http://localhost/api/Services/Service.json/urlParameter

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

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24539633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档