本代码只是我使用的网络请求方式的封装,使用

作者: 编程  发布:2019-11-21

声明:本代码只是我使用的网络请求方式的封装,大家如果有其他的可以一起讨论讨论。

IKVM.NET(IKVM)是个面向.NET与Mono平台的JVM,用户可以通过它直接运行Java应用。近日,来自微软的Erik Meijer与IKVM创建者Jeroen Frijters讨论了该项目的几个方面。此次讨论的涉及面非常广,从IKVM的内核谈到了该项目的未来目标。其要点如下所示:

使用 .NET 建立分布式应用程序
Steve Kirk 和 Priya Dhawan
Microsoft Developer Network

从 MSDN 中看到这篇文章,觉得不错转了过来,对于我这样的.NET新手来说每个工具都是提高效率的好开始。将这十款软件的介绍重新格式化一下,方便以后查阅。以“.NET 程序员十种必备工具”开头的10篇文章都是从这篇文章中分离出来,每篇文章就不分别注明版权和出处了。

     本代码可以在.NET 与.NET CORE的平台下无须做任何改动(除非手动加一些必要的引用,resharper会有提示.)即可使用。

Frijters从2002年该项目启动开始就作为项目的主开发者。此次讨论首先从Frijters介绍IKVM是如何成为Mono项目的一部分 (形成一种双赢的局面,两个项目可以彼此贡献补丁)开始。从架构上来说,IKVM在.NET上完全实现出了Java的内存模型。Frijters尝试尽量 不使用包装器,在某些情况下需要通过包装器才能正确地处理Java的字符串接口。

摘要:本文介绍了使用 ASP.NET 将现有 Microsoft Visual Basic 6.0 代码作为 Web 服务提供时所进行的数据转换。适用于 Microsoft .NET SDK 和 Microsoft Visual Studio.NET 的 Beta 1 版。

本文自发布以来已经增加了新信息。请参阅下面的编辑更新。

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

namespace FrameWork.Common.Web
{
    public class HttpHelper
    {
        /// <summary>
        /// 发起一个HTTP请求(以POST同步方式)
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="param">参数:json格式字符串</param>
        public static string HttpPost(string url, string param = "")
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.Accept = "*/*";
            request.Timeout = 10000;
            request.AllowAutoRedirect = false;
            StreamWriter requestStream = null;
            WebResponse response = null;
            string responseStr = null;
            try
            {
                requestStream = new StreamWriter(request.GetRequestStream());
                requestStream.Write(param);
                requestStream.Close();
                response = request.GetResponse();
                if (response != null)
                {
                    var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                    responseStr = reader.ReadToEnd();
                    reader.Close();
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                request = null;
                requestStream = null;
                response = null;
            }
            return responseStr;
        }

        /// <summary>
        /// get请求,同步方式
        /// </summary>
        public static string HttpGet(string url, string postDataStr)
        {
            var request = (HttpWebRequest)WebRequest.Create(url + (postDataStr == "" ? "" : "?") + postDataStr);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";

            var response = (HttpWebResponse)request.GetResponse();
            var myResponseStream = response.GetResponseStream();
            var myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            var retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

        /// <summary>
        /// 发送短信,异步请求
     /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="jsonString">json字符串,手机号和短信内容必填</param>
        public static void SendMessage(string url, string jsonString)
        {
            var client = new HttpClient();
            HttpContent httpContext = new StringContent(jsonString, Encoding.UTF8);
            httpContext.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            //await异步等待回应
            client.PostAsync(url, httpContext).ContinueWith(t =>
            {
                // Get HTTP response from completed task. 
                var response = t.Result;
                // Check that response was successful or throw exception 
                response.EnsureSuccessStatusCode();
                // Read response asynchronously as JsonValue and write out top facts for each country 
                response.Content.ReadAsStringAsync().ContinueWith(
                    readTask =>
                    {
                        Console.WriteLine(readTask.Result + " time:==>" + DateTime.Now);

                    });
            });
        }
    }
}

如果代码运行在IKVM上,那么.NET开发者可以在Java代码中使用自定义属性。如果代码运行在IKVM上,那么Java与.NET这两个平台都可以使用属性。这样,开发者就可以在Java代码中使用.NET自定义属性,也可以在C#类与成员中使用Java注解。

目录

