我过去通常为此做的是创建 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。