我一直在谷歌搜索并使用 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
错误。
我不确定我做错了什么,任何帮助将不胜感激。我正在尝试在没有警告的情况下获得干净的构建,以便一切都正确配置。
根据您的模型架构和控制器/操作设置,预计会出现警告消息。因为,您的模型中没有名为“GetTagMessages”的元素。
如果您在 Edm 模型构建器中配置操作,则预期会出现“405”,因为 OData 路由为“GetTagMessage”控制器方法构建了“常规”端点。
我创建了一个示例供您参考,并使 Edm 操作在没有警告的情况下运行。请参阅提交的详细信息https://github.com/xuzhg/WebApiSample/commit/87cfed8981156ab2edde5618cb9f28eb4e6fc057
请让我知道您的详细要求。您可以在 github 上提交问题或在这里留下评论。
谢谢。