  • 简介
  • 现有代码提供的数据类型
    • ADO 2x Command 对象
    • ADO 2x Recordset 对象
    • Stream 对象
    • XMLDOM 对象
    • XML 字符串
  • 总结

除非您使用能够获得的最佳工具,否则您无法期望生成一流的应用程序。除了像 Visual Studio?.NET 这样的著名工具以外,还可以从 .NET 社区获得许多小型的、不太为人所知的工具。在本文中,我将向您介绍一些目前可以获得的、面向 .NET 开发的最佳免费工具。我将引导您完成一个有关如何使用其中每种工具的快速教程 — 一些工具在许多时候可以使您节约一分钟,而另一些工具则可能彻底改变您编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具,所以我无法详尽讨论其中每种工具,但您应该了解到有关每种工具的足够信息,以便判断哪些工具对您的项目有用。

 

在背后,IKVM的运行时与编译器主要都是使用C#编写的。Frijters可以使用公开的Java代码(来自于GNU Classpath与OpenJDK等)并替换掉托管代码中的原生C代码。如果用户在应用中没有使用原生代码,那么使用了IKVM的Java应用就是完全 可移植的,因为IKVM并未使用任何原生代码。

简介

.NET 框架简化了将 .NET 代码作为 Web 服务提供的任务。.NET 框架开发人员指南中的 ASP.NET Web 服务和 ASP.NET Web 服务客户机(英文)对此进行了说明。之所以能够实现这种简化,其中一个原因是 .NET 框架提供了一系列规则,用于将复杂的 .NET 数据类型转换为 XML(序列化)以及反向转换(反序列化)。

编写为 .NET 之前的类的现有代码通过特定于语言的数据类型或 COM 对象来传递数据,因此不能依赖于相同的标准规则将这些数据类型序列化为 XML。本文介绍了将现有 Microsoft? Visual Basic 6.0 代码作为 ASP.NET Web 服务提供时所需的数据转换。

评估现有代码是否适合于作为 Web 服务提供时,本文讨论的数据转换问题并不是唯一需要考虑的问题。应考虑的其它因素包括对象和状态模型、返回的数据大小、如何表示已经成功、如何返回错误信息、安全模型(包括访问控制、身份验证和加密)、执行模型(同步或异步)、如何分发代码,以及事务模型(COM+ 事务或声明型事务),等等。这些问题将在即将发表的体系结构主题(英文)文章中进行讨论。

本文讨论:

目前,IKVM已完全支持Java 7,包括对新的指令invoke dynamic的支持。然而,Frijters承认还有很多工作要做以提升新指令的性能。

现有代码提供的数据类型

讨论现有代码传递的所有数据类型的转换将是一个相当大的工程,因此本文只介绍一些最常用的数据类型,以及 XML(作为字符串),因为如果使用 XML 对现有代码进行扩展,那么 XML 就可以涵盖几乎所有其它的数据类型。本文讨论以下数据类型的转换方法:

  • ADO 2x Command 对象
  • ADO2x Recordset 对象
  • Stream 对象
  • XMLDOM 对象
  • XML

用于编写单元测试的 NUnit
用于创建代码文档资料的 NDoc
用于生成解决方案的 NAnt
用于生成代码的 CodeSmith
用于监视代码的 FxCop
用于编译少量代码的 Snippet Compiler
用于转换的工具I ASP.NET Version Switcher
用于转换的工具II Visual Studio Converter 
用于生成正则表达式的 Regulator
用于分析程序集的 .NET Reflector

ADO 2x Command 对象

直接访问数据库的现有代码经常会提供 Microsoft ActiveX? 数据对象 (ADO) 的 Command 对象。虽然不能在运行于不同进程中的应用程序层之间传递 Command 对象,但可以在同一进程内传递该对象。对于单行数据实体,通过 Command 对象的输出参数返回数据比通过 ADO 记录集返回数据效率更高。因此,ADO Command 对象对于返回单行实体数据十分有用。

本文使用了下列技术:

读数据

以下示例中的现有代码返回一个 ADO Command 对象,它包含作为输出参数的数据。Command 对象的 Parameters 集合转换为 XML 并返回给 Web 服务的客户:

 现有代码返回 ADO Command 对象

Cmd = CType(EC.Example1(), ADODB.Command)

 使用 XmlTextWriter 和 StringWriter 转换 Command 对象的 Parameters 集合 

 初始化 stringwriter 和 xmlwriter 以返回 xml 字符串

strWriter = New StringWriter()

xmlWriter = New XmlTextWriter(strWriter)

 在 Parameters 集合内循环,写入名称和值

For i = 0 To Cmd.Parameters.Count - 1             

   xmlwriter.WriteElementString(Cmd.Parameters(i).Name.Substring(1),_

   Cmd.Parameters(i).Value.ToString)

Next

 将 xml 作为字符串返回

Example1 = strWriter.GetStringBuilder.ToString()

.NET、C# 或 Visual Basic .NET、Visual Studio .NET

写数据

将数据作为 Command 对象的参数传递是一种非常有效的数据传递方法。它还可以进行扩展,并提供了一些类型检查功能。不幸的是,由于 Beta 1 中存在缺陷,Command 对象产生的数据无法传递到现有代码。Beta 2 中解决了这个问题。Beta 1 的解决方法是对现有的 VB 6 代码进行扩展,接受 XML。

小结

ADO2x Recordset 对象

ADO 2x 断开连接的记录集通常用于在多层应用程序的各层之间传递数据。数据可以是单行、多行或分层次的行。

本文采用走马观花的方式介绍了上述工具,但我已经试图起码向您提供足够的信息以激起您的好奇心。我相信本文已经让您在某种程度上领悟了几个免费工具,您可以立即开始使用这些工具来编写更好的项目。同时,我还要敦促您确保自己拥有所有其他可以获得的合适工具,无论是最新版本的 Visual Studio、功能强大的计算机还是免费的实用工具。拥有合适的工具将使一切变得大不相同。

读数据

本示例中,现有代码返回一个 ADO Recordset 对象,它包含的层次行数据将被转换为 XML,然后由 Web 服务返回:

