【发布时间】:2020-03-30 13:24:17
【问题描述】:
这可能是一个菜鸟问题或架构上的误解,但我无论如何都会问它,因为我没有想法和搜索词:目标是实现一个控制器CountriesController(),它应该连接(JSONish ) 两个端点的结果。
假设我有两个端点 api/allowedCountriesToSell 和 api/allowedCountriesToBuy 分别实现为 CountriesSellController() 和 CountriesBuyController()。它们都以 JSON 形式返回数据,我希望将其合并并作为新端点提供。我知道这种架构并不理想,但我不允许在架构上有所不同。此外,我实际上必须将两个不同的文件发布到这些端点 - 两个现有的控制器都包含类似
[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file, string selectBox)
{ // ...
我的新端点编译了所有这两个必需参数,我们称它们为myFileX 和mySelectBox。这是我到目前为止所拥有的:
var myOtherContoller1 = new CountriesSellController();
var list1 = myOtherContoller1.FileUpload(myFile1,mySelectBox);
var myOtherContoller2 = new CountriesSellController();
var list2 = myOtherContoller1.FileUpload(myFile2,mySelectBox);
my result = list1.asEnumerable().Concat(list2.asEnumerable()); // Pseudocode. Here I am lost.
return Ok(result);
问题是list1 和list2 都是IHttpActionResult 类型,我不确定如何提取其中的数据。理想情况下,result 的类型为 IEnumerable<UploadStatusDto>,我将相应的数据传输对象定义为
namespace API.Models
{
public class UploadStatusDto
{
public int UploadId { get; set; } // contained in the response of both controllers
public string FileName { get; set; } // myFileX - parameter for calling the 2 existing controllers
public int UploadStatus { get; set; } // coming back within listX
public int Type { get; set; } // whether it is a buy or a sell, i.e. which controller I called
}
感谢任何指导。
【问题讨论】:
-
控制器操作应该通过向它发出 HTTP 请求来调用 - 因此它返回一个 HttpActionResult(然后 ASP.NET 管道将转换为包含标头和正文的 HTTP 响应)。您通常不会期望从 C# 程序的另一部分调用它。您的设置到底是什么?
-
为什么不将这两个控制器方法中的实际逻辑移动到一个单独的类中并只返回数据呢?然后现有的控制器可以调用这些方法,包装在
IHttpActionResult中,您的新端点可以调用它们并仅访问数据。你真的不应该直接调用你的控制器方法。 -
@ADyson:这正是问题所在 - 我不应该接触其他代码库,所以我必须通过 HTTP 请求(使用应该上传的文件的名称)实际调用两个控制器我的新控制器。
-
@jtate:好吧,一方面,我不应该重复代码,另一方面,我不应该接触现有的控制器/端点,所以我能想出的唯一方法是实际上通过 HTTP-request 调用现有控制器中的相应函数。不干净,但原则上工作。所以主要问题是:如何从
IHttpActionResult中提取 JSON? 我可能只是在这里遗漏了一个搜索词.. -
这个想法是不能直接从
IHttpActionResult接口获取内容,因为不是所有的http响应码都包含内容。因此,您必须将其转换为“OK”响应类型,然后获取内容。我假设你现有的控制器方法正在做类似return Ok(data)
标签: c# asp.net json api-design endpoint