在 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()IHttpActionResultOk() 也是。现在编译器应该很高兴。

您可以在此处阅读可能的返回类型: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

无法在 ASP.Net Core Web api 中启用 CORS

防止在 ASP.NET MVC 中缓存 WEB API 数据