 现有代码返回记录集

RS = CType(EC.Example3(), ADODB.Recordset)

 实例化一个接收记录集数据的流

Stream = New ADODB.Stream()

 将记录集的 XML 表示写入流

RS.Save(Stream, ADODB.PersistFormatEnum.adPersistXML)

 将 XML 作为字符串从流返回

Example3 = Stream.ReadText

James Avery 是一位使用 .NET 和其他 Microsoft 技术的顾问。他已经撰写了许多书籍和文章,他的最新著作是《ASP.NET Setup and Configuration Pocket Reference》(Microsoft Press, 2003)。您可以通过javery@infozerk.com 向他发送电子邮件,并且在  阅读他的网络日记。

写数据

以下示例中,使用表示层次行数据的 XML 填充 ADO Recordset 对象,该对象将被传递到现有代码:

 实例化一个记录集对象 

RS = New ADODB.Recordset()

 实例化一个流对象

Stream = New ADODB.Stream()

 打开流对象

Stream.Open()

 将 XML 写入流

Stream.WriteText(RsXML)

 将指针定位到流的开头 

Stream.Position = 0

 使用流中的 XML 数据打开记录集

RS.Open(Stream)    

 将记录集传递到现有代码

EC.Example4(RS)

本文摘自 MSDN Magazine 的 2004 年 7 月刊。

Stream 对象

流提供了一种在应用程序的本地层之间传递数据的有效方法。它是从 Microsoft SQL Server?2000 中读取 XML 的主要方法。

该杂志可在各地的报摊购买,也可以订阅

读数据

以下示例中,现有代码返回表示层次行数据的 XML 流,它被作为字符串读取,并由 Web 服务返回:

Dim Stream As ADODB.Stream

Stream = CType(EC.Example5(), adodb.stream)

Example5 = Stream.ReadText

转到原英文页面

XMLDOM 对象

XMLDOM 对象是一种在多层应用程序的本地层之间传递数据的好方法。它提供了接口可扩展性、类型检查和架构验证功能。

转到原中文页面

读数据

以下示例中,现有代码返回一个 XML 文档对象模型 (XMLDOM),它被转换为 XML 字符串并由 Web 服务返回:

Dim Doc As MSXML2.DOMDocument

 现有代码返回 XMLDOM 对象

Doc = CType(EC.Example6(), msxml2.DOMDocument)

 从 DOM 对象返回 XML

Example6 = Doc.xml

写数据

以下示例中,使用表示层次行数据的 XML 填充 XMLDOM 对象,并将该对象传递到现有代码:

Dim Doc As MSXML2.DOMDocument

 实例化一个 XMLDOMDocument 对象 

Doc = New MSXML2.DOMDocument()

 将 XML 载入 DOM

Doc.loadXML(orderXML)

 将 DOM 传递到现有代码

EC.Example7(Doc)

XML 字符串

XML 是一种在层与层之间传递数据的简单方法。它还将数据的 XML 转换过程推到 COM 互操作边界的“现有代码”端,根据接口的不同,这可能会比在 COM 互操作边界将数据转换为 XML 更有效。

读数据

以下示例中,现有代码返回一个包含 XML 数据的字符串,然后,该字符串由 Web 服务传递给客户:

EC = New ExCode.ExClass()

 将 XML 字符串直接从现有代码传递给客户

Example8 = EC.Example8()

写数据

以下示例中,层次行数据的 XML 表示作为字符串传递到现有代码:

EC = New ExCode.ExClass()

 将 XML 字符串直接从客户传递到现有代码

EC.Example9(orderXML)

总结

本文及附带的示例介绍了有关数据转换的信息。通过数据转换,可以使用 ASP.NET 将现有代码作为 Web 服务提供。本文讨论了一些常用的接口对象,其中包括 XML 字符串,如果使用相应的接口对现有代码进行扩展,它可以涵盖大多数数据。

这些解决方案的性能各异,并且受所传递的数据大小影响。在本系列后面的文章中,我们将对这些实现方法进行比较。

评估现有代码是否适合作为 Web 服务时,接口只不过是应当考虑的诸多因素之一。应考虑的其它因素包括安全性(包括授权、身份验证和加密)、事务模型、状态模型、返回错误和结果的方式,以及代码是同步还是异步执行,等等。

本文由9159.com发布于编程,转载请注明出处:本代码只是我使用的网络请求方式的封装,使用

关键词:

上一篇:没有了
下一篇:没有了