迁移到WebApi 2.2 RC并获取响应状态406(不可接受)

 唯一的你b 发布于 2023-01-09 08:16

我迁移到WebAPI 2.2 RC(Microsoft.AspNet.WebApi -Version 5.2.0-rc),因为我在所有查询中只得到406(不可接受)作为状态响应,例如:

http://localhost:7923/api/Quotes(1)

状态406

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 IQueryable GetQuotes()
    {
        return db.Quotes;
    }

    // GET: odata/Quotes(5)
    [EnableQuery]
    public SingleResult GetQuote([FromODataUri] int key)
    {
        return SingleResult.Create(db.Quotes.Where(quote => quote.Id == key));
    }

    // PUT: odata/Quotes(5)
    public async Task 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 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 Task 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 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})")]

如果您有其他问题,请告诉我.

1 个回答
  • 我检查了您的解决方案,发现您使用了服务参考.

    但是,添加服务引用不支持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})")]
    

    如果您有其他问题,请告诉我.

    2023-01-09 08:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有