我在Sharepoint上有一个Infopath表单模板,我想在那里添加一个按钮,所以当用户点击它时,它将'pf_notifications_checkboxes'
一个字符串到下面的Web API。测试以下Web API并返回excel文件,如下所示:
我想使用post请求发布excel文件的POST
,对我来说,请求方法是POST类型非常重要。然后用户将下载具有指定' FileName'的文件。
其实我想使用post方法,因为在下一阶段我也会发送excel文件的内容。
重要提示:我只能使用.Net FrameWork 3.5,因为这是InfoPath表单模板中唯一支持的框架。
FileName
答案 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);