HttpClient.PostAsync(UrlPath,stream)无法向前发布FileUpload HttpRequest中接收的多部分/表单数据流

问题描述 投票:0回答:2

使用POSTMAN,我可以将BODY包含到包含2个文本字段和一个文件流的表单数据的BODY中。实际上,使用Postman,我可以使主体为空,并且仍将其发布到Api端点,正如我在远程调试时用断点确认的那样。

并且,使用HttpClient的代码可以在本地运行时(即:http://XXXXXXXazurewebsites.net/api/Blob/UploadDoc)发布到AspnetCore Api端点。

但是当在Azure上部署了相同的终结点代码时,HttpClient.PostAsync在发布到Postman能够向其发出POST请求的完全相同的URL时接收到404。

问题:如何在本地运行的IISExpress的2个实例上工作,但是在Azure中部署时失败?


客户端代码在Presentation App Svc中的控制器上的[HttpPost]方法内部,并将请求内容以流的形式转发到在不同App Svc中运行的Api控制器:

http://localhost:8888/api/Blob/UploadDoc

我还尝试将流作为byte []读取并从byte []创建HttpContent。但是HttpClient.Post也得到了一个404,ala:

            HttpClient localclient = new HttpClient();
            //localclient.BaseAddress = new System.Uri("http://localhost:8888/api/"); //works posting to here
            localclient.BaseAddress = new System.Uri("http://XXXXXXXXX.azurewebsites.net/api/");  //404 posting to site on azure!
            HttpContent contentStream = new StreamContent(request.Body);
            await localclient.PostAsync("Blob/UploadDoc", contentStream); 

Api代码如下:

  var memstream = new MemoryStream();
  await request.Body.CopyToAsync(memstream);
  memstream.Position = 0;
  var contentba = new ByteArrayContent(memstream.ToArray());
  var response = await localclient.PostAsJsonAsync("Blob/UploadDoc", contentba);
  response.EnsureSuccessStatusCode();  // 404 when posting to site on Azure

并且浏览器正在上传文件ala:

        [HttpPost("UploadDoc")]
        [DisableFormValueModelBinding]
        public async Task<IActionResult> UploadBlobAsync()
        { 
        //work with Request  ...
        }

使用POSTMAN,我可以将BODY包含到包含2个文本字段和一个文件流的表单数据的BODY中发布到http://XXXXXXXazurewebsites.net/api/Blob/UploadDoc。实际上,有了邮递员,我可以让尸体成为...

azure asp.net-core upload stream httpclient
2个回答
0
投票

您如何部署到Azure Web Apps?由于在Azure Web Apps上运行的asp.net核心应用程序托管在IIS上。因此,需要一个web.config文件来在IIS上配置您的应用程序。


0
投票

我认为这是由于未将Request.Body位置设置为零,或以某种方式未正确构建请求而引起的,这又导致目标主机不考虑Post请求来匹配其任何端点。] >

如果我按以下方式提出请求,那么它将起作用:

© www.soinside.com 2019 - 2024. All rights reserved.