Controller方法返回ActionResult的原因是什么? (ASP.NET Core Web API)

时间:2017-11-03 09:54:24

标签: c# .net asp.net-core asp.net-core-webapi

我对Web API很陌生。我观察到一些方法返回ActionResult。这是为什么?回归不够,例如CustomerDto代替吗?

返回ActionResult并不提供有关返回的实际对象的线索。我想念一下吗?

4 个答案:

答案 0 :(得分:1)

设计Web API有多种方法。在您的情况下,您可以返回CustomerDto。根据文档(https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results),Web API控制器操作可以返回以下任何内容:   - 无效   - HttpResponseMessage   - IHttpActionResult   - 其他一些类型

通过使用IHttpActionResult,您可以更好地控制Http Reponse代码。

答案 1 :(得分:1)

Web API是一个灵活的平台 - 您可以编写简单的API,它们总是只返回特定的结果类型(例如您的key : Emp1_1_1_Name, value Emp1_Name key : Emp1_1_2_Name, value Emp1_Name key : Emp1_2_1_Name, value Emp1_Name key : Emp1_2_2_Name, value Emp1_Name key : emp2_1_1_Name, value emp2_Name key : emp2_1_2_Name, value emp2_Name key : emp2_2_1_Name, value emp2_Name key : emp2_2_2_Name, value emp2_Name ),或者您可以编写更复杂的API,它们真正关心HTTP语义并希望拥有更多地控制状态代码,其他HTTP标头等。

或者你的方法可能正在处理“资源”,这些资源具有更复杂的表示形式,这些表示形式不容易由C#中的单个 DTO类建模,因此您希望灵活多个可能的“返回”类型”。

如果你不想要那种控制水平,是的,你可以继续并只返回你的DTO类型。没有人(据我所知)强迫您使用CustomerDto

答案 2 :(得分:1)

在ASP.NET Core中,前MVC" Controller" -class和Web Api" ApiController" -class一起合并到一个" Controller" -class。 ActionResult方法,它是一个经典的MVC方法,在构建MVC应用程序时非常有用,其中也包含在合并中,这就是为什么 在构建Web Api时可以使用它。

答案 3 :(得分:1)

如果您注意到.net核心web api的预建项目,则并非所有函数都返回import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.DocumentFilter; public class FilterTextField { public static void main (String [] a) { SwingUtilities.invokeLater (new Runnable () { @Override public void run () { createAndShowGUI (); } }); } private static void createAndShowGUI () { JFrame frame = new JFrame ("Test"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.setContentPane (new MainPanel ()); frame.pack (); frame.setLocationRelativeTo (null); frame.setVisible (true); } } class MainPanel extends JPanel { public MainPanel () { super (new GridLayout (3, 1, 0, 20)); JTextField t1 = new JTextField (20); JTextField t2 = new JTextField (20); JTextField t3 = new JTextField (20); ((AbstractDocument) t1.getDocument ()).setDocumentFilter (new MyDocumentFilter (5)); ((AbstractDocument) t2.getDocument ()).setDocumentFilter (new MyDocumentFilter (10, '!', '?')); ((AbstractDocument) t3.getDocument ()).setDocumentFilter (new MyDocumentFilter (15, new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'})); add (t1); add (t2); add (t3); setBorder (new EmptyBorder (20, 20, 20, 20)); } } class MyDocumentFilter extends DocumentFilter { private char [] forbiddenCharacters; private int maximumLength; public MyDocumentFilter (int maximumLength, char ... forbiddenCharacters) { this.maximumLength = maximumLength; this.forbiddenCharacters = forbiddenCharacters; } @Override public void replace (FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { // Get the full text you would have after replacement Document document = fb.getDocument (); String fullText = new StringBuilder (document.getText (0, document.getLength ())).replace (offset, offset + length, text).toString (); // Check your requirements ... if (fullText.length () <= maximumLength) { if (forbiddenCharacters != null) { for (char c : forbiddenCharacters) if (fullText.indexOf (c) > -1) return; } // Replace method is called only if your requirements are met. super.replace (fb, offset, length, text, attrs); } } } ActionResult。所以是的,你可以完全归还IActionResult之类的东西。通过这种方式,您可以将对象作为json返回,状态代码为200.但是,假设您的操作正在接受某些输入,并且您并不总是确定是否存在有效输出。在这种情况下,只有在成功时才会返回状态代码200,如果用户发送了无效数据或任何其他状态代码,则需要返回400(badRequest)。这是处理http请求的标准方法。

因此,使用CustomerDto,您可以使用IActionResultCustomerDto返回return Json(customer)个对象,也可以在运行时返回使用return Ok(customer)陷入错误。