基于Web service开发的校直机软件在MES系统上的应用实例

2022-01-20 01:39胡选仲周庆辉庄树明
工程与试验 2021年4期
关键词:命令提示符管理器调用

胡选仲,张 鹏,周庆辉,庄树明

(中机试验装备股份有限公司,吉林 长春 130103)

1 引 言

目前,校直机的校直数据是通过校直软件生成文件,存储到本地设备上,供给MES厂商调用。随着网络科技的进步,现有MES厂商需要把校直机的数据通过MES传输方式进行上传。针对这个问题,结合现在市场的需求和网络通信潮流,实现了校直机软件以调用Web service传输的方式进行MES传输校直数据[1,2]。

2 调用Web Service的方式

2.1 直接调用

如果已知web service的路径,则可以直接添加服务引用-高级-添加web引用,直接输入webservice URL。这个调用比较常见,也非常简单,即有完整的webservice文件目录如图1所示。

图1 添加服务

也可在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url:public new string Url {set; get; }。

2.2 根据wsdl生成webservice的.cs文件及生成dll调用

有时没有这么多文件,如果只有wsdl文件,可以由别人提供或者根据webservice下面地址获取:http://localhost:8888/WS.asmx?wsdl

Visual Studio 2017->Visual Studio Tools->VS2017 开发人员命令提示符,如图2所示。

图2 打开VS2017开发人员命令提示符

在命令行输入:wsdl E:WS.wsdl/out:WS.cs

E:WS.wsdl是wsdl文件存储路径,也可以是http://localhost:8888/WS.asmx?wsdl。如果不报错,看Program FilesMicrosoft Visual Studio 12.0WS.cs已经自动生成的.cs文件、结构体等都很方便,然后命令行执行csc /t:library WS.cs,在同样的路径下,生成了WS.dll文件,把文件拷贝出去放到项目文件夹下,C# winform程序也可以添加引用。生成的文件默认路径如图3所示。

图3 生成的文件默认路径

默认生成的SOAP版本为1.1,可以通过G:Program FilesMicrosoft Visual Studio 12.0>wsdl E:e.wsdl /protocol:SOAP12 /out:e.cs来指定成为1.2版本。

2.3 动态调用

在C#程序中,如果要调用WebService,通常采用“添加Web引用”的形式来实现。但是,如果此WebService的URL是在C#程序运行过程中才能获得,则必须用动态调用这个WebService了。以下是使用的例子:

object[] argsweb = new object[1];

argsweb.SetValue("cyy_JSWEB", 0);

DataTable dtweb=WebServiceHelper.InvokeWebService("http://192.168.0.11/DBMS_CYY/DBMS_WebService.asmx", "GetUserTreeListData", argsweb) as DataTable;

这种方式有点麻烦,意味着在每次使用前,需要把想要调用的函数参数组织成一个新的object[]才行,并且在每次调用InvokeWebService前都必须在内存中创建新的动态程序集,这导致效率较低。因此,此种方法没有直接用“实例名.方法名(参数列表)”的方法来得便捷。可以将其放到一个叫WebServiceHelper.cs的类里面。

///WebService动态调用

public static object CAllWebService(object[] webobject, string add, string WebNom, string WebMeansName)

{

string @webnom =

"ServiceBase.WebService.DynamicWebLoad";

if ((WebNom ==null) || (WebNom ==""))

{

WebNom=

WebServiceHelper.GetMyWebName(add);

}

//////使用(WSDL) 语言来获取服务的描述

WebClient describe==new WebClient();

Stream SDescribe=describe.OpenRead(add + "?WSDL");

ServiceDescription SDDescribe=

ServiceDescription.Read(SDescribe);

ServiceDescriptionImporter SDDIescribe=new ServiceDescriptionImporter();

SDDIescribe.AddServiceDescription(SDDescribe, "", "");

CodeNamespace CNDescribe = new CodeNamespace(@webnom);

//////生成客户端中代理类的代码

CodeCompileUnit CCUDescribe=new

CodeCompileUnit();

CCUDescribe.Namespaces.Add(CNDescribe);

SDDIescribe.Import(CNDescribe, CCUDescribe);

CSharpCodeProvider CCPDescribe=new

CSharpCodeProvider();

ICodeCompiler webicodecompiler = CCPDescribe.CreateCompiler();

//////设定编译器中的参数的属性

CompilerParameters CPDescribe = new

CompilerParameters();

CPDescribe.GenerateInMemory = true;

CPDescribe.GenerateExecutable = false;

//添加所需要调用的DLL文件

CPDescribe.ReferencedAssemblies.Add("System.Data.dll");

CPDescribe.ReferencedAssemblies.Add("System.dll");

CPDescribe.ReferencedAssemblies.Add("System.Web.Services.dll");

CPDescribe.ReferencedAssemblies.Add("System.XML.dll");

CompilerResults CRDescribe = webicodecompiler.CompileAssemblyFromDom(CPDescribe, CCUDescribe);

if (CRDescribe.Errors.HasErrors == true)

{

System.Text.StringBuilder SBDescribe = new

StringBuilder();

foreach (CompilerError ce in CRDescribe.Errors)

{

SBDescribe.Append(ce.ToString());

SBDescribe.Append(System.Environment.NewLine);

}

throw new Exception(SBDescribe.ToString());

}

//////生成代理实例和调用方法

System.Reflection.Assembly SRADescribe = CRDescribe.CompiledAssembly;

Type TDescribe = SRADescribe.GetType(@webnom + "." + WebNom, true, true);

object OBJDescribe = Activator.CreateInstance(TDescribe);

System.Reflection.MethodInfo SRMDescribe = TDescribe.GetMethod(WebMeansName);

return SRMDescribe.Invoke(OBJDescribe, webobject);

}

