从另一个控制器方法访问Web API访问控制器方法

7
我有两个不同的控制器 --> 控制器A,控制器B
每个控制器都有不同的方法和它们的返回值为IHttpActionResult (控制器A的方法A,控制器B的方法B) 如何访问另一个控制器的方法并从另一个控制器中获取其内容?
在控制器B中,方法B内部。
IHttpActionResult result = ControllerA.MethodA()

我想在B控制器中读取result.content。

4个回答

8

当请求到来时,只有应该处理请求的控制器会自动实例化。您可以手动实例化第二个控制器,但我建议将 MethodA 的功能移动到基本控制器类中。

public class BaseController : ApiController
{
   // ...

   public IHttpActionResult MethodA(int id)
   {
       var foo = repository.Get(id);
       if (foo == null)
           return NotFound();

       return Ok(foo);
   }
}

public class ControllerA : BaseController
{
   //...
}

public class ControllerB : BaseController
{
   public IHttpActionResult MethodB(int id)
   {
       var result = MethodA();
       //..
   }
}

或者将常见的逻辑移动到单独的类中(例如服务),这样您就可以从两个控制器中调用它。
public class ControllerA : ApiController
{
   private IFooService fooService;

   public ControllerA(IFooService fooService)
   {
       this.fooService = fooService;
   }

   public IHttpActionResult MethodA(int id)
   {
      // use fooService.Method()
   }
}

public class ControllerB : ApiController
{
   private IFooService fooService;

   public ControllerB(IFooService fooService)
   {
       this.fooService = fooService;
   }

   public IHttpActionResult MethodB(int id)
   {
        // use fooService.Method()
   }
}

5
我建议为这两个控制器使用一个共同的基类(如果你想在两者中使用相同的方法)。
例如:
public abstract class MyBaseController
{
    public void CommonMethod()
    {
        // Do something here
    }
}

然后像这样使用它们
public class ControllerA : MyBaseController
{
    public void MethodA()
    {
        base.CommonMethod();

        // Do something else
    }
}

public class ControllerB : MyBaseController
{
    public void MethodB()
    {
        base.CommonMethod();

        // Do Something else
    }
}

3

1) 您可以在静态类和静态方法中使用,以便与其他控制器共享。

public static class CommonMethods
{
    public static string SomeMethod(string s)
    {
        string RetString;
        ...
        return (RetString);
    }
}

现在您可以在任何控制器中使用它。
string SomeMethodResult = CommonMethods.SomeMethod("Say Hello");

2) 另一种方法是创建控制器类的实例并调用其实例方法:

public class V1Controller : ApiController
    {
        public void Put(int id, [FromBody]string value)
        {
            HomeController hc = new HomeController();
            hc.SomeMethod();
        }
    }

选项2正是我所需要的。谢谢! - mmcfly

1
AController aController = new AController();
var getResponse = aController.YourMethod(values);

如果你的方法返回Json,那么你可以轻松地解决它。
JavaScriptSerializer().Deserialize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接