【问题标题】:How to Post a web request and receive a file from web API response?如何发布 Web 请求并从 Web API 响应接收文件?
【发布时间】:2018-02-27 14:20:19
【问题描述】:

我在 Sharepoint 上有一个 Infopath 表单模板,我想在其中添加一个按钮,这样当用户单击它时,它将POST 一个字符串到以下 Web API。以下 Web API 经过测试并返回一个 excel 文件,如下所示:

我想使用 post 请求发布 excel 文件的FileName,请求方法为 POST 类型对我来说很重要。然后用户将下载具有指定“文件名”的文件。 实际上我想使用 post 方法,因为在下一阶段我也会发送 excel 文件的内容。

重要提示:我只能使用 .Net FrameWork 3.5,因为这是 InfoPath 表单模板中唯一支持的框架。

[HttpPost]
public HttpResponseMessage Post([FromBody]string FileName)  
    {  
        string reqBook = "c:\somefile.xlsx";  
        //converting Excel(xlsx) file into bytes array  
        var dataBytes = File.ReadAllBytes(reqBook);  
        //adding bytes to memory stream   
        var dataStream = new MemoryStream(dataBytes);  

        HttpResponseMessage httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);  
        httpResponseMessage.Content = new StreamContent(dataStream);  
        httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");  
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = FileName;  
        httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");  

        return httpResponseMessage;  
    }  

【问题讨论】:

标签: c# asp.net-web-api2


【解决方案1】:

当你在客户端执行 HttpPost 时,你会想要读取 HttpResponseStream 以获取响应流的字节数据。

获得响应流数据后,您可以将其反序列化为所需的 C# 对象类型,或者您也可以将其写入磁盘

File.WriteAllBytes("someexcel.xlsx",data);

一个简单的方法是使用 HttpClient 类。

HttpClient client = new HttpClient();
var response = client.PostAsync("", null).Result;
var content = response.Content.ReadAsByteArrayAsync().Result;
File.WriteAllBytes("excel.xlsx", content);

只需在 PostAsync 位中填写 Url 和您要发布的内容。

我正在使用 .Result 来保持一切同步 - 但如果您愿意,可以使用 'await'。

如果您正在使用 HttpWebRequests - 那么过程会变得更加复杂,因为您需要自己管理流。 HttpClient 将为您管理和处理这一切 - 所以我推荐它,除非它需要做一些特殊的事情,而它目前没有。

由于您的 .Net 3.5 要求:

private static HttpWebResponse MakeRequest(string url, string postArgument)
    {

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.Method = "POST";

        request.ContentType = "multipart/form-data;";
        Stream stream = request.GetRequestStream();
        string result = string.Format("arg1={0}", postArgument);
        byte[] value = Encoding.UTF8.GetBytes(result);
        stream.Write(value, 0, value.Length);
        stream.Close();

        return (HttpWebResponse)request.GetResponse();
    }

你可以这样做:

var response = MakeRequest("http://mywebsite.com/ProcessExcel", "accounts.xlsx");

然后做

Stream objStream = response .GetResponseStream(); 
BinaryReader breader = new BinaryReader(objStream); 
byte[] data= breader.ReadBytes((int)webresponse.ContentLength); 
File.WriteAllBytes("excel.xlsx",data);

【讨论】:

  • .Net Framework 3.5 女巫可用于 infopath 表单模板不支持 PostAsync 方法。
  • 如果 PostAsync 不可用,那么 Post 方法就足够了。
  • 其实WebClient既没有PostAsync也没有Post方法。
  • 已更新以适应 .net 3.5 要求
  • 我实现了这个函数,但是在MakeRequest 方法的最后一行抛出了这个异常:“远程服务器返回并且错误:(415) 不支持的媒体类型”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2011-12-20
  • 2014-07-13
相关资源
最近更新 更多