一个使用WebClient和WebApi上传下载数据的方法

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中的两个测试函数:

扫描二维码关注公众号,回复: 3435288 查看本文章
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)。



猜你喜欢

转载自blog.csdn.net/hulihui/article/details/74853378
今日推荐