【问题标题】:Access internal API controller访问内部 API 控制器
【发布时间】:2017-11-22 20:06:01
【问题描述】:

有没有办法在不使用 API 的 url 的情况下从另一个类调用您的应用程序 API 控制器?

例如我在“personContoller”中有这个方法

    public async Task<ActionResult> GetPersonRecord(string id)
    {
        Person person;
        var link = "api/entity/Person/" + id + "?format=json";
        string results = await OneIMAction(link);
        person = JsonConvert.DeserializeObject<Person>(results);
        string json = JsonConvert.SerializeObject(person, Formatting.Indented);
        return Content(json, "application/json");
    }

如何在同一应用程序的另一个 C# 类中访问此方法的 JSON 结果,而无需使用 Web 请求?这可能吗?

【问题讨论】:

  • 你应该把这个实现隐藏在一个服务后面,并在需要的地方调用它。
  • 这个答案正在讨论什么或其他什么? stackoverflow.com/questions/14887871/…
  • 只是想知道反序列化results 字符串和再次序列化person 有什么意义?
  • 好钓普子。那是别的东西遗留下来的。它已被删除。谢谢。

标签: c# .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

根据单一职责原则(S.O.L.I.D. 的第一条原则),“每个模块或类都应对软件提供的单个部分功能负责”。

从 API 控制器继承的类必须响应网络请求。如果我们希望一个 API 控制器可以访问另一个 API 控制器的某些操作,我们应该创建一个 Web 请求并调用该 URL(不推荐这样做)。如果我们希望一个任务被多个方法调用,我们将它转​​移到被称为类服务的 Facade。并且所有想要使用它的 API 控制器的操作都将使用类服务。

public class TestService 
{
    public void Do()
    {
      // ...
    }
}


public class HomeController1 : Controller
{
    public ActionResult Index()
    {
        var service = new TestService();
        service.Do();
        return View();
    }
}


public class HomeController2 : Controller
{
    public ActionResult Index()
    {
        var service = new TestService();
        service.Do();
        return View();
    }
}

【讨论】:

    【解决方案2】:

    即使有可能,控制器和动作也不打算在代码内部调用。它们甚至被设计为具有 http 响应,因此如果您要调用该函数,则需要查找这些响应并使用诸如 try catch 之类的东西来检查 200 响应。

    如果您想重用代码,您需要在另一个函数中使用您正在使用的代码,并保留控制器和操作仅用于调用该函数。我的业务逻辑中通常有这样的东西。

    例如,在您的人员类或扩展人员类的类中,您可以拥有以下内容:

    public static Person GetPerson(string id){
    
    }
    

    然后您可以在您的控制器和 api 控制器中调用它。

    【讨论】:

    • @Neville 坏主意!您应该将其作为服务保留。在类内部创建一个静态方法并耦合Http和序列化是很糟糕的。
    • 是的,静态方法不是一个好主意。我不完全确定他的构造函数试图实现什么,我试图在他写的和我通常写的之间展示一个示例代码
    【解决方案3】:

    你为什么使用网络请求?如果它是同一个应用程序,您可以将一个控制器调用到另一个控件

     public class HomeController : Controller
        {
          public async Task<ActionResult> GetPersonRecord(string id)
            {
                PersonController person =new PersonController();
                var Value =person.PersonDetails()
                Value = JsonConvert.DeserializeObject<Person>(results);
                string json = JsonConvert.SerializeObject(person, Formatting.Indented);
                return Content(json, "application/json");
            }
        }
    
    
    
     public class PersonController : Controller
     { 
         [HTTPPOST]
         public void  PersonDetails ( int PersonID)
         { 
           return XXXX;
         } 
     }
    

    【讨论】:

    • 由于我的 PersonController 是我的 API 的一部分,它返回的内容不是无效的。我想我需要阅读“任务”在 C# 中的工作方式。这对我来说是一个新概念(就像 C# 一样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2017-11-18
    相关资源
    最近更新 更多