1

我正在尝试创建一个 Web 服务,其中从网页中选择的参数被发送到一个用 C# 编写的standalone.exe,它控制安装在服务器上的 CAD 包。CAD 软件包然后根据用户在前端网页上选择的参数生成图像。简而言之,我需要:

  1. 用户选择两个部分
  2. 选定的部分被发送到 C# .exe
  3. C# 运行 CAD 包,连接零件,返回两个零件的图像
  4. 用户看到图像

据我了解,我需要带有可见 WSDL 的 SOAP 实现。我通过教程运行并创建自己的 SOAP 和 WSDL 以及在我自己的 PHP 函数之间的本地和远程服务器上进行通信都没有问题。

现在我试图让一个 PHP 编写的 SOAP 被 C# 独立使用,这就是我迷路的地方。我对 SOAP 和 WSDL 比较陌生,但我了解它们的基础知识和功能。此外,我开始将 NUSOAP 用于我的 wsdl 生成。

是否有类似的代码包允许从允许 SOAP 连接的 c# 方法创建 WSDL 文件?

此外,我的客户端和网页将始终知道要发送的 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.WriteLineConsole.ReadLine(). (这显然是不正确的,因为 C# 程序必须从 XML 文件中获取参数,而不是任何用户输入)

所以现在我被困住了——我的脑子里全是 WhizCheese Dulls 和 SOAP 和 XML。我对从这里去哪里感到困惑。我是前端和后端 Web 开发的专家,但在谈到 .NET 框架时仍然耳聋。

从本质上讲,我希望有人为我指明正确的方向,最终实现我在这个项目中的第一个既定目标。我做事的方式甚至可能吗?也许 SOAP 不是正确的路径?我也很困惑如何将参数发送到独立的 c# .exe 并让它使用它(如汉堡包...mmmmmmm)。

这是我在远程服务器上用 PHP 进行的肥皂实例化:

客户:

// 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 返回一些东西。

4

4 回答 4

0

由于您似乎正在尝试生成代理 - 您需要启用元数据发现,因此客户端程序知道如何构造调用(参数、方法、返回值)。您使用的是 Apache、IIS 还是其他?

什么是元数据交换 通过 IIS 公开元数据 通过 Apache 公开元数据

我更新了链接以启用 Apache 和 IIS 的元数据——那里可能有更好的说明——我只涉足 Apache。

SOAP 没有任何“错误”,它只是基于 http 协议的 xml,它可以是一种合同优先的(想想 Web 的 IDL)方法,定义功能/服务的 IDL 是 Web 的。php 中似乎有很多可用的工具来促进这一点。NuSoap 就是这样一个更易于管理的库——Scot Nichol 深入研究了它的设置。NuSoapIntro也是一个以此为模型的代码示例——简单的 PHP 示例CodeProject从技术上讲,如果你有正确的方法的 xml 输入格式——你可以只是 HTTP POST 预期的输入(由 WSDL 定义)并且它“正常工作”。我发现 SOAPUI 是一个不可或缺的测试工具(无论如何我都没有加入)。

如果 SOAP 太让人心痛,您可以考虑采用 RESTful 方法REST Frameworks Php它将更多地为您的外部接口使用基于 URL 的方法签名,并且可能更容易实现您的目标。

(啊 - WAMP over LAMP)

于 2013-04-19T20:02:54.300 回答
0

尚不完全清楚您的问题是什么,但听起来您正试图让您的 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()

希望这有助于您入门。

于 2013-04-25T22:56:51.183 回答
0

我正在研究一个类似的问题。我经历了各种排列,得出的结论是 WDSL/XML 不是最好的解决方案。

这是我想出的:AJAX。将网页请求推送到独立的 C# 代码。然后它会推出必要的图形(最好是 PNG 或 JPEG 格式)。反过来,它会被放入一个 HTML 元素中进行显示。

于 2013-04-26T02:57:47.453 回答
0

我使用了一个连接到 MySQL 的 C# 程序,并让它定期检查表中的新条目。

于 2013-05-03T23:59:44.777 回答