对外暴露一个上传文件的WebAPI给第三方使用,实现层面上,本质上是将请求转发到另外一个WebService,并处理它返回的结果,构造成指定的格式返回给第三方。
看代码:
/// <summary>
/// 测试:文件上传
/// </summary>
/// <returns></returns>
[System.Web.Mvc.HttpPost]
public IHttpActionResult Send()
{
//处理接收到的请求,解析请求内容与大小
var curRequest = HttpContext.Current.Request;
byte[] inputBytes;
int inputStreamLength;
using (var inputStream = curRequest.InputStream)
{
inputStreamLength = Convert.ToInt32(inputStream.Length);
inputBytes = new byte[inputStreamLength + 1];
inputStream.Read(inputBytes, 0, inputStreamLength);
inputStream.Close();
}
//构造真正的请求
//请求方式为POST,请求内容格式、内容与接收到的请求保持一致
var request = (HttpWebRequest)WebRequest.Create("http://172.16.50.135:8888/Projects/Common/Mobile/ReceiveUploadFile.aspx");
request.Method = "POST";
request.ContentType = curRequest.ContentType;
request.ContentLength = curRequest.ContentLength;
using (var requestStream = request.GetRequestStream())
{
requestStream.Write(inputBytes, 0, inputStreamLength);
requestStream.Close();
}
//获取请求返回响应结果
var response = request.GetResponse();
//处理返回结果
var sResult = "";
var responseStreamLength = Convert.ToInt32(response.ContentLength);
//返回结果为空时,构造提示失败
if (responseStreamLength <= 0)
return Json(new { code = 400, desc = "失败", data = sResult });
//返回结果不为空时,解析结果
using (var responseStream = response.GetResponseStream())
{
var responseBytes = new byte[responseStreamLength];
if (responseStream != null)
{
responseStream.Read(responseBytes, 0, responseStreamLength);
responseStream.Close();
}
//请字节数组转为字符串
sResult = Encoding.ASCII.GetString(responseBytes);
}
//返回成功消息
return Json(new {code = 200, desc = "成功", data = sResult.Replace(" ", "")});
}
技术关键点:
1.从调用我们真正对外暴露的接口中获取请求上下文,包括请求内容、格式、大小等
2.构造实际的请求,包括请求地址、方式等,且请求格式、内容、大小均从对外暴露的接口中解析获得并赋值
3.获取实际请求结果时,能将有价值的内容从ANSI数组转换成字符串格式
测试:
1.我们在Fiddler中构造请求,调用我们对外暴露的接口
2.执行请求,正常返回结果
3.其中,内部实际调用接口返回的结果为