如何发布Web请求并从Web API响应中接收文件?

时间:2018-02-27 14:20:19

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

我在Sharepoint上有一个Infopath表单模板,我想在那里添加一个按钮,所以当用户点击它时,它将'pf_notifications_checkboxes'一个字符串到下面的Web API。测试以下Web API并返回excel文件,如下所示:

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

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

FileName

1 个答案:

答案 0 :(得分:2)

在客户端执行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);

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

我正在使用.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);