为什么接收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 这个到 .
我正在尝试让一个 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# 中解决这个问题时,我第一次得到
[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 这个到