控制器“X”中操作“X”上的路径模板“X”不是有效的 OData 路径模板。找不到段“X”的资源

问题描述 投票:0回答:1

我一直在谷歌搜索并使用 Chat GPT,但无法弄清楚如何摆脱上述警告。这是我的代码:

var builder = new ODataConventionModelBuilder();
builder.EntitySet<MessageViewModel>("Message");

// Define the bound action
// var getTagMessagesAction = builder.EntityType<MessageViewModel>().Collection.Action("GetTagMessages");

// Optionally define parameters for the action
// getTagMessagesAction.Parameter<List<int>>("tagIds");
[Authorize]
[Route("odata")]
public class MessageController : ODataController
{
[HttpPut]
[Route("GetTagMessages")]
public async Task<IActionResult> GetTagMessages([FromBody] List<int> tagIds)
{
    var messages = await _db.MessageTags.Where(x => tagIds.Any(t => t == x.TagId))
        .AsNoTracking().ToListAsync();
    var mapped = _mapper.Map<List<Message>, List<MessageViewModel>>(messages);
    return Ok(mapped);
}

}

我用

https://localhost:5001/odata/GetTagMessages
调用它并在主体中传递一个整数列表。

无需在 EDM 模型构建器中配置操作即可成功调用,但在运行解决方案时收到警告:

警告:Microsoft.AspNetCore.OData.Routing.Conventions.AttributeRoutingConvention[0] 控制器“Message”中操作“GetTagMessages”上的路径模板“odata/GetTagMessages”不是有效的 OData 路径模板。找不到段“GetTagMessages”的资源。

当我像在 EDM 模型生成器中那样配置操作时,通过删除注释代码,我得到

405 Method Not Allowed
。我尝试更改为
POST
调用,但仍然遇到相同的错误。

如果我从控制器中删除

[Route("odata")]
,并将端点上的路线更改为
[Route("~/GetTagMessages")]
,警告就会消失,但我会收到
405
错误。

我不确定我做错了什么,任何帮助将不胜感激。我正在尝试在没有警告的情况下获得干净的构建,以便一切都正确配置。

c# .net api odata
1个回答
0
投票

根据您的模型架构和控制器/操作设置,预计会出现警告消息。因为,您的模型中没有名为“GetTagMessages”的元素。

如果您在 Edm 模型构建器中配置操作,则预期会出现“405”,因为 OData 路由为“GetTagMessage”控制器方法构建了“常规”端点。

我创建了一个示例供您参考,并使 Edm 操作在没有警告的情况下运行。请参阅提交的详细信息https://github.com/xuzhg/WebApiSample/commit/87cfed8981156ab2edde5618cb9f28eb4e6fc057

请让我知道您的详细要求。您可以在 github 上提交问题或在这里留下评论。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.