asp.net-mvc – 迁移到WebApi 2.2 RC并获取响应状态406(不可接受
发布时间:2020-12-16 03:42:29 所属栏目:asp.Net 来源:网络整理
导读:我迁移到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(HttpC
我迁移到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<Tag>("Tags"); odataModelBuilder.EntitySet<Author>("Authors"); EntitySetConfiguration<Quote> quoteEntitySetConfiguration = odataModelBuilder.EntitySet<Quote>("Quotes"); FunctionConfiguration getQuotesRandomFunction = quoteEntitySetConfiguration.EntityType.Collection.Function("Random"); getQuotesRandomFunction.Parameter<int>("count"); getQuotesRandomFunction.ReturnsCollectionFromEntitySet<Quote>("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 IQueryable<Quote> GetQuotes() { return db.Quotes; } // GET: odata/Quotes(5) [EnableQuery] public SingleResult<Quote> GetQuote([FromODataUri] int key) { return SingleResult.Create(db.Quotes.Where(quote => quote.Id == key)); } // PUT: odata/Quotes(5) public async Task<IHttpActionResult> Put([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<IHttpActionResult> 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<IHttpActionResult> Patch([FromODataUri] int key,Delta<Quote> 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 Task<IHttpActionResult> Delete([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<Author> 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<Tag> 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; } } 解决方法
我检查了您的解决方案,发现您使用了服务参考.
但是,添加服务引用不支持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})")] 如果您有其他问题,请告诉我. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ASP.Net MVC如何将数据从视图传递到控制器
- asp.net – RenderBody()和RenderSection()必须在每个子版面
- asp.net核心 – ASP – 启动时核心迁移EF核心SQL DB
- asp.net-mvc – 在VS 2012中创建和运行MVC 5项目
- 如何在ASP.NET vNext MVC 6(beta1)项目之间共享视图?
- asp.net-mvc – ASP MVC – 有默认内容类型的任何常量?
- asp.net-mvc – 在@ Html.ActionLink中放置@ Html.DisplayF
- ASP.net检查页面是http还是https
- asp.net-mvc-3 – MVC3客户端验证无法使用Ajax.BeginForm表
- ASP.NET中用gridView来实现分页
推荐文章
站长推荐
- asp.net-mvc – 有没有办法让RoutePrefix以可选参
- 深蓝词库转换1.7发布,支持QQ分类词库解析
- ASP.NET Core的Kestrel服务器
- asp.net-mvc-2 – ASP.NET MVC 2多个PartialView
- asp.net-mvc – MVC3 – RenderSection中的Rende
- ASP.NET linq选择多个连接
- asp.net-mvc – ASP.NET MVC安全检查表
- asp.net-mvc-3 – Asp.net MVC3从razor View访问
- asp.net – Datatable的行计算功能
- asp.net-mvc – 服务层是否可以访问HttpContext?
热点阅读