基于Web service开发的校直机软件在MES系统上的应用实例
2022-01-20胡选仲周庆辉庄树明
胡选仲,张 鹏,周庆辉,庄树明
(中机试验装备股份有限公司,吉林 长春 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
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通信方式,从而提高校直机的市场竞争力。通过目前现场的使用情况,证明该方法可以广泛地应用在校直机产品上。