来自 操作系统 2020-05-05 19:24 的文章
当前位置: 澳门威尼斯人平台 > 操作系统 > 正文

NET应用程序中异步调用Web Service的几种方法

WebAssembly Runtime 现已添加 .NET Core API,开发者可直接在 .NET 应用程序中调用 WebAssembly 模块。

美国当地时间8月24日,Go 开发团队宣布推出 Go 1.11 正式版。

作者:veryhappy(wx.net),

Js如何调用本地应用程序,Js调用应用程序

一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过ActiveX对象的方式进行。但是这个方式只适用于IE浏览器,另一种比较通用的方式便是URL协议的方式,我们将某种URL的协议注册给某个程序来进行处理,比如将tencent://这样的协议注册给QQ程序来进行处理,当浏览器需要访问这样的协议的时候就转给QQ程序进行处理。这种URL协议的方式是可以跨平台的,比如在Windows上你需要添加注册表项。
  
首先先看看js应该如何调用qq客户端。
 window.open("tencent://message/?uin=346915968")
  window.open顾名思义,打开。Tencent就不用多说了吧 BAT之T。上述能直接打开qq帐号对应的对话框。由此可以知道网页上的在线客服功能是如何实现了吧。  
 那要是不需要打开对话框,就想要登陆qq应该如何实现呢?很简单呀: 
 window.open("tencent://message/?uin=qq") 不过调用应用这种跟黑客没什么差别的行为,浏览器一般都是禁止的,
图片 1
 选择允许后, 

 图片 2  
启动应用,qq客户端就会被调起。
为什么说这个呢,老板又给了个需求,想让调起qq客户端一样,想通过演示页面的一个按钮,调起售票系统的各种程序...
什么都不说了,先看看什么是自定义协议。
Pluggable Protocol,又叫URL Protocol,有时会叫Shell命令,通用的Protocol有http、ftp、mailto等,这些都是windows安装时自带的协议。
接着也实现一个简单的自己的自定义协议吧。
1,运行window,输入regedit打开注册表。 在HKEY_CLASSES_ROOT下面建一个自己起的名字的表。
 图片 3
用如下格式把各项值添上:
图片 4
js打开qq音乐.exe

图片 5
 
 图片 6
启动应用

图片 7

end.   

一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过Activ...

Mozilla 宣布由 Bytecode Alliance 创建的 Wasmtime(WebAssembly runtime)现已添加处于早期预览版状态的 .NET Core API,这就意味着开发者可以直接在 .NET 应用程序中调用 WebAssembly 代码。

下载地址 >>> or

 

图片 8

看看有哪些值得关注的更新 ——

摘要

Bytecode Alliance(字节码联盟)是由 Mozilla、Fastly、Intel 与 Red Hat 联合成立的组织,该联盟旨在通过协作实施标准和提出新标准,以完善 WebAssembly 在浏览器之外的生态。Mozilla 提到,.NET Core 作为一个跨平台的 Runtime,仍提供对 WebAssembly 的支持主要三个好处,除了可跨平台共享更多代码之外,还能安全地隔离不受信任的代码,同时凭借着 WebAssembly 的接口类型(WebAssembly Interface Types),WebAssembly 和 .NET 可相互传递复杂类型。

新版本在工具链、运行时和库都有许多变化和改进。当然,兼容性方面依然会兼容旧版本。此外有两个最值得关注且激动人心的新特性 —— 对模块和 WebAssembly 的支持。

想必做.NET下开发的人对调用Web Service并不陌生,本文不介绍Web Service如何编写,只介绍.NET 应用程序中如何异步调用Web Service的几种方法。示例采用Windows应用程序。异步调用很有用,可以让客户端调用Web Service时(一般耗时未知),不至于阻塞客户端的UI线程导致假死的样子,还可以在调用Web Service的同时做些其它的处理。希望能对大家有所帮助,借此提出更好的解决方法。

虽然我们能够使用 .NET Core 构建跨平台应用,但如果要使用诸如 C 或是 Rust 等原生函数库,这仍然是十分不方便的操作,因为需要函数库为每个平台发布特定函数库版本。不过有了 WebAssembly 之后,我们可以将其作为桥梁以简单满足上面的需求。原生函数库可以先编译成 WebAssembly,然后包括 .NET Core 在内的许多平台就能使用这些 WebAssembly 模块,这将简化函数库的发布以及应用程序对这些函数库的依赖方式。

Go Modules

 

由于 WebAssembly 是面向网页设计的,网页是一种每次访问网站(读/写数据)都会执行不受信任代码的环境,WebAssembly 模块只能调用从主机环境明确输入的外部函数,而且只能在主机分配的内存区域进行读写数据,这种沙盒设计方式也能被应用在 .NET Core 中,以增加安全性。通过支持 WebAssembly,.NET Core 也能使用沙盒以执行不信任代码。

此版本增加了对被称作“模块(Go Modules)”的初步支持,这是 GOPATH 的替代方案,集成了对版本控制和软件包分发的支持。该功能目前仍处于实验性阶段,并且仍有一些可能会影响使用的问题,因此请随意使用问题跟踪器进行反馈或查阅解决方案。

测试程序界面

另外,Bytecode Alliance 力推的 WebAssembly 接口类型增加了 WebAssembly 与其他语言的互通性,.NET Core 也能从中受益。Mozilla 表示,WebAssembly 接口类型简化了应用程序与 WebAssembly 模块间来回传递复杂类型所需的“胶水代码”。当 Wasmtime 的 .NET API 最终可以对接口类型进行操作,WebAssembly 和 .NET 之间就能够无缝地传递复杂类型。

