【问题标题】:How to convert an IHttpActionResult (with JSON inside) to an object I can process with LINQ如何将 IHttpActionResult(内部带有 JSON)转换为我可以使用 LINQ 处理的对象
【发布时间】:2020-03-30 13:24:17
【问题描述】:

这可能是一个菜鸟问题或架构上的误解,但我无论如何都会问它,因为我没有想法和搜索词:目标是实现一个控制器CountriesController(),它应该连接(JSONish ) 两个端点的结果。

假设我有两个端点 api/allowedCountriesToSellapi/allowedCountriesToBuy 分别实现为 CountriesSellController()CountriesBuyController()。它们都以 JSON 形式返回数据,我希望将其合并并作为新端点提供。我知道这种架构并不理想,但我不允许在架构上有所不同。此外,我实际上必须将两个不同的文件发布到这些端点 - 两个现有的控制器都包含类似

[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file, string selectBox)
{ // ...

我的新端点编译了所有这两个必需参数,我们称它们为myFileXmySelectBox。这是我到目前为止所拥有的:

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

问题是list1list2 都是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


【解决方案1】:

你需要做一些事情。

var response = await myOtherContoller1.FileUpload(myFile2,mySelectBox).ExecuteAsync();

这将返回HttpResponseMessage,您可以从中获取内容

您可以像这样获取您的内容:Getting content/message from HttpResponseMessage

不过,我的建议是将其他控制器的逻辑提取到服务类中,并在这个和其他两个中调用,即现在在原始控制器中的逻辑。

【讨论】:

  • 我会试试你的建议rsn。服务类的想法很酷,但它(再次)与客户不触及任何现有架构的想法相矛盾。两个端点都包含相当多的逻辑(理想情况下属于服务类) - 但我的手被束缚了,我无法清理它。
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多