当前位置: 代码网 > it编程>编程语言>Asp.net > C# WebAPI的几种返回类型方式

C# WebAPI的几种返回类型方式

2025年11月27日 Asp.net 我要评论
在 asp.net core 中有三种返回数据和http状态码的方式,最简单的就是直接返回指定的类型实例,如下代码所示: [apicontroller] [route("[control

在 asp.net core 中有三种返回 数据 和 http状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示:

     [apicontroller]
    [route("[controller]")]
    public class weatherforecastcontroller : controllerbase
    {
        [httpget]
        public ienumerable get()
        {
            var rng = new random();
            return enumerable.range(1, 5).select(index => new weatherforecast
            {
                date = datetime.now.adddays(index),
                temperaturec = rng.next(-20, 55),
                summary = summaries[rng.next(summaries.length)]
            })
            .toarray();
        }
    }
 

除了这种,也可以返回 iactionresult 实例 和 actionresult 实例。

虽然返回指定的类型 是最简单粗暴的,但它只能返回数据,附带不了http状态码,而 iactionresult 实例可以将 数据 + http状态码 一同带给前端,最后就是 actionresult 它封装了前面两者,可以实现两种模式的自由切换。

接下来一起讨论下如何在 asp.net core web api 中使用这三种方式。

创建 controller 和 model 类

在项目的 models 文件夹下新建一个 author 类,代码如下:

  public class author
    {
        public int id { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
    }
 

有了这个 author 类,接下来创建一个 defaultcontroller 类。

using microsoft.aspnetcore.mvc;
using system.collections.generic;
 
namespace idgcorewebapi.controllers
{
    [route("api/[controller]")]
    [apicontroller]
    public class defaultcontroller : controllerbase
    {
        private readonly list authors = new list();
        public defaultcontroller()
        {
            authors.add(new author()
            {
                id = 1,
                firstname = "joydip",
                lastname = "kanjilal"
            });
            authors.add(new author()
            {
                id = 2,
                firstname = "steve",
                lastname = "smith"
            });
        }
 
        [httpget]
        public ienumerable get()
        {
            return authors;
        }
 
        [httpget("{id}", name = "get")]
        public author get(int id)
        {
            return authors.find(x => x.id == id);
        }
    }
}
 

在 action 中返回 指定类型

最简单的方式就是在 action 中直接返回一个 简单类型 或者 复杂类型,其实在上面的代码清单中,可以看到 get 方法返回了一个 authors 集合,看清楚了,这个方法定义的是 ienumerable

[httpget]
public ienumerable get()
{
   return authors;
}

在 asp.net core 3.0 开始,你不仅可以定义同步形式的 ienumerable方法,也可以定义异步形式的 iasyncenumerable方法,后者的不同点在于它是一个异步模式的集合,好处就是 不阻塞 当前的调用线程,关于 iasyncenumerable 更多的知识,我会在后面的文章中和大家分享。

下面的代码展示了如何用 异步集合 来改造 get 方法。

[httpget]
public async iasyncenumerable get()
{
   var authors = await getauthors();
   await foreach (var author in authors)
   {
        yield return author;
   }
}

在 action 中返回 iactionresult 实例

如果你要返回 data + httpcode 的双重需求,那么 iactionresult 就是你要找的东西,下面的代码片段展示了如何去实现。

[httpget]
public iactionresult get()
{
  if (authors == null)
      return notfound("no records");
 
  return ok(authors);
}

上面的代码有 oknotfound 两个方法,对应着 okresult,notfoundresult, http code 对应着 200,404。当然还有其他的如:createdresult, nocontentresult, badrequestresult, unauthorizedresult, 和 unsupportedmediatyperesult,都是 iactionresult 的子类。

在 action 中返回actionresult实例

actionresult 是在 asp.net core 2.1 中被引入的,它的作用就是包装了前面这种模式,怎么理解呢? 就是即可以返回 iactionresult ,也可以返回指定类型,从 actionresult 类下的两个构造函数中就可以看的出来。

public sealed class actionresult : iconverttoactionresult
{
	public actionresult result  {get;}
 
	public tvalue value  {get;}
 
	public actionresult(tvalue value)
	{
		if (typeof(iactionresult).isassignablefrom(typeof(tvalue)))
		{
			throw new argumentexception(resources.formatinvalidtypetforactionresultoft(typeof(tvalue), "actionresult"));
		}
		value = value;
	}
 
	public actionresult(actionresult result)
	{
		if (typeof(iactionresult).isassignablefrom(typeof(tvalue)))
		{
			throw new argumentexception(resources.formatinvalidtypetforactionresultoft(typeof(tvalue), "actionresult"));
		}
		result = (result ?? throw new argumentnullexception("result"));
	}
}

有了这个基础,接下来看看如何在 action 方法中去接这两种类型。

[httpget]
public actionresult> get()
{
  if (authors == null)
       return notfound("no records");
   return authors;
}

和文章之前的 get 方法相比,这里直接返回 authors 而不需要再用 ok(authors) 包装,是不是一个非常好的简化呢? 接下来再把 get 方法异步化,首先考虑下面返回 authors 集合的异步方法。

private async task> getauthors()
{
    await task.delay(100).configureawait(false);
    return authors;
}

值得注意的是,异步方法必须要有至少一个 await 语句,如果不这样做的话,编译器会提示一个警告错误,告知你这个方法将会被 同步执行,为了避免出现这种尴尬,我在 task.delay 上做了一个 await。

下面就是更新后的 get 方法,注意一下这里我用了 await 去调用刚才创建的异步方法,代码参考如下。

[httpget]
public async task>> get()
{
   var data = await getauthors();
   if (data == null)
        return notfound("no record");
   return data;
}

如果你有一些定制化需求,可以实现一个自定义的 actionresult 类,做法就是实现 iactionresult 中的 executeresultasync 方法即可。

到此这篇关于c# webapi的几种返回类型方式的文章就介绍到这了,更多相关c# webapi返回类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com