使用App Inventor与WCF服务通信

App Inventor是一个用于开发Android应用的快速应用开发(RAD)工具,它提供了许多有用的功能,但在与Web服务通信方面支持有限。使用App Inventor开发的Android应用只能通过TinyWebDb接口与Web服务通信。TinyWebDb是一个简单的基于Web的键值数据库接口,它只有两个方法:StoreValue和GetValue。本文将介绍如何使用WCF服务实现TinyWebDb接口,从而实现Android应用与.Net代码之间的通信。

WCF(Windows Communication Foundation)是微软在.NET框架中创建的一项技术,用于构建连接的、面向服务的应用程序。要了解如何使用WCF创建Web服务,请参考以下文章:

App Inventor是一个非常简单的基于Web的Android视觉编程工具,不需要任何Java技能或Android应用程序生命周期知识。要了解App Inventor,请参考以下文章:

TinyWebDb API是一个RESTful接口,意味着它使用基本的HTTP请求,如GET或POST(与更复杂的协议如SOAP或CORBA相比,后者使用特定协议的请求格式)。TinyWebDb接口有两个方法:StoreValue和GetValue。

TinyWebDb接口实现

StoreValue方法通过HTTP POST请求调用,带有两个文本参数“tag”和“value”。URL格式为:{ServiceURL}/storeavalue。请求格式为XML,内容类型为“application/x-www-form-urlencoded”。这是WCF服务的默认值,因此在方法定义中不需要特别说明。响应格式为JSON:["STORED", "{tag}", {value}],例如:["STORED", "testValue", "\"Hello World!\""]。

GetValue方法通过HTTP POST请求调用,带有一个文本参数“tag”。URL格式为:{ServiceURL}/getvalue。与StoreValue一样,请求格式为XML,默认内容类型。响应格式为JSON:["VALUE","{tag}", {value}],例如:["VALUE", "testValue", "\"Hello World!\""]。

在WCF服务中实现TinyWebDb API

打开VS 2010,选择新建项目,然后选择WCF ->WCF服务应用程序。右键单击项目,选择“添加”->“新建项”->“WCF服务”。将添加两个文件:接口(以I开头,以.cs结尾,例如IMyService.cs)和服务(以.svc结尾,例如MyService.svc)。

打开接口文件。在这里,需要为StoreValue和GetValue方法定义操作合同。以下代码可以实现这一点:

[ServiceContract] public interface IMyService { [OperationContract(Name = "getvalue")] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "getvalue")] string[] getvalue(Stream data); [OperationContract(Name = "storeavalue")] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "storeavalue")] string[] storeavalue(Stream data); }

在这里,明确指定了HTTP请求类型(两种情况都是POST),响应格式(JSON)和返回类型(字符串数组,它将自动转换为JSON格式[“string1”,“string2”,…])。

打开服务文件,并实现上述接口。为了简单起见,硬编码了返回值。在现实生活中,必须在这两个过程中实现一些有意义的业务逻辑:

public class MyService : IMyService { public string[] getvalue(Stream data) { StreamReader sr = new StreamReader(data); string stringData = sr.ReadToEnd(); string tag = stringData.Substring(4); string[] resultStringArray = new string[3]; resultStringArray[0] = "VALUE"; resultStringArray[1] = "testValue"; resultStringArray[2] = "Hello World!"; return resultStringArray; } public string[] storeavalue(Stream data) { StreamReader sr = new StreamReader(data); string stringData = sr.ReadToEnd(); string tag = stringData.Substring(4, stringData.IndexOf("&value=") - 4); string value = stringData.Substring(stringData.IndexOf("&value=") + 7); string[] resultStringArray = new string[3]; resultStringArray[0] = "STORED"; resultStringArray[1] = "testValue"; resultStringArray[2] = "Hello World!"; return resultStringArray; } }

打开Web.config文件,并进行一些必要的更改,以便RESTful JSON工作。这意味着需要定义webHttpBinding和mexHttpBinding,并定义服务的httpGetEnabled="true"和端点的webHttp:

<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="myServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="webHttp"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <services> <service name="WcfRestBased.MyService" behaviorConfiguration="myServiceBehavior"> <endpoint name="webHttpBinding" address="" binding="webHttpBinding" contract="WcfRestBased.IMyService" behaviorConfiguration="webHttp"> </endpoint> <endpoint name="mexHttpBinding" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>

为了指定正确的服务名称,右键单击服务并选择“查看标记”选项。现在构建项目并部署到主机。如果打算使用本地Wi-Fi访问Web服务器,可以使用localhost IIS托管,如这里所述:

App Inventor应用程序访问WCF服务

访问,点击“创建”以创建新项目。如果是第一次访问App Inventor,系统会提示注册。将看到一个空项目,如下所示:

将2个标签和2个按钮拖到屏幕上。打开“存储”类别,在调色板中拖动“TinyWebDb”组件到屏幕上。它将被添加到“非可见组件”列表中。

在TinyWebDb组件的属性中,将ServiceURL更改为新创建的服务的地址,例如:http://192.168.1.38/MyService.svc。如果不知道计算机的IP地址,点击“开始”,在搜索框中输入“cmd”,然后输入“ipconfig”。

点击App Inventor编辑器右上角的“块”按钮。这将打开项目代码。从“块”类别中拖动代码组件,直到应用程序看起来像这样:

现在需要在真实的Android设备上测试应用程序。首先,从Google Play商店安装应用程序“MIT AI2 Companion”到Android设备。接下来,在App Inventor的项目页面上,点击“连接”->“AI伴侣”。使用屏幕上显示的QR码或文本代码将Android设备连接到项目。

当新创建的应用程序在Android设备上打开时,点击“存储值”和“获取值”按钮。应该看到应用程序从Web服务器收到响应。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485