zoukankan      html  css  js  c++  java
  • 如何在Windows Server 2008中使用Web网站或WebService连接SAP系统

          连接SAP系统,并获取相关数据使用WinForm很容易就成功了,但是相同的代码移植到WEB中,却总是无法正常连接,时不时的就会有错误出现。解决这个问题花了比较长的时间,所以想在这里与大家分享一下我这菜鸟的经验,有什么不足希望各位大侠批评指正,谢谢。现在开始进入正题  

    1 环境说明

           详见表1-1所示。

    1-1 环境说明

    开发环境

    开发工具

    1. 操作系统:Windows Server 2008R2 64bit;

    2. Framework: dot net Framework 3.5;

    3. 3rd DLL(NCO3.0) SAP DLL是32bit的,而不是64bit。

    Visual Studio 2010 旗舰版 64bit

           关于环境需要说明的一点是SAP DLL为什么使用32bit?

           利用Visual Studio的开发连接SAP系统的项目,需要使用第三方动态链接库(dll),我们在Windows Server 2008 64bit的操作系统中,很自然的会想到应该使用64bit的SAP DLL,如果只是获取SAP数据,然后更新到我们现有的系统中,可以使用客户端程序或者WinForm程序,这个是没有任何问题的。

           但是同样的代码,当我们使用WEB进行发布调试的时候,就会有问题,对应的页面会冒红,说无法加载sapnco.dll文件。后来经过资料查询以及实验,我们得出一个结论就是:

    使用WEB连接SAP系统时,我们应该使用32位的SAP DLL作为第三方引用,所以可以在开发环境中添加一个32bit的SAP DLL文件。

    2 成功部署网站连接SAP系统

           本节将通过问题解决的方式来讲解我们应该如何成功部署一个网站来,连接到SAP系统,并成功获取到SAP系统中的数据,供我们使用。

    2.1  未能加载程序集”sapnco”

          当我们建立好一个WEB工程,编写好了连接SAP系统的代码后我们会很自然的去调试,看看我们写的是否正确。假设代码写的非常好且没有错误,经过调试发现我们想要的结果都能够成功的在页面中显示出来,很自然的我们会认为原来这东西如此简单,我们就搞定它了。可是奇怪的事情是,当我们发布部署这个工程后,发现无论如何网页都会冒红,出现图4-1所示的错误。

      2-1 未能加载程序集sapnco

          怎么办? 一般情况下,在64bit的开发环境中开发项目,编译项目对应的目标平台都会是Any CPU,而我们这个项目中引用的SAP DLL,它是32bit的,所以我们必须将目标平台改为x86。

    2.2    未能加载文件“我们的项目名”

    经过上面的修改后,我们经过编译部署,刷新后,在此打开网页的时候,依然会报错误,这个错误和上述错误差不多,只是未能加载文件后面的内容有所改变,详见图4-2所示。

     

    2-2 未能加载文件“LgortWebApplication

          比较图2-1和图2-2的错误,从表面现象来看问题的性质是一样的,从而会误导我们觉得该目标平台是没有用的,很有可能会同一个方向去搜寻答案的,从而会做无用功。我们仔细看看图2-2所示的异常信息说明(也可以参考图2-3的内容)。

     

    图2-3 异常信息说明

           关于这个异常信息,微软的官方解释如下:

          (1) 如果您的应用程序使用了 32 位组件,请确保该应用程序始终采用 32 位应用程序的运行方式。

          如果应用程序项目的“平台目标”属性设置为 AnyCPU,则编译后的应用程序在 64 位或 32 位模式中均可运行。 如果采用 64 位应用程序运行方式,则实时 (JIT) 编译器便会生成 64 位本机代码。 如果应用程序依赖于某个 32 位托管组件或非托管组件,则在 64 位模式中无法加载该组件。 若要纠正此问题,请将项目的“平台目标”属性设置为 x86,然后重新编译。

          (2) 确保未使用利用其他 .NET Framework 版本创建的组件。

           如果使用 .NET Framework 1.0 或 .NET Framework 1.1 开发的应用程序或组件尝试加载使用 .NET Framework 2.0 SP1 或更高版本开发的程序集,或者使用 .NET Framework 2.0 SP1 或 .NET Framework 3.5 开发的应用程序尝试加载使用 .NET Framework 4 开发的程序集,便会引发此异常。 BadImageFormatException 异常可能会报告作为编译时错误,或在运行时可能会引发该异常。 有关示例,请参见 BadImageFormatException 类。

           (3) 确保文件映像是有效的托管程序集或模块。

           当非托管动态链接库或可执行文件传递给 Load 方法进行加载时会引发此异常。

           根据调试能够成功,而编译发布却失败以及这些解释可以推测一下这个原因很有可能是因为项目发布之后并不是32位的运行环境,于是根据此异常找到的解决方案是:

    In IIS 7.5, in the Advanced Settings for the Application Pool associated with the Web Site hosting my Remote Object, I have simply changed the Enable 32-bits Application setting to true and the problem was gone.

    这句话的含义是让我们进入IIS管理器找到项目对应的IIS 应用池,然后将启用32位应用程序改为true。具体操作是右击对应的IIS应用池 -> 高级设置,修改为true。

    如图4-4所示。

     

    2-4 启用32位应用程序修改为true

    2.3    依然有错?

          经过上述修改后,重启应用池和网站,具体需不需要重启,进行操作的人可以自己尝试一下,但是在写这篇文档的时候,是经过重启操作的。这个时候发现网站可以正常打开的,还以为问题解决了呢,但是点击按钮或者其他事件的时候,如果是调用了SAP方法,程序依然会报出错误,而不能正常显示我们需要的数据。

          如果是WEB Service,当调用相关方法的时候,出现的错误是:SAP.Middleware.Connector.RfcSessionManager”的类型初始值设定项引发异常。

    如果是WEB项目程序,出现的错误如图4-5所示。

     

    2-5 初始化参数异常

            解决这两个错误的方法是进入项目的应用程序池修改托管管道模式参数的值,将Integrated修改为Classic即可,详见图4-6所示。

     

    2-6 托管管道模式修改为Classic

    2.4    结束语

            经过上述的操作,解决了遇到的问题后,WEB或者WEB Service就能够成功的连接到SAP系统,并从中获取到我们需要的数据了,以上是我的一点经验总结,OVER。

  • 相关阅读:
    部署iis服务器与c#程序遇到的问题小结
    Installing node-oracledb on Microsoft Windows
    Navicat:cant create OCI environment.
    socket.io 中文手册 socket.io 中文文档
    现有的情绪
    Express 4.x Node.js的Web框架
    结构与类的对象在引用上的不同之处
    Android时间戳转换为标准Datetime(yyyy-MM-dd hh:mm:ss)格式
    ASP.NET MVC4中调用WEB API的四个方法
    安恒DASCTF 四月战 WP
  • 原文地址:https://www.cnblogs.com/towerking/p/2584039.html
Copyright © 2011-2022 走看看