为什么接收API没有获取到参数中的内容?

Why is the receiving API not getting content in the parameter?

我正在尝试让一个 API(报告 API)与另一个 API(存储过程运行器 API)对话,这是我们正在排序的解决方案考虑到我们在 .NET Core 2.2 中创建了第一个 API 并且 Sap.Data.SQLAnywhere.v4.5 驱动程序仅适用于 .NET 4.7.2 框架,因此被迫采用。因此,我们将它们隔离以进行补偿。我在过去 4 或 5 小时内看到的所有答案让我相信我这样做是正确的,但它仍然不起作用。

我可以使用 json/text body 从 Postman 访问存储过程运行器,然后从数据库中获取结果。但是,当我尝试从 C# 中解决这个问题时,我第一次得到 ,我想我已经修复了,但现在我得到了 500 个错误,当从报告 API 调试到存储过程运行程序时,我注意到我没有收到从 body.

传递的参数
[HttpPost]
[Route("api/Reports/GetStuff")]
[ResponseType(typeof(ResponseObject))]
public ResponseObject GetStuff([FromBody]string report)
{
        var response = new ResponseObject();

        try
        {
            response = new ReportService().RunStuff(report);
        }
        catch (Exception e)
        {
            throw;
        }

        return response;
}

上面是 SprocRunnerAPI 我得到的是

response = new ReportService().RunStuff(report);

在它失败之前,因为它在 "report".

中没有任何内容
public class ApiService
{
    public static HttpClient ApiClient { get; set; }

    public static void InitializeClient()
    {
        ApiClient = new HttpClient();
        //ApiClient.BaseAddress = new Uri("");
        ApiClient.DefaultRequestHeaders.Accept.Clear();
        ApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
}

这是我初始化所有内容然后在以下 class 方法中使用它的地方:

public ResponseObject RunReportToCSV(string report)
    {
        var rep = new ResponseObject();
        ApiClient.ApiService.InitializeClient();
        string url = @"http://localhost/EnterpriseReportRunner/api/reports/GetStuff";

        var httpContent = new StringContent(report, Encoding.UTF8, "application/json");

        //ServicePointManager.Expect100Continue = false; I honestly don't know where this goes... or if it is needed.

        var response = ApiClient.ApiService.ApiClient.PostAsync(url , httpContent).Result;

        if (response.IsSuccessStatusCode)
        {
            rep = response.Content.ReadAsAsync<ResponseObject>().Result;
        }
        else
        {
            throw new Exception(response.ReasonPhrase);
        }

        return rep;
}

我达到了

var response = ApiClient.ApiService.ApiClient.PostAsync(url, httpContent).Result;

当它从外部调用前面提到的api方法失败时。我注意到我放入 C# 中的主体与我放入 Postman 中的主体之间没有区别,在进行任一调用时,我也没有注意到通过 Fiddler 在 Headers 上查看的区别。我很困惑为什么我到处都看到的东西是行不通的。

谢谢。

从 SprocRunner 添加 Stack TraceAPI…这没什么用,因为我知道为什么会这样。至此,我期待一个 JsonSerialized object 但我没有它,因为它没有从第一个 API 传递到第二个

at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at EnterpriseReportRunner.Service.ReportService.RunStuff(String report) in C:\Workspace\Solution.NET\LOB\InternalReportsAdminConsole Solution\EnterpriseReportRunner\EnterpriseReportRunner\Service\ReportService.cs:line 27 at EnterpriseReportRunner.Controllers.ReportsController.GetStuff(String report) in C:\Workspace\Solution.NET\LOB\InternalReportsAdminConsole Solution\EnterpriseReportRunner\EnterpriseReportRunner\Controllers\ReportsController.cs:line 67

需要明确的是,这是来自 SprocRunnerAPI 的堆栈,而不是调用它的 ReportsAPI。我试图在 HttpContext 中找到 body 以查看 Postman 调用和 C# 调用之间的区别,但似乎找不到它,它真的被埋在 InputStream 中了吗?

我认为这个问题似乎是多余的。最重要的是,即使您期望序列化 JSON 对象,您也需要再次将其序列化 ,否则当您通过 HttpClient 传递 StringContent 时,正文内容不会显示在接收控制器的消费参数中。

var httpContent = new StringContent(JsonConvert.SerializeObject(report), Encoding.UTF8, "application/json");

尽管 "report" 已经是一个字符串...对我来说真的很奇怪。但这样就解决了。

发现进入控制器的字符串也包含在另一个对象中,所以 .Root 在反序列化时似乎是你的朋友。至少我从这次经历中学到了一些东西。

感谢您的所有意见。可能想要 link 这个到 .