private static string GetMyWebName(string add)

{

string[] webstring = add.Split('/');

string[] webretstring = webstring[webstring.Length - 1].Split('.');

return webretstring[0];

}

2.4 本文选择的调用方式

结合现在网络通信潮流,再通过上面介绍的几种方法,不难看出,直接调用方法简单,容易操作。所以校直软件选择直接调用Web service传输的方式进行设备的MES数据传输。

3 Web service服务器部署

(1)勾选Internet信息服务下所有节点。通过本机打开和关闭Windows功能里面选中Internet信息服务下面的所有文件,然后确定。

(2)Internet信息服务(IIS)管理器中添加网站。在计算机管理里面找到Internet信息服务(IIS)管理器,添加上网站,名字、路径、IP和端口号根据设备需要设置。

(3)IIS注册。以管理员身份运行VS2017开发人员命令提示符,输入aspnet_regiis -i。

(4)更改WebApp .Net Framework版本为V4.0。在计算机管理里面找到Internet信息服务(IIS)管理器的应用程序池,更改WebApp .Net Framework 版本为V4.0。

(5)Web服务器发布。Web服务器项目右键选择“发布”,目标位置与IIS添加网站物理一致,点击“发布”,如图4所示。

图4 发布界面

(6)Web客户端引用。在项目中选择“添加服务引用”,输入地址,点击“转到”,可在下方查看服务可调用函数,点击“确定”即可,界面如图5所示。

图5 添加服务引用界面

(7)引用示例

ServiceReference.WebService1SoapClient client = new ServiceReference.WebService1SoapClient("WebService1Soap");

client.Open();

string ss = client.HelloWorld();

client.Close()

4 API函数的介绍与应用

4.1 函数介绍

DevData_Invoke_InputAsync(MainWindowPlugin.ServiceReference.WsWebHeader WsWebHeader, string ICode, string Paras)是由Web服务提供的向服务端发送传输数据的函数。

4.2 函数应用

通过本机的服务管理器,检查已经部署的“WebApp”服务是否存在,如果存在,才可以调用DevData_Invoke_InputAsync(MainWindowPlugin.ServiceReference.WsWebHeader WsWebHeader, string ICode, string Paras)函数向服务器端发送数据。

5 Web传输在校直软件的实现

5.1 Web传输的流程

在自动校直测控系统中,通道判断是否需要传输校直数据,进行数据传输,流程图如图6所示。

图6 传输数据流程图

5.2 Web传输的关键代码

///

/// 检查WebApp服务状态

///

///

public void StartWebServer(string serviceName)

{

var WebManager = new

Microsoft.Web.Administration.ServerManager();

var startSite = WebManager.Sites[serviceName];

if(startSite == null)

{

GlobalUIMessageBox.Show(LNG._("未找到Web服务,请重新部署"));

return;

}

}

//MES---->Web服务器发送校直数据

List MESInfos = new List();

var mesinfo = new MESInfo();

mesinfo.barcode = GlobalParametersManager.GetParameterText(LNG._("备用1"));

mesinfo.devcode = "A0036JZ01";

mesinfo.createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

var beforebend = result.Bend.Split(',');

var afterbend = result.AfterBend.Split(',');

for (int i = 0; i < beforebend.Length; i++)

{

if (i == 0)

{

mesinfo.leftjerkvalue1 = beforebend[i];

mesinfo.leftjerkvalue2 = afterbend[i];

}

else if (i = 1)

{

mesinfo.rightjerkvalue1 = beforebend [i];

mesinfo.rightjerkvalue2 = afterbend[i];

}

else

break;

}

MESInfos.Add(mesinfo);

string MesJson =

JsonConvert.SerializeObject(MESInfos);

ServiceReference.WS_InterfaceSoapClient client =

new ServiceReference.WS_InterfaceSoapClient();

ServiceReference.WsWebHeader WsWebHeader

new ServiceReference.WsWebHeader();

WsWebHeader.UserName = "MES_DEV_QKJZ";

client.DevData_Invoke_InputAsync(WsWebHeader, "MES_DEV_QKJZ", MesJson);

LoggingHelper.Message("传输Mes数据");

6 直接调用Web service传输注意事项

(1)Web服务器发布注意事项。“发布”的目标位置需与IIS添加网站物理一致。

(2)Web客户端引用注意事项。必须在类中app.config下的system.serviceModel节点内容粘贴至Exe所在项目中的App.config中configuration下,否则编译不通过。

(3)Web传输的关键代码注意事项。为了防止调用发送数据的时候报错,在打开软件初始化的时候,需要检测一下Web服务是否存在。

7 结束语

本文实现了通过直接调用Web service的传输方式进行Mes通信传输校直数据,此方法增加了校直机的Mes通信方式,从而提高校直机的市场竞争力。通过目前现场的使用情况,证明该方法可以广泛地应用在校直机产品上。

猜你喜欢
命令提示符管理器调用
一条命令恢复Windows开机F8功能
应急状态启动磁盘管理器
核电项目物项调用管理的应用研究
Windows文件缓冲处理技术概述
LabWindows/CVI下基于ActiveX技术的Excel调用
让命令提示符窗口与Windows更融洽
基于系统调用的恶意软件检测技术研究
高集成度2.5A备份电源管理器简化锂离子电池备份系统
Windows命令模式另类用法
利用RFC技术实现SAP系统接口通信