WebClient封装了基于HTTP的GET/POST数据的多个操作,使用该类可以与ASP.NET WebApi框架通信,满足上传数据给服务器或从服务器下载数据的需求,使用的关键技术有:
1)如何通过HTTP查询串方式和GET方法上传数据给服务器,并获取返回结果。
2)如何通过HTTP查询串方式和POST方法上传大量数据给服务器,并获取返回结果。
1、路由配置
如下代码是ApiController的路由配置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi2",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
);
/* 可能引起多匹配动作的错误
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);*/
}
}
需要指出,可以保留上述第二个Api路由,但必须保持上述顺序,否则将报运行时错误:没有找到匹配的WebApi方法。
2、WebApiController函数
如下代码是ApiController中的两个测试函数:
public class TestApiController : ApiController
{
[HttpGet]
public string GetString(string loginId, int count)
{
return $"loginId={loginId}, count={count}";
}
[HttpPost]
public async Task<string> UploadString(string loginId, int count)
{
string str = await Request.Content.ReadAsStringAsync();
return $"loginId={loginId}, count={count}, upload={str}";
}
}
需要注意,在POST方法的UploadString函数使用了Request.Content的异步读取数据方法,可以异步获取HTTP上传POST的字符串(可能较大),该方法只提供了异步读取各种数据类型的方法,没有提供同步方法。
3、GET上传数据的测试代码
如下是通过查询串上传GET两个数据项的代码:
string addr = "http://localhost/sfsj/api/TestApi/GetString";
WebClient webClient = new WebClient();
webClient.Headers["ContentType"] = "text/plain";
webClient.Encoding = Encoding.UTF8;
webClient.QueryString["loginId"] = "客户";
webClient.QueryString["count"] = "100";
string text = webClient.DownloadString(addr);
MessageBox.Show(text);
需要注意,查询串都是键值形式,且都是字符串类型。但对应的WebApi可以是兼容的数据类型。比如GetString(string, int)就直接把count数据转换为int。
4、POST上传数据的测试代码如下是通过查询串和POST方法上传一个字符串的代码:
string addr = "http://localhost/sfsj/api/TestApi/UploadString";
WebClient webClient = new WebClient();
webClient.Headers["ContentType"] = "text/plain";
webClient.Encoding = Encoding.UTF8;
webClient.QueryString["loginId"] = "客户";
webClient.QueryString["count"] = "100";
string text = webClient.UploadString(addr, "POST", "中国长城");
MessageBox.Show(text);
需要指出,POST方法时,仍然可以使用查询串上传数据项,同时可以单独上传一个数据项。由于单独上传的数据项可能较大(比如文件等),因此一般使用HTTP的POST方法。
编程运行环境:Visual Studio Commnunity 2017、.NET 4.5、Windows10(自带的IIS)。