JDEdwards XMLInterop - PullRequest
       25

JDEdwards XMLInterop

2 голосов
/ 17 сентября 2008

Интересно, есть ли у кого-нибудь успехи в использовании функции JDEdwards XMLInterop. Я использовал его некоторое время (с простым PInvoke, опубликую код позже). Я смотрю, есть ли лучший и / или более надежный способ.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 30 сентября 2008

Как и было обещано, вот код для интеграции с JDEdewards с использованием XML. Это веб-сервис, но его можно использовать по своему усмотрению.

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>
1 голос
/ 25 октября 2013

Любой, кто пытается это сделать, имеет некоторые зависимости от xmlinterop.dll.

вы найдете эти файлы на толстом клиенте здесь -> c: \ E910 \ system \ bin32

это создаст «тонкий клиент»

PSThread.dll
icudt32.dll
icui18n.dll
icuuc.dll
jdel.dll
jdeunicode.dll
libeay32.dll
msvcp71.dll
ssleay32.dll
ustdio.dll
xmlinterop.dll
0 голосов
/ 05 августа 2009

После просмотра этого кода я изменил наш веб-сервис JDE на использование XML Interop, и с тех пор у нас не было проблем со стабильностью. Ранее мы использовали COM-коннектор, в котором регулярно возникали сбои связи (возможно, проблема с пулом соединений?), И было сложно установить и настроить его правильно.

У нас были проблемы, когда мы пытались использовать транзакции, но если вы выполняете простые вызовы одной бизнес-функции, это не должно быть проблемой.

Обновление: Чтобы уточнить проблемы транзакции - если вы пытаетесь сохранить транзакцию активной для нескольких вызовов, а сервер приложений JDE обрабатывает небольшое количество одновременных вызовов, начинаются вызовы xmlinterop возвращая сообщение «Ошибка ответа XML», и транзакция БД остается открытой без возможности фиксации или отката. Возможно, для этого потребуется изменить число ядер, но лично я всегда буду пытаться завершить транзакцию одним вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...