Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用过滤器时,如果您希望返回某些内容,是否应将上下文的结果始终设置为ContentResult对象?_C#_Asp.net Core_Model View Controller_Filter_Action Filter - Fatal编程技术网

C# 使用过滤器时,如果您希望返回某些内容,是否应将上下文的结果始终设置为ContentResult对象?

C# 使用过滤器时,如果您希望返回某些内容,是否应将上下文的结果始终设置为ContentResult对象?,c#,asp.net-core,model-view-controller,filter,action-filter,C#,Asp.net Core,Model View Controller,Filter,Action Filter,ContentResult允许您指定要返回的状态代码,以及响应的内容及其编码 是否有理由返回OkObjectResult、BadRequestObjectResult等对象,而不只是返回ContentResult,前提是您确实有要返回的内容,即响应有一个主体,而不是NoContentResult结果 我想强调的是,这不是关于我们应该如何编写代码的意见。这是关于理解在上述情况下返回除ContentResult之外的任何内容是否会给我们带来任何额外的好处(如果有的话) 谢谢。如果您的内容是一个字符串

ContentResult允许您指定要返回的状态代码,以及响应的内容及其编码

是否有理由返回OkObjectResult、BadRequestObjectResult等对象,而不只是返回ContentResult,前提是您确实有要返回的内容,即响应有一个主体,而不是NoContentResult结果

我想强调的是,这不是关于我们应该如何编写代码的意见。这是关于理解在上述情况下返回除ContentResult之外的任何内容是否会给我们带来任何额外的好处(如果有的话)


谢谢。

如果您的内容是一个字符串,那么没有理由使用特定的对象结果-事实上,这会增加开销,从而降低性能。ObjectResult用于将对象编码为所请求的格式,从而执行附加操作以检查如何序列化给定对象

当您查看Github上的实现时,可以很容易地看到涉及到其他步骤:

只是一个简单的对象,直接从ActionResult继承,并带有一些简单的类型化属性

是一个围绕ObjectResult的薄层,它只在其构造函数中设置状态代码

具有复杂的类型,如其中的输出格式化程序集合,这些类型会产生开销,因为它们需要初始化

稍后在管道中,ContentResult将由ContentResultExecutor处理,ObjectResult将由ObjectResultExecutor处理

非常简单,它基本上只是将编码结果写入响应流

它执行的操作不是那么简单,比如检查请求的输出类型、确定给定对象的类型以及在将对象写入输出流之前序列化对象

长话短说: 如果只需要返回字符串,请使用ContentResult。如果您需要返回一个复杂的对象,并且希望从自动获得正确的输出格式和性能优化的序列化过程等功能中获益,请使用某种类型的ObjectResult

如果您开发了一个WebApi,并在每个应用程序的任何地方使用ContentResult 如果是响应类型,则会导致不同的开发人员序列化 他们的对象在某个时候以不同的格式转换为JSON。意思 标准化。。 这些额外的方法还可以防止代码克隆。想象你是 返回HTTP 500,其中包含JSON内容以及代码和消息,以便让客户端知道服务器错误并显示它。这也是WebApi设计的最佳实践。你用了1000次了 项目那就意味着你在调用Json序列化方法时也调用了1000次 您完全不能使用它,而将所有这些留给框架。当时间到了,并且您决定切换到一个新的更优化的JSON序列化库时,您最终会在1000行不同的代码上更改代码。 使用这些额外的结果类型,您的代码更容易测试。您可以编写单元测试规则来告诉测试方法应该返回OkResult对象。或者可以对返回类型编写规则。。由于总是使用ContentReult,您必须在测试方法内部硬编码,并在HTTP状态代码值之间切换,以决定要做什么。这意味着更多的IF语句,更多的行,意味着更复杂。
总之,这些类型针对的是需要它们的开发人员,而不是不需要它们的开发人员。因此,如果您只喜欢使用ContentResult,并且没有这些顾虑,那么一切都很好。

是什么阻止我将序列化对象提供给ContentResult对象,并将内容类型更改为application/json?这难道不比检查ObjectResult所做的一切要好得多吗?我不知道它有什么样的序列化优化,但我将使用System.Text.serialization for json。没有什么可以阻止您这样做,我只是不希望复制框架功能,因为我可以。尤其是像这样的东西,我希望从微软的工程师那里得到经验。我没有深入研究代码,但我希望它直接写入响应流,而不是像您的方法那样传递额外的序列化字符串。因此,您的方法可能还需要额外的资源,并且忽略了我在文章中描述的任何性能/内存使用改进,使用这种框架功能的另一个好处是,使用API的每个人都可以期望所有控制器以一致的方式序列化,并且可以在中心位置进行配置。此外,还有一些第三方增强功能,如自动生成招摇过市,这些功能将受益于使用对象返回类型而不是字符串的操作