如何从 javascript 中的 C# HttpResponseMessage 读取内容?

Posted

技术标签:

【中文标题】如何从 javascript 中的 C# HttpResponseMessage 读取内容?【英文标题】:How to read the content from a C# HttpResponseMessage in javascript? 【发布时间】:2021-10-16 02:15:31 【问题描述】:

我有一个名为 csv 的字符串,字面意思就是这样,例如“姓名、姓氏、年龄、身高等” 然后我像这样将它发送到后端..

var csv = exportRequests.GetCSV();
            var filename = string.Format("0-1-2:yyyy-MM-dd_hh-mm-ss-tt.csv", "Request", requestStatus.ToUpperInvariant(), DateTime.Now);              

            var stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(csv);
            writer.Flush();

            var result = new HttpResponseMessage(HttpStatusCode.OK)
            
                Content = new ByteArrayContent(stream.GetBuffer())
            ;
            result.Content.Headers.ContentDisposition =
                new ContentDispositionHeaderValue("attachment")
                
                    FileName = filename
                ;
            result.Content.Headers.ContentType =
                new MediaTypeHeaderValue("text/csv");
          
            //var test = new FileDetailViewModel();
            //test.Name = filename;
            //test.Rows = csv;

            return Ok(result);

然后我在后端读取它,但实际内容在哪里?当然,字节应该在某个地方。 content 属性只有标题。这发生在使用 $.ajax 进行调用的旧系统上。

谢谢

【问题讨论】:

请编辑您的问题并添加您的代码段(不是代码段的屏幕截图)。 js上的结果需要是截图才能看到结果,但是我上面c#已经粘贴了。 您是使用 Postman 之类的工具检查您的 API 还是只是从 url 请求数据?在那里你可以找到它是否向服务器发送了一些东西。这实际上必须是您的第一步。 【参考方案1】:

我认为在 javascript 中无法通过 HttpResponseMessage 读取内容。您只能下载内容。

public HttpResponseMessage GetCsv()

     var csv = exportRequests.GetCSV();
     var filename = string.Format("0-1-2:yyyy-MM-dd_hh-mm-ss-tt.csv", "Request", requestStatus.ToUpperInvariant(), DateTime.Now);              

     var stream = new MemoryStream();
     StreamWriter writer = new StreamWriter(stream);
     writer.Write(csv);
     writer.Flush();

     var result = new HttpResponseMessage(HttpStatusCode.OK)
     
        Content = new ByteArrayContent(stream.GetBuffer())
     ;
     result.Content.Headers.ContentDisposition =
     new ContentDispositionHeaderValue("attachment")
     
         FileName = filename
     ;
     result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
      
     return result;   

下载脚本

window.open('/api/controller/GetCsv', '_blank', '');

如果要显示csv的内容可以使用以下代码

[HttpPost]
public String GetCsv()

    return exportRequests.GetCSV();

脚本

$('#btngetcsv').click(function() 
  $.ajax(
    url: "/api/controller/GetCsv",
    data: ,
    type: "Post",
    dataType: "Json",
    success: function(result) 
      var arr = csvToArray(result);
      for (var i = 0; i < arr.length; i++) 
        var name = arr[i].name;
        var lastname = arr[i].lastname;
        //etc...........
      
    ,
    error: function() 
    
  );
);

function csvToArray(str, delimiter = ",") 
  // slice from start of text to the first \n index
  // use split to create an array from string by delimiter
  const headers = str.slice(0, str.indexOf("\n")).split(delimiter);

  // slice from \n index + 1 to the end of the text
  // use split to create an array of each csv value row
  const rows = str.slice(str.indexOf("\n") + 1).split("\n");

  // Map the rows
  // split values from each row into an array
  // use headers.reduce to create an object
  // object properties derived from headers:values
  // the object passed as an element of the array
  const arr = rows.map(function(row) 
    const values = row.split(delimiter);
    const el = headers.reduce(function(object, header, index) 
      object[header] = values[index];
      return object;
    , );
    return el;
  );

  // return the array
  return arr;

【讨论】:

以上是关于如何从 javascript 中的 C# HttpResponseMessage 读取内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JavaScript 调用 C# 函数?

数组应该如何从 C# 传递给 Javascript 函数?

如何使用“no-cors”将 JavaScript HTTP 发布请求代码更改为 C#?

如何从 C# 中的 TCP 数据包中获取 Http 正文消息

@foreach 循环中的多种形式。如何使用 javascript 异步提交一个。 C# 核心剃刀

如何从http调用获取调用者信息到c#中的另一个api