WebAssembly

图片 9

最后,Wasmtime 新增加的这个 .NET Core API 尚处于预览阶段,Bytecode Alliance 成员仍在对其积极开发中,更新将不保证向后兼容。当前目标是让 Wasmtime 更为稳定,因此不建议开发者将 Wasmtime 的 .NET Core API 用于正式产品开发。

Go 1.11 还为 WebAssembly 添加了一个处于实验性阶段的端口。它使得开发者可将 Go 程序编译为与四个主流 Web 浏览器兼容的二进制格式。可以在 webassembly.org 上阅读有关 WebAssembly(缩写为"WASM")的更多信息。

图一,调用前界面

(文/开源中国)    

Go 程序现在可被编译为一个 WebAssembly 模块,该模块包括用于 goroutine 调度、垃圾收集、映射等的 Go 运行时。因此,生成的模块大小约为 2MB,或压缩后为 500KB 左右。Go 程序也可以使用新的实验性 [syscall/js](https://link.zhihu.com/?target=https%3A//golang.org/pkg/syscall/js/) 包调用 JavaScript。有关二进制包大小和与其他语言互操作的问题尚未成为优先处理事项,不过会在将来的版本中得到解决。

 

下面和大家分享如何在Go语言中使用WebAssembly。先安装好Go1.11+版本的Go语言环境。然后创建hello.go文件:

图片 10

package mainimport "fmt"func main() { fmt.Println("你好,WebAssembly!")}

图二,调用后界面

为了不了解Go语言的同学便于理解,让我们简单介绍一下程序。第一句表示当前的包名字为main,同时包中有一个main函数,而main包的main函数就是Go语言程序的入口。在main函数中通过导入的fmt包内的Println方法输出了一个字符串。然后在命令行中直接输入go run hello.go来运行程序。如果一切正常的话。应该可以在命令行看到输出"你好,WebAssembly!"的结果。

 

Go1.11开始支持WebAssembly,对应的操作系统名为js,对应的CPU类型为wasm。目前还无法通过go run的方式直接运行输出的wasm文件,因此我们需要通过go build的方式生成wasm目标文件,然后通过Node环境执行。需要注意的是更新的Node版本对wasm的支持会更好,作者推进使用v10以上的版本。

详细代码实现

通过以下命令将hello.go编译为a.out.wasm:

闲言少叙,直接进入主题吧。首先一个声明一个类(将来在客户端与服务器间传递):

$ GOARCH=wasm GOOS=js go build -o a.out.wasm hello.go

 

生成的a.out.wasm文件体积可能超过2MB大小。而且生成等a.out.wasm还无法直接运行,需要初始化Go语言必须的运行时环境。

图片 11public class Class1
图片 12图片 13    ...{
图片 14        private int _ID;
图片 15        private string _Name;
图片 16        public int ID
图片 17图片 18        ...{
图片 19            get
图片 20图片 21            ...{
图片 22                return _ID;
图片 23            }
图片 24            set
图片 25图片 26            ...{
图片 27                _ID = value;
图片 28            }
图片 29        }        
图片 30
图片 31        public string Name
图片 32图片 33        ...{
图片 34            get
图片 35图片 36            ...{
图片 37                return _Name;
图片 38            }
图片 39            set
图片 40图片 41            ...{
图片 42                _Name = value;
图片 43            }
图片 44        }
图片 45    }
图片 46

对运行时初始化是一个相对复杂的工作,因此Go语言提供了一个图片 47/misc/wasm/go_js_wasm_exec脚本文件,用于执行Go语言生成的wasm文件。

 

参考go_js_wasm_exec脚本的实现,我们可以直接使用wasm_exec.js来运行wasm模块。我们可以先将wasm_exec.js文件复制到当前目录,然后通过以下命令运行wasm模块:

 

$ node wasm_exec.js a.out.wasm

其次,声明一个Web方法:

你好,WebAssembly

 

现在终于可以正常运行Go语言生成wasm程序了。因此以后可以使用Go语言来开发Web应用了。

// 省略系统生成的Web Service声明代码,采用默认的

有关 Go 1.11 中变更的更多详细信息,请参阅发行说明 >>>

public class Service1 : System.Web.Services.WebService

来自:开源中国,WASM Hackers公众号

{

接下来,Go语言带给开发者们的惊喜会越来越多,不知您是否对这么语言感兴趣呢?下面推荐我们CSDN学院上的Go语言视频教程:

        //省略系统生成的Web Service声明代码,采用默认的

1.go语言实战—详细的golang教程

[WebMethod]

2.Go语言-基础篇

        public Class1 GetClass1 ( int p_TimeSpan )

3.Go语言-进阶篇

        {

            System.Threading.Thread.Sleep( p_TimeSpan ); // 线程停止一段执行,假设一段处理的时间

            Class1 r = new Class1();

            r.Name = "Async Call";

            r.ID = p_TimeSpan;

            return r;

     }

}

 

 

客户端调用代码,设计一个Windows Form窗体来测试,放入3个按钮控件(分别代表3种异步调用方法),一个进度条控件(表示调用Web Service后,客户端继续进行某些操作)。先把3种方法介绍一下:

1.       利用Backgroundworker对象,所在命名空间System.ComponentModel。MSDN原文解释:BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

2.       利用wsdl.exe生成Web Service的客户端代理类,调用其中WebMethod的Async方法。

3.       利用wsdl.exe生成Web Service的客户端代理类,分别调用其中WebMethod的Begin与End方法。

本文由澳门威尼斯人平台发布于操作系统,转载请注明出处:NET应用程序中异步调用Web Service的几种方法

关键词: