博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
System.Net.Http for Silverlight
阅读量:6399 次
发布时间:2019-06-23

本文共 4412 字,大约阅读时间需要 14 分钟。

System.Net.Http 简介

System.Net.Http 是微软推出的最新的 HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 旨在提供如下内容:

  1. 用户通过 HTTP 使用现代化的 Web Service 的客户端组件;
  2. 能够同时在客户端与服务端同时使用的 HTTP 组件(比如处理 HTTP 标头和消息), 为客户端和服务端提供一致的编程模型。

命名空间  以及  提供了如下内容:

  1.  发送和接收 HTTP 请求与响应;
  2.  and  封装了 RFC 2616 定义的 HTTP 消息;
  3.  封装了 RFC 2616 定义的 HTTP 标头;
  4.  负责生成HTTP响应消息的HTTP处理程序。

System.Net.Http 能够处理多种类型的 RFC 2616 定义的 HTTP 实体正文, 如下图所示:

HttpContent Class Diagrams

此外, System.Net.Http 对 HTTP 消息的处理采用了职责链模式, , 这里就不再多说了。

Silverlight 版本的 System.Net.Http

System.Net.Http 最早和 Asp.Net Mvc4 同时出现, 可以在 .Net 4.0 中使用。 随着 .Net 4.5 的发布, System.Net.Http 正式成为 .Net 基础类库, 目前已经可以在 .Net 4.0/4.5 、 Windows Phone 、 以及 Windows Store App 中使用, 唯独没有发布 Silverlight 版本的 System.Net.Http。 更加悲催的是, 随着 Xamarin 2.0 的发布, Xamarin.Android 和 Xamarin.iOS 居然也开始支持 System.Net.Http , 真是让做 Silverlight 开发的码农心寒。

幸好, .Net 有开源的实现, 那就是 Mono , 其中有大量开源的 .Net 基础类实现, 在 Mono 3.x 版本中, 就有开源的 System.Net.Http , Xamarin 发布的 Android 和 iOS 版本的 System.Net.Http 就是源自 Mono 的, 既然 Android 和 iOS 可以, 相信 Silverlight 也肯定可以, 抱着试试看的态度, 下载了 Mono 下的 System.Net.Http 源代码, 并整理成了一个 Silverlight 项目。 经过一番努力, Silverlight 版本的 System.Net.Http 终于可以使用了, GitHub 项目地址:  , 欢迎围观。

, 移除了部分功能, 例如 Proxy 、 AllowAutoRedirect 、 PreAuthenticate 以及 KeepAlive 设置等, 这些都是 Silverlight 不支持的。

对于 Silverlight 的 BrowserHttp , 仅仅支持 GET 和 POST 方法, 示例代码如下:

HttpClient client = new HttpClient {   BaseAddress = new Uri("http://localhost:8080/HttpTestWeb/api/")};// Get string from serverclient.GetStringAsync("browserhttp/").ContinueWith(t => {   if (t.IsFaulted) {      // report error here      //Application.Current.ReportError(t.Exception.GetBaseException());   } else {      string txt = t.Result;      //Assert.IsFalse(string.IsNullOrEmpty(txt));   }});// Post form data to servervar param = new Dictionary
{ {"Name", "Client Post"}, {"Age", "1"}, {"Birthday", DateTime.Today.ToString("s")}};client.PostAsync("browserhttp/", new FormUrlEncodedContent(param)).ContinueWith(t => { if (t.IsFaulted) { // report error here // Application.Current.ReportError(t.Exception.GetBaseException()); } else { HttpResponseMessage response = t.Result; //Assert.IsTrue(response.EnsureSuccessStatusCode); }});

对于 ClientHttp , 除了 GET 和 POST 之外, 还支持 PUT 和 DELETE (其它的 HTTP 方法也可能支持, 未测试), 示例代码如下:

// PUT to updatevar param = new Dictionary
{ {"Id", "1" }, {"Name", "Client Post"}, {"Age", "1"}, {"Birthday", DateTime.Today.ToString("s")}};client.PutAsync("clienthttp/1", new FormUrlEncodedContent(param)).ContinueWith(t => { if (t.IsFaulted) { // report error here // Application.Current.ReportError(t.Exception.GetBaseException()); } else { HttpResponseMessage response = t.Result; //Assert.IsTrue(response.EnsureSuccessStatusCode); }});// DELETEclient.DeleteAsync("clienthttp/1").ContinueWith(t => { if (t.IsFaulted) { // report error here // Application.Current.ReportError(t.Exception.GetBaseException()); } else { HttpResponseMessage response = t.Result; //Assert.IsTrue(response.EnsureSuccessStatusCode); }});

支持职责链模式的 MessageProcessingHandler , 如下面的代码所示:

public class CustomProcessingHandler : MessageProcessingHandler {   protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken) {      if (request.Method != HttpMethod.Get && request.Method != HttpMethod.Post) {         request.Headers.TryAddWithoutValidation("RequestMethod", request.Method.Method);         request.Method = HttpMethod.Post;      }      return request;   }   protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, CancellationToken cancellationToken) {      var request = response.RequestMessage;      if (request.Headers.Contains("RequestMethod")) {         IEnumerable
values; if (request.Headers.TryGetValues("RequestMethod", out values)) { request.Method = new HttpMethod(values.First()); } } return response; }}

使用起来也是非常简单的:

var customHandler = new CustomProcessingHandler {    InnerHandler = new HttpClientHandler()};var client = new HttpClient(customHandler, true) {    BaseAddress = new Uri("http://localhost:8080/HttpTestWeb/api/")};

参考资料:

  • MSDN 官方文档:
  • ASP.NET Web API 介绍中的 Working with HTTP: 
  • Mono 源代码: 

所有文章遵循,要求署名、非商业 、保持一致。在满足的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: 

本文转自张志敏博客园博客,原文链接:http://www.cnblogs.com/beginor/archive/2013/04/14/3019807.html
,如需转载请自行联系原作者
你可能感兴趣的文章
Java操纵MongoDB_1(环境设置)
查看>>
C#字符串操作--获取字符或字符串的位置、数量
查看>>
php - 字符串处理
查看>>
bulk collect 以及ref cursor使用
查看>>
mysql性能优化-慢查询分析、优化索引和配置
查看>>
图解分布式一致性协议Paxos
查看>>
Jedis与Redisson选型对比
查看>>
MongoDB学习笔记(查询)
查看>>
freemarker自定义标签的写法和使用
查看>>
使用Gitlab CI进行持续集成
查看>>
Win32编程基本概念
查看>>
×××灯式样的站点链接说明,链接提示
查看>>
Linux下动态IP和静态IP的设置方法
查看>>
SUSE配置网关
查看>>
java中获取字母和数字的组合
查看>>
8-3 泛型
查看>>
你是“职业”软件开发吗?——书评《浮现式设计-专业软件开发的演进本质》...
查看>>
iOS 多线程 之 GCD(大中枢派发)(二)
查看>>
开源项目 log4android 使用方式详解
查看>>
C# 中字符串转换成日期
查看>>