gpt4 book ai didi

c# - 通过反射在另一个 Controller 中调用 WebApi 的另一个 Action ?

转载 作者:行者123 更新时间:2023-11-30 20:23:57 25 4
gpt4 key购买 nike

我们的系统中有很多服务。 (与移动公司整合)

所以,(例如)我们有:

Action1 in Controller1
Action2 in Controller1
...

Action4 in Controller4
Action5 in Controller4
...

目前,移动公司通过单个请求调用每个操作。

但最近他们告诉我们,“我们可以向您发送要调用的操作列表吗?而不是每次都手动运行单个操作...?

所以我尝试了反射(reflection):

服务 Controller :

    [HttpGet]
[AllowAnonymous]
public HttpResponseMessage AAA( )
{
Type type = typeof(UsersController);

var instance = Activator.CreateInstance(type);

MethodInfo method = type.GetMethod("Test2", BindingFlags.Instance | BindingFlags.Public);
var t= method.Invoke(instance, new object[] { "royi" });

return Request.CreateResponse(HttpStatusCode.OK, t);
}

和:

用户 Controller :

 [HttpGet]
[AllowAnonymous]
public HttpResponseMessage Test2( string ggg)
{
return Request.CreateResponse(HttpStatusCode.OK, "hello"+ggg);
}

当我通过 fiddler 运行时:

http://es.com/api/services/aaa ( 获取)

它确实有效,但(显然)另一端的 Request 为空:

enter image description here

问题

如何使 Test2 按预期运行?我在解决这个问题上的方向正确吗?或者 webApi 是否内置了这种机制?

最佳答案

你最好使用 ActionInvoker 来做到这一点:

public HttpResponseMessage AAA()
{
var ctrlDesc = new HttpControllerDescriptor(this.Configuration, "UsersController", typeof(UsersController));
var actionDesc = new ReflectedHttpActionDescriptor(ctrlDesc, typeof(UsersController).GetMethod("Test2"));
var ctrlCtx = new HttpControllerContext(this.Configuration, this.Request.GetRouteData(), this.Request);

var apiCtrl = ctrlDesc.CreateController(this.Request) as ApiController;

apiCtrl.Request = this.Request;
apiCtrl.Configuration = this.Configuration;
apiCtrl.ControllerContext = ctrlCtx;

ctrlCtx.Controller = apiCtrl;
ctrlCtx.ControllerDescriptor = ctrlDesc;
ctrlCtx.Request = this.Request;
ctrlCtx.RouteData = this.Request.GetRouteData();

var actionContext = new HttpActionContext(ctrlCtx, actionDesc);
actionContext.ActionArguments.Add("ggg", "royi");

var invoker = this.Configuration.Services.GetActionInvoker();

return invoker.InvokeActionAsync(actionContext, CancellationToken.None).Result;
}

关于c# - 通过反射在另一个 Controller 中调用 WebApi 的另一个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27703013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com