在 Asp.net web api 中无法通过 id 查找用户
Posted
技术标签:
【中文标题】在 Asp.net web api 中无法通过 id 查找用户【英文标题】:Having trouble to find user by id in Asp.net web api 【发布时间】:2021-10-15 20:19:58 【问题描述】:所以我正在从事这个项目,我必须在其中进行 CRUD 操作,但我一直无法通过他们的 id 获取用户。
这是我获取所有用户的功能,这里我没有使用实体框架。这个效果很好。
[Route("AllOperators")]
public DataSet GetAllOperators()
DataSet ds = dbLayer.MyValues();
return ds;
这就是我试图通过 id 获取用户的目的。
[HttpGet]
[Route("api/data/GetById")]
public IHttpActionResult GetById(string id)
var result = sl3.Operator.Where(x => x.id == id).FirstOrDefault();
if (id == null) return NotFound();
else return result;
在这里,我按照有人建议的那样使用了实体框架,但最后我收到了一个错误,我在 return result
上写着这个
无法将类型“WebApp.Models.Operator”隐式转换为“system.web.http.ihttpactionresult”
有人可以帮我修复这个错误,甚至可以建议我另一种方法,我可以通过他的 id 获取所需的用户吗?
【问题讨论】:
您使用的是哪个 asp.net 版本? 【参考方案1】:如果您的 asp.net 版本允许,您可以切换到 ActionResult 响应类型。它会自动将您的对象序列化为 Json。
[HttpGet]
[Route("api/operators/id")]
public ActionResult<Operator> GetById([FromRoute] string id)
var result = sl3.Operator.Where(x => x.id == id).FirstOrDefault();
if (id == null) return NotFound();
else return Ok(result);
还调整了您的路线,使其更加 RESTful。有关这方面的更多信息,请查看 MS Best Practices API Design Florimont Blog Entry
【讨论】:
【参考方案2】:sl3.Operator.FirstOrDefault(x => x.id == id); 要么 sl3.Operator.Find(id); 总是正确的。
你必须改变:
public IHttpActionResult GetById(string id)
到:
public Operator GetById(string id)
【讨论】:
结果必须是运算符而不是 IHttpActionResult 或者您创建一个视图(结果),然后创建一个带有来自操作员类型的模型的 cshtml 文件。 我将其更改为 Operator GetById(string id) 但仍然是同样的错误,我应该更改我的返回类型还是...?【参考方案3】:如果你想返回 JSON 对象试试这个:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
return Content(JToken.FromObject(result).ToString(), "application/json");
*无法将类型“WebApp.Models.Operator”隐式转换为“system.web.http.ihttpactionresult”。此错误意味着您的“结果”对象类型是 WebApp.Models.Operator。但是您需要与 IHttpActionResult 函数兼容的返回对象。比如文本、JSON、XML……
【讨论】:
【参考方案4】:public HttpResponseMessage GetById(string id)
var result = sl3.Operator.Where(x => x.id == id).FirstOrDefault();
if (id == null) throw new HttpResponseException(HttpStatusCode.NotFound);
else
return this.Request.CreateResponse<Operator>(
HttpStatusCode.OK, result);
【讨论】:
【参考方案5】:错误告诉你你的问题是什么。你的方法签名说,你需要返回一个IHttpActionResult
,但result
是不同的类型。
您还应该更改属性路由,以便 id 正确绑定到您的参数。
将您的代码更改为:
[HttpGet]
[Route("api/data/id")]
public IHttpActionResult GetById(string id)
var result = sl3.Operator.Where(x => x.id == id).FirstOrDefault();
if (id == null)
return NotFound();
else
return Ok(result);
NotFound()
是 IHttpActionResult
,Ok()
也是。现在编译器应该很高兴。
您可以在此处阅读可能的返回类型:https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results
【讨论】:
这个似乎确实有效。除了现在它引发另一个错误 CLR 类型到 EDM 类型的映射不明确,因为多个 CLR 类型与 EDM 类型“操作员”匹配。以前找到 CLR 类型“WebApplication4.Operator”,新找到 CLR 类型“WebApplication4.Models.Operator”。 yikes 你需要定义你真正想使用哪个类Operator
作为模型。您有两个,编译器无法确定哪一个是正确的。要么删除一个类,如果它们是多余的,或者在你的代码中使用更精确的声明。另见此处:***.com/questions/14927391/…
现在完美运行。感谢您的宝贵时间,我花了好几个小时试图弄明白。非常感谢。【参考方案6】:
您可以像这样使用它来按 id 过滤记录
[HttpGet]
[Route("api/data/GetById/id")]
public IHttpActionResult GetById(string id)
var result = sl3.Operator.Where(x => x.id.Tolower() == id.ToLower()).FirstOrDefault();
if (result == null)
return NotFound();
else return result;
【讨论】:
以上是关于在 Asp.net web api 中无法通过 id 查找用户的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ASP.NET web api 3 项目在 ASP.NET web api 2 执行时没有请求就无法启动?
无法让 ASP.NET Core Web API 与 IIS 一起使用 [关闭]
ASP.NET Web API 无法从 POST 正文中读取
ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute