JDEdwards XMLInterop
时间:2020-03-05 18:59:16 来源:igfitidea点击:
想知道是否有人可以成功使用JDEdwards XMLInterop功能。我已经使用了一段时间(通过一个简单的PInvoke,将在以后发布代码)。我正在寻找是否有更好和/或者更健壮的方法。
谢谢。
解决方案
回答
如所承诺的,这是使用XML与JDEdewards集成的代码。这是一个网络服务,但可以根据需要使用。
namespace YourNameSpace
{
/// <summary> /// This webservice allows you to submit JDE XML CallObject requests via a c# webservice /// </summary> [WebService(Namespace = "http://WebSite.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class JdeBFService : System.Web.Services.WebService { private string _strServerName; private UInt16 _intServerPort; private Int16 _intServerTimeout; public JdeBFService() { // Load JDE ServerName, Port, & Connection Timeout from the Web.config file. _strServerName = ConfigurationManager.AppSettings["JdeServerName"]; _intServerPort = Convert.ToUInt16(ConfigurationManager.AppSettings["JdePort"], CultureInfo.InvariantCulture); _intServerTimeout = Convert.ToInt16(ConfigurationManager.AppSettings["JdeTimeout"], CultureInfo.InvariantCulture); } /// <summary> /// This webmethod allows you to submit an XML formatted jdeRequest document /// that will call any Master Business Function referenced in the XML document /// and return a response. /// </summary> /// <param name="Xml"> The jdeRequest XML document </param> [WebMethod] public XmlDocument JdeXmlRequest(XmlDocument xmlInput) { try { string outputXml = string.Empty; outputXml = NativeMethods.JdeXmlRequest(xmlInput, _strServerName, _intServerPort, _intServerTimeout); XmlDocument outputXmlDoc = new XmlDocument(); outputXmlDoc.LoadXml(outputXml); return outputXmlDoc; } catch (Exception ex) { ErrorReporting.SendEmail(ex); throw; } } } /// <summary> /// This interop class uses pinvoke to call the JDE C++ dll. It only has one static function. /// </summary> /// <remarks> /// This class calls the xmlinterop.dll which can be found in the B9/system/bin32 directory. /// Copy the dll to the webservice project's /bin directory before running the project. /// </remarks> internal static class NativeMethods { [DllImport("xmlinterop.dll", EntryPoint = "_jdeXMLRequest@20", CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall, SetLastError = true)] private static extern IntPtr jdeXMLRequest([MarshalAs(UnmanagedType.LPWStr)] StringBuilder server, UInt16 port, Int32 timeout, [MarshalAs(UnmanagedType.LPStr)] StringBuilder buf, Int32 length); public static string JdeXmlRequest(XmlDocument xmlInput, string strServerName, UInt16 intPort, Int32 intTimeout) { StringBuilder sbServerName = new StringBuilder(strServerName); StringBuilder sbXML = new StringBuilder(); XmlWriter xWriter = XmlWriter.Create(sbXML); xmlInput.WriteTo(xWriter); xWriter.Close(); string result = Marshal.PtrToStringAnsi(jdeXMLRequest(sbServerName, intPort, intTimeout, sbXML, sbXML.Length)); return result; } }
}
我们必须向其发送如下消息:
<jdeRequest type='callmethod' user='USER' pwd='PWD' environment='ENV'> <callMethod name='GetEffectiveAddress' app='JdeWebRequest' runOnError='no'> <params> <param name='mnAddressNumber'>10000</param> </params> </callMethod> </jdeRequest>
回答
看到此代码后,我将JDE Web服务更改为使用XML Interop,此后就没有任何稳定性问题。以前,我们使用的是COM连接器,该连接器经常出现通信故障(可能是连接池问题?),并且很难正确安装和配置。
我们在尝试使用事务时确实遇到了问题,但是如果我们正在执行简单的单个业务功能调用,那么这应该不是问题。
更新:要详细说明事务问题,如果我们试图通过多个调用使事务保持活动状态,并且JDE应用程序服务器正在处理少量的并发调用,则xmlinterop调用会开始返回" XML响应失败"消息,并且数据库事务处于打开状态,无法提交或者回滚。可以通过调整内核数量来解决此问题,但就我个人而言,我总是尝试在单个调用中完成事务。