【发布时间】:2017-05-21 09:23:14
【问题描述】:
我有一个 AJAX 表单,它将表单数据发布到本地 API url:/api/document。它包含一个文件和一个自定义 ID。我们只想获取准确接收到的请求并将其转发到example.com:8000/document/upload 的远程 API。
有没有一种简单的方法可以使用 Asp.NET Core 将请求“转发”(或代理?)到远程 API?
下面我们的想法是简单地使用 Web API Http 客户端来获取请求然后重新发送它(这样做我们希望能够从后端附加一个私有 api 密钥 ),但似乎无法正常工作,PostAsync 不接受Request。
Ajax 发送的原始请求
POST http://localhost:62640/api/document HTTP/1.1
Host: localhost:62640
Connection: keep-alive
Content-Length: 77424
Accept: application/json
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryn1BS5IFplQcUklyt
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,fr;q=0.6
------WebKitFormBoundaryn1BS5IFplQcUklyt
Content-Disposition: form-data; name="fileToUpload"; filename="test-document.pdf"
Content-Type: application/pdf
...
------WebKitFormBoundaryn1BS5IFplQcUklyt
Content-Disposition: form-data; name="id"
someid
------WebKitFormBoundaryn1BS5IFplQcUklyt--
后端代码
我们的 .NET Core 后端有一个简单的“转发到另一个 API”的目的。
public class DocumentUploadResult
{
public int errorCode;
public string docId;
}
[Route("api/[controller]")]
public class DocumentController : Controller
{
// POST api/document
[HttpPost]
public async Task<DocumentUploadResult> Post()
{
client.BaseAddress = new Uri("http://example.com:8000");
client.DefaultRequestHeaders.Accept.Clear();
HttpResponseMessage response = await client.PostAsync("/document/upload", Request.Form);
if (response.IsSuccessStatusCode)
{
retValue = await response.Content.ReadAsAsync<DocumentUploadResult>();
}
return retValue;
}
}
我们有一个 GET 请求(此处未复制),它工作得很好。因为它不必从本地 POST 数据中获取数据。
我的问题
如何简单地传递传入的本地 HttpPost 请求并将其转发到远程 API?
我在 stackoverflow 或网络上搜索了很多内容,但所有这些都是关于将 Request.Content 转发到远程的旧资源。
但在 Asp.NET Core 1.0 上,我们无法访问 Content。我们只能检索Request.Form(也不是Request.Body),然后它不被接受为PostAsync方法的参数:
无法从 Microsoft.AspNetCore.Http.IformCollection 转换为 System.Net.Http.HttpContent
我的想法是直接将请求传递给 postAsync:
无法从 Microsoft.AspNetCore.Http.HttpRequest 转换为 System.Net.Http.HttpContent
我不知道如何根据收到的本地请求重建预期的 HttpContent。
预期响应
有关信息,当我们使用自定义 Id 和上传的文件发布有效的表单数据时,远程 (example.com) API 响应为:
{
"errorCode": 0
"docId": "585846a1afe8ad12e46a4e60"
}
【问题讨论】:
-
如果表单是一个简单的键值对,那么您可以提取表单数据并将其放入字典中,然后您可以将其传递给下一个 api
-
不是:它还包含一个文件。这是一个包含文件和
id: value的表单数据。 -
创建一个新的
HttpRequestMessage,复制必要的信息并将其发送到api -
我正在寻找这个解决方案。但是如何从本地 post 请求中读取文件内容呢?身份证呢?我虽然想使用
var filecontent = new StreamContent(Request.Form.Files[0].OpenReadStream());,但内容是空的。 -
检查一下,看看它是否接近。本来打算提出这样的建议,但首先检查stackoverflow.com/a/39416373/5233410周围是否有重复项
标签: c# asp.net-core asp.net-core-mvc .net-core