Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将文件从另一个webapi传递到另一个asp.net核心webapi_C#_Asp.net Core_Httprequest_Httpclient_Asp.net Core Webapi - Fatal编程技术网

C# 将文件从另一个webapi传递到另一个asp.net核心webapi

C# 将文件从另一个webapi传递到另一个asp.net核心webapi,c#,asp.net-core,httprequest,httpclient,asp.net-core-webapi,C#,Asp.net Core,Httprequest,Httpclient,Asp.net Core Webapi,现有的asp.net核心Api如下所示 public async Task<IActionResult> UploadAsync() { IFormFile file = null; var files = Request.Form.Files; if (files.Count > 0) { file = Request.Form.Files[0]; var fileText = new StringBuild

现有的asp.net核心Api如下所示

public async Task<IActionResult> UploadAsync()
{
    IFormFile file = null;

    var files = Request.Form.Files;
    if (files.Count > 0)
    {
        file = Request.Form.Files[0];

        var fileText = new StringBuilder();
        using (var reader = new StreamReader(file.OpenReadStream()))
        {
            while (reader.Peek() >= 0)
                fileText.AppendLine(reader.ReadLine());
        }
        int stagingDetailId = await _stagingMarketProvider.GetV1StagingStatusDetailId();


        var result = await SaveStagingMarketsAsync(_fileProvider.ReadImportedMarkets(fileText.ToString()));

        return Ok(result);
    }

    return Ok();

}
public async Task UploadAsync()
{
ifformfile=null;
var files=Request.Form.files;
如果(files.Count>0)
{
file=Request.Form.Files[0];
var fileText=新的StringBuilder();
使用(var reader=newstreamreader(file.OpenReadStream()))
{
while(reader.Peek()>=0)
AppendLine(reader.ReadLine());
}
int stagingDetailId=wait_stagingMarketProvider.getv1 stagingStatusDetailId();
var result=await saveStagingMarketsSync(_fileProvider.ReadImportedMarkets(fileText.ToString());
返回Ok(结果);
}
返回Ok();
}

现在,要从另一个asp.net核心webapi使用该api,我必须仅通过请求对象传递这些文件,因为业务原因,我无法更改任何现有的api代码。

解决方案1:如果您希望您的客户端重定向到其他api,则适用

假设API调用方理解HTTP 302,并且可以相应地采取行动,那么
302重定向应该会对您有所帮助

public IActionResult Post()
{
    return Redirect("http://file-handler-api/action");
}
从中,重定向方法将302或301响应返回给客户端

解决方案2:使用HttpClient发布文件的C代码

下面的c#代码来自。这是创建HttpClient对象并尝试将文件发送到web API的简单代码

在从一个API到另一个API执行此操作时,必须首先将文件保存在临时位置。该临时位置将是此方法的参数

此外,上传后,如果不需要,您可能希望删除该文件。这个私有方法可以在文件上传到第一个API完成后调用

private async Task<string> UploadFile(string filePath)
{
    _logger.LogInformation($"Uploading a text file [{filePath}].");
    if (string.IsNullOrWhiteSpace(filePath))
    {
        throw new ArgumentNullException(nameof(filePath));
    }

    if (!File.Exists(filePath))
    {
        throw new FileNotFoundException($"File [{filePath}] not found.");
    }
    using var form = new MultipartFormDataContent();
    using var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(filePath));
    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
    form.Add(fileContent, "file", Path.GetFileName(filePath));
    form.Add(new StringContent("789"), "userId");
    form.Add(new StringContent("some comments"), "comment");
    form.Add(new StringContent("true"), "isPrimary");

    var response = await _httpClient.PostAsync($"{_url}/api/files", form);
    response.EnsureSuccessStatusCode();
    var responseContent = await response.Content.ReadAsStringAsync();
    var result = JsonSerializer.Deserialize<FileUploadResult>(responseContent);
    _logger.LogInformation("Uploading is complete.");
    return result.Guid;
}
专用异步任务上载文件(字符串文件路径)
{
_logger.LogInformation($“上载文本文件[{filePath}]”);
if(string.IsNullOrWhiteSpace(filePath))
{
抛出新ArgumentNullException(nameof(filePath));
}
如果(!File.Exists(filePath))
{
抛出新的FileNotFoundException($“未找到文件[{filePath}”);
}
使用var form=new MultipartFormDataContent();
使用var fileContent=newbytearraycontent(wait File.readallbyteasync(filePath));
fileContent.Headers.ContentType=MediaTypeHeaderValue.Parse(“多部分/表单数据”);
Add(fileContent,“file”,Path.GetFileName(filePath));
添加(新内容(“789”),“用户ID”);
添加(新内容(“一些评论”),“评论”);
表格。添加(新内容(“真实”),“主要”);
var response=wait_httpClient.PostAsync($“{u url}/api/files”,form);
response.EnsureSuccessStatusCode();
var responseContent=await response.Content.ReadAsStringAsync();
var result=JsonSerializer.Deserialize(responseContent);
_logger.LogInformation(“上传完成”);
返回result.Guid;
}

希望这对您有所帮助。

您似乎不理解我的问题,manoj,让我详细说明我的问题。尝试添加其他代码。您可以从第一个API调用此私有方法将文件上载到其他API。