访问内部API控制器

时间:2017-11-22 20:06:01

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

有没有办法在不使用API​​的网址的情况下从另一个类调用您的应用程序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请求?这可能吗?

3 个答案:

答案 0 :(得分:2)

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

从API Controller继承的类必须响应Web请求。如果我们希望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();
    }
}

答案 1 :(得分:0)

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

如果你想重用代码,你需要在另一个函数中使用你正在使用的代码,并保持控制器和动作只是为了调用函数。我通常在我的业务逻辑中有这样的东西。

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

public static Person GetPerson(string id){

}

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

答案 2 :(得分:0)

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

 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;
     } 
 }