将PEAR SOAP与WSDL连接到c#独立的.exe
本文关键字:独立 exe 连接 PEAR SOAP WSDL | 更新日期: 2023-09-27 18:09:36
我正在尝试创建一个Web服务,其中从网页中选择的参数被发送到用c#编写的standalone.exe,该文件控制安装在服务器上的CAD包。然后CAD包根据用户在前端网页上选择的参数生成图像。总之,我需要:
- 用户选择两个部件
- 被选中的部件被发送到c# .exe
- c#运行CAD包,连接零件,返回两个零件的图像
- 用户看到图像
据我所知,我需要带有可见WSDL的SOAP实现。我没有遇到任何问题,通过教程,创建自己的SOAP和WSDL,以及在本地和远程服务器上在自己的PHP函数之间进行通信。
现在我正试图得到一个PHP编写的SOAP由c#独立消费,这就是我迷路的地方。我对SOAP和WSDL比较陌生,但我了解它们的基础和功能。此外,我开始使用NUSOAP生成wsdl。
是否有类似的代码包允许从允许SOAP连接的c#方法创建WSDL文件?
而且,我的客户端和web页面将始终知道WSDL和需要发送的参数。从本质上讲,这只是web和CAD包之间的一个网关。
这是Wheezly McDizzle
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns:typens="urn:getBlockedIP"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
name="getBlockedIP"
targetNamespace="urn:getBlockedIP">
<types></types>
<message name="getBlockedIP">
<part name="idNumber" type="xsd:string"/>
</message>
<message name="getBlockedIPResponse">
<part name="ipAddress" type="xsd:string"/>
</message>
<portType name="blockedIPPort">
<operation name="getBlockedIP">
<input message="typens:getBlockedIP" />
<output message="typens:getBlockedIPResponse"/>
</operation>
</portType>
<binding name="blockedIPBinding" type="typens:blockedIPPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name = "getBlockedIP" >
<soap:operation soapAction = "urn:blockedIPAction" />
<input>
<soap:body namespace="urn:getBlockedIP" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body namespace="urn:getBlockedIP" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="getBlockedIPService">
<port name="blockedIPPort" binding="blockedIPBinding">
<soap:address location="http://mysite.com/xdata/blockedip_api.php"/>
</port>
</service>
</definitions>
这个测试的方法是一个带有单个参数的简单数组获取。它只是一个包含25个元素的数组,其中包含被阻塞的IP,用户在1-25之间选择一个数字,该方法将吐出与数组中该位置相关的IP。
我模仿了c#中的方法,用Console.WriteLine
和Console.ReadLine()
作为命令提示程序。(这显然是不正确的,因为c#程序必须从XML文件中获取参数,而不是任何用户输入)
所以现在我被困住了——我的脑子里全是whiizcheese Dulls、SOAP和XML。我不知道该往哪里走。我是前端和后端Web开发的专家,但是当涉及到。net框架时,我仍然是新手。
本质上,我想要的是有人指出我在正确的方向,最终完成我在这个项目中的第一个既定目标。我做事的方式有可能吗?也许SOAP不是正确的路径?我也很困惑如何将参数发送到独立的c# .exe并让它消耗它(像汉堡包…mmmmmmm)。
下面是我在远程服务器上用PHP编写的soap实例:
客户:// WSDL location to be used with a WSDL instantiation of SOAP
$namespace = 'http://mysite.com/xdata/blockedip.wsdl';
// Parameters are easier sent as an array with associative keys
$params = array('arrayNum' => $number);
// include soap client (php.ini include_path set to installed PEAR location)
require_once 'SOAP/Client.php';
// create SOAP Client with an exposed WSDL location
$wsdl = new SOAP_WSDL($namespace);
//communicate with server, WSDL
$SoapClient = $wsdl->getProxy();
//call method with parameters
$ip = $SoapClient->call("getBlockedIP", $params);
服务器:
// include soap server and create server object
require_once 'SOAP/Server.php';
$soapServer = new SOAP_Server();
$server->_auto_translation = true;
// create class with desired method
$blockedip = new SoapTestClass();
// add class and namespace schema
$soapServer->addObjectMap($blockedip, 'http://schemas.xmlsoap.org/soap/envelope/');
// respond with raw post
$soapServer->service($GLOBALS['HTTP_RAW_POST_DATA']);
如果你还需要什么,我很乐意分享。感谢您花时间阅读这篇文章以及您可以提供的任何帮助!我非常感激。
:
从我一直在阅读也许我必须打开元数据,但我不知道在哪里可以做到这一点?
:
我一直在使用NUSOAP从php方法生成我的WSDL文件,并将它们连接到VISUAL STUDIO 2010 c#,它们一直在工作。我现在正致力于逆转这一过程。我需要php发送参数到一个c#方法,并有。exe返回的东西。
由于您似乎正在尝试生成代理-您需要启用元数据发现,因此客户端程序知道如何构建调用(参数,方法,返回值)。您使用的是Apache、IIS还是其他工具?
什么是元数据交换通过IIS公开元数据通过Apache公开元数据
我更新了链接以启用Apache和IIS的元数据-可能会有更好的说明-我只涉足Apache。
SOAP没有任何"错误",它只是基于http协议的xml,它可以是一个契约优先(想想Web的IDL)方法来定义功能/服务,想想Web的IDL。php中似乎有很多工具可以实现这一点。nussoap就是这样一个更容易管理的库,scott Nichol深入介绍了如何设置它。从技术上讲,如果您有该方法的正确xml输入格式,您只需HTTP POST预期的输入(由WSDL定义),它就"正常工作"了。我发现SOAPUI是一个不可缺少的测试工具(无论如何我都没有参与)。
如果SOAP太令人心痛,你可以考虑采用RESTful方法REST框架Php它将使用更多的基于url的方法签名为您的外部接口,可能更容易实现您的目标。
您的问题并不完全清楚,但听起来您正在尝试让c#应用程序提供wsdl。php就可以使用暴露的合约了。
. net库的WCF(窗口通信框架)部分支持这一点。特别是SessionHost类将提供一个服务器,它可以承载SOAP服务并公开WSDL。
首先你需要在c#中定义你的契约。可以通过创建带有DataContract属性的接口来实现。
定义契约的接口示例。
[ServiceContract]
public interface MyContract
{
[OperationContract]
void MyOperation(string param1, int param2);
[OperationContract]
void MyOtherOperation(int param1, out int outputParam);
}
然后,您可以创建一个服务主机,它将创建一个SOAP服务器,并将传入的请求绑定到实现您的接口的类。它还将为您公开WSDL文件。
设置主机。
// create service host
// Note: ServiceHandler is a class you make that implements your service contract interfaces
ServiceHost host = host = new ServiceHost(typeof(ServiceHandler), new URI("127.0.0.1");
// enable metadata exchange (creates wsdl URL)
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
// start the host listening
host.Open()
希望这能帮助你开始。
我正在研究一个类似的问题。我研究了所有的排列方式,得出的结论是WDSL/XML不是最好的解决方案。
这是我想到的:AJAX。将网页请求推送到独立的c#代码。然后它会输出必要的图形(最好是PNG或JPEG格式)。然后将其放入HTML元素中进行显示。
我使用了一个连接到MySQL的c#程序,并让它定期检查表中的新条目