我迁移到WebAPI 2.2 RC(Microsoft.AspNet.WebApi -Version 5.2.0-rc),因为我在所有查询中只得到406(不可接受)作为状态响应,例如:
http://localhost:7923/api/Quotes(1)
OData服务配置
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.EnableSystemDiagnosticsTracing(); config.MapODataServiceRoute("api", "api", CreateEdmModel()); } private static IEdmModel CreateEdmModel() { var odataModelBuilder = new ODataConventionModelBuilder(); odataModelBuilder.EntitySet("Tags"); odataModelBuilder.EntitySet ("Authors"); EntitySetConfiguration quoteEntitySetConfiguration = odataModelBuilder.EntitySet("Quotes"); FunctionConfiguration getQuotesRandomFunction = quoteEntitySetConfiguration.EntityType.Collection.Function("Random"); getQuotesRandomFunction.Parameter("count"); getQuotesRandomFunction.ReturnsCollectionFromEntitySet ("Quotes"); return odataModelBuilder.GetEdmModel(); } }
QuotesController
public class QuotesController : ODataController { private WhatAQuoteDb db = new WhatAQuoteDb(); [ODataRoute("Default.Random(count={count})")] [EnableQuery] public IHttpActionResult GetQuotesRandom(int count) { return Ok(db.Quotes.OrderBy(quote => Guid.NewGuid()).Take(count)); } // GET: odata/Quotes [EnableQuery] public IQueryableGetQuotes() { return db.Quotes; } // GET: odata/Quotes(5) [EnableQuery] public SingleResultGetQuote([FromODataUri] int key) { return SingleResult.Create(db.Quotes.Where(quote => quote.Id == key)); } // PUT: odata/Quotes(5) public async TaskPut([FromODataUri] int key, Quote quote) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (key != quote.Id) { return BadRequest(); } db.Entry(quote).State = EntityState.Modified; try { await db.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!QuoteExists(key)) { return NotFound(); } else { throw; } } return Updated(quote); } // POST: odata/Quotes public async Task Post(Quote quote) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Quotes.Add(quote); await db.SaveChangesAsync(); return Created(quote); } // PATCH: odata/Quotes(5) [AcceptVerbs("PATCH", "MERGE")] public async Task Patch([FromODataUri] int key, Delta patch) { if (!ModelState.IsValid) { return BadRequest(ModelState); } Quote quote = await db.Quotes.FindAsync(key); if (quote == null) { return NotFound(); } patch.Patch(quote); try { await db.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!QuoteExists(key)) { return NotFound(); } else { throw; } } return Updated(quote); } // DELETE: odata/Quotes(5) public async TaskDelete([FromODataUri] int key) { Quote quote = await db.Quotes.FindAsync(key); if (quote == null) { return NotFound(); } db.Quotes.Remove(quote); await db.SaveChangesAsync(); return StatusCode(HttpStatusCode.NoContent); } // GET: odata/Quotes(5)/Author [EnableQuery] public SingleResult GetAuthor([FromODataUri] int key) { return SingleResult.Create(db.Quotes.Where(m => m.Id == key).Select(m => m.Author)); } // GET: odata/Quotes(5)/Tags [EnableQuery] public IQueryable GetTags([FromODataUri] int key) { return db.Quotes.Where(m => m.Id == key).SelectMany(m => m.Tags); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } private bool QuoteExists(int key) { return db.Quotes.Count(e => e.Id == key) > 0; } }
Feng Zhao.. 14
我检查了您的解决方案,发现您使用了服务参考.
但是,添加服务引用不支持OData V4,生成的代码中的版本为V3.
您可以尝试OData T4代码生成器来生成客户端代码.
查看下面的博客:
http://blogs.msdn.com/b/odatateam/archive/2014/03/11/how-to-use-odata-client-code-generator-to-generate-client-side-proxy-class.aspx
更新:
我再次检查了你的解决方案并发现了问题:
您使用的ODataController是V3!
如果需要V4版本,则需要更改控制器cs文件中的using命名空间
从
using System.Web.Http.OData;
至
using System.Web.OData;
更重要的是,当我启动项目时,以下模板无效还有其他问题.
[ODataRoute("Default.Random(count={count})")]
我是guest,您定义的随机函数是函数导入,您应该像这样定义:
FunctionConfiguration getQuotesRandomFunction = odataModelBuilder.Function("Random");
并且函数import不应该添加命名空间,模板应该是:
[ODataRoute("Random(count={count})")]
如果您有其他问题,请告诉我.
我检查了您的解决方案,发现您使用了服务参考.
但是,添加服务引用不支持OData V4,生成的代码中的版本为V3.
您可以尝试OData T4代码生成器来生成客户端代码.
查看下面的博客:
http://blogs.msdn.com/b/odatateam/archive/2014/03/11/how-to-use-odata-client-code-generator-to-generate-client-side-proxy-class.aspx
更新:
我再次检查了你的解决方案并发现了问题:
您使用的ODataController是V3!
如果需要V4版本,则需要更改控制器cs文件中的using命名空间
从
using System.Web.Http.OData;
至
using System.Web.OData;
更重要的是,当我启动项目时,以下模板无效还有其他问题.
[ODataRoute("Default.Random(count={count})")]
我是guest,您定义的随机函数是函数导入,您应该像这样定义:
FunctionConfiguration getQuotesRandomFunction = odataModelBuilder.Function("Random");
并且函数import不应该添加命名空间,模板应该是:
[ODataRoute("Random(count={count})")]
如果您有其他问题,请告诉我.