【发布时间】:2016-12-14 04:50:28
【问题描述】:
我需要创建一个 REST 网络服务。 为此,我遵循了本教程:http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/
一切正常,我还添加了 BasicAuth,它就像手套一样工作。
现在,我的问题... 这个 web 服务将与它的可能版本一起工作,所以我们决定实现一种版本系统。此外,我们希望客户端应用程序选择他们想要执行其操作的数据库。 为此,我们认为拥有这种风格的 URI 会很好:
http://localhost/Connection/northwind/API/1/DataRow
这是我拥有的代码。我以前只定义了实体 DataRow。现在我还定义了实体 API 和连接。
如何实现我想要的 URI/端点? 这是我目前拥有的代码。
文件:WebApiConfig.cs
using Integration.Models;
using Microsoft.OData.Edm;
using System.Web.Http;
using System.Web.OData.Batch;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
using Integration.Controllers;
namespace Integration
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapODataServiceRoute("odata", null, GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
config.EnsureInitialized();
}
private static IEdmModel GetEdmModel()
{
//GlobalConfiguration.Configuration.Filters.Add(new BasicAuthenticationFilter()); // basicAutenthentication
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "Integration";
builder.ContainerName = "DefaultContainer";
builder.EntitySet<DataRow>("DataRow");
builder.EntitySet<Connection>("Connection");
builder.EntitySet<API>("API");
var edmModel = builder.GetEdmModel();
return edmModel;
}
}
}
控制器\DataRows.cs
using Integration.DataSource;
using System.Linq;
using System.Web.Http;
using System.Web.OData;
using System.Net;
namespace Integration.Controllers
{
[EnableQuery]
public class DataRowController : ODataController
{
[BasicAuthenticationFilter]
public IHttpActionResult Get()
{
return Content(HttpStatusCode.NoContent,"NoContent");
}
[BasicAuthenticationFilter]
public IHttpActionResult Post(Models.DataRow row)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//do stuff to save data
// ..
return Content(HttpStatusCode.Created, "OK");
}
}
}
Controllers\Connections.cs
using Integration.DataSource;
using System.Linq;
using System.Web.Http;
using System.Web.OData;
using System.Net;
namespace Integration.Controllers
{
[EnableQuery]
public class ConnectionController : ODataController
{
[BasicAuthenticationFilter]
public IHttpActionResult Get()
{
return Ok(IntegrationDataSources.Instance.Connection.AsQueryable());
}
[BasicAuthenticationFilter]
public IHttpActionResult Post(Models.Connection connection)
{
return Content(HttpStatusCode.NotImplemented, "NotImplemented");
}
}
}
模型\DataRow.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace Integration.Models
{
public class DataRow
{
[Key]
public int ID { get; set; }
[Required]
public int Type { get; set; }
[Required]
public string DataType { get; set; }
[Required]
public string Data { get; set; }
[Required]
public int APIVersion { get; set; }
[Required]
public string IntegrationProvider { get; set; }
}
public class Connection
{
[Key]
public string ConnectionName { get; set; }
public API Api { get; set; }
}
public class API
{
[Key]
public int Version { get; set; }
public DataRow row { get; set; }
}
}
【问题讨论】:
标签: c# web-services rest asp.net-web-api odata