2013-04-17 4 views
1

Я пытаюсь создать веб-службу, где параметры, выбранные с веб-страницы, отправляются в файл standalone.exe, написанный на C#, который управляет пакетом САПР, установленным на сервере. Затем пакет САПР генерирует изображение, основанное на выбранных параметрах, выбранных пользователем на интерфейсной веб-странице. В скорлупе ореха мне нужно:Подключение PEAR SOAP с WSDL к C# standalone .exe

  1. Пользователь выбирает две части
  2. Отдельные детали посланные C# .exe
  3. C# работает пакет CAD соединяет детали, возвращает изображение двух частей
  4. Пользователь видит image

Из чего я понимаю, мне нужна реализация SOAP с видимым WSDL. У меня не было проблем с запуском учебных пособий и создания собственных SOAP и WSDL и общения на локальных и удаленных серверах между моими собственными функциями PHP.

Теперь я пытаюсь получить написанный PHP SOAP, который будет использоваться автономным C#, и именно там я теряюсь. Я относительно новичок в SOAP и WSDL, но я понимаю основы и функции каждого. Кроме того, я начал использовать NUSOAP для моего поколения wsdl.

Есть ли подобный пакет кода, который позволяет создавать WSDL-файлы из методов C#, которые позволяют использовать SOAP-соединение?

Кроме того, мой клиент и веб-страница всегда будут знать WSDL и необходимые параметры для отправки. По сути, это всего лишь шлюз между веб-сайтом и пакетом САПР.

Вот 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, а не любой пользовательский ввод)

Итак, теперь я застреваю - моя голова все перепутана с WhizCheese Dulls и SOAP и XML. Я смущен тем, куда идти отсюда. Я занимаюсь разработкой веб-сайтов с передней и задней частью, но все еще мокрым за ушами, когда дело доходит до платформы .NET.

По существу, мне хотелось бы, чтобы кто-то указал мне в правильном направлении, чтобы, наконец, выполнить мою первую заявленную цель в этом проекте. Возможно ли это так, как я делаю? Возможно, SOAP - это не правильный путь? Я также запутался в том, как отправить параметры в автономный C# .exe и использовать его (например, гамбургер ... ммммммм).

Вот мое мыло инстанциацию в 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']); 

Если вам нужно что-нибудь еще, больной с удовольствием доля. Спасибо, что нашли время, чтобы прочитать это и за любую помощь, которую вы можете предложить! Я очень ценю это.

UPDATE:

Из того, что я читал, может быть, я бы включить метаданные пока я понятия не имею, где это можно сделать?

UPDATE:

Я использую NuSOAP для создания моих WSDL-файлы из методов PHP и подключения их к Visual Studio 2010 C# и они работают. Я теперь застрял в обратном процессе. Мне нужно, чтобы php отправлял параметры методу C# и возвращал что .exe.

ответ

0

Я пошел с программой на C#, которая соединяется с MySQL и периодически проверяет наличие новых записей в таблице.

0

Поскольку кажется, что вы пытаетесь сгенерировать прокси - вам нужно включить обнаружение метаданных, поэтому клиентская программа знает, как структурировать вызов (параметры, методы, возвращаемое значение). Вы используете Apache, IIS или что-то еще?

What is Metadata ExchangeExposing Metadata via IISExposing Metadata via Apache

Я обновил ссылки, позволяющие метаданные как Apache и IIS - может быть лучше инструкции там - я только пробовал себя в Apache.

Существует не что-то «неправильное» с SOAP, это просто xml по протоколу http, это может быть первый контракт (думаю, IDL для Интернета), определяющий функции/сервисы, которые считают IDL для Интернета. По-видимому, в php имеется множество инструментов для облегчения этого. NuSoap - одна из таких библиотек, которую легче справиться - и Scot Nichol углубляется в настройку. NuSoapIntro Также образец кода, смоделированный после этого. Простой пример PHP CodeProject Технически, если у вас есть правильный формат ввода xml для метода - вы можете просто HTTP POST получить ожидаемый ввод (как определено WSDL), и он «просто работает». Я нашел SOAPUI как незаменимый инструмент для тестирования (во всяком случае, я не являюсь аффилированным лицом).

Если SOAP слишком силен, вы можете подумать о подходе RESTful REST Frameworks Php Он будет использовать больше сигнатуры метода на основе URL для вашего внешнего интерфейса и может быть проще реализовать вашу цель.

(Ah - WAMP над лампой)

+0

это Debian Apache на удаленном общем сервере – Dan

+0

Так просто быть понятным - PHP (frontend), Apache (Hosted), C# exe (примерно DAL backend)? Я предполагаю, что вы используете Mono для C# и что он установлен на общем сервере. –

+0

Я все еще пытаюсь запустить его локально на своем ПК с Windows перед тем, как перейти на сервер. WAMP, с C# через visual studio 2010 – Dan

0

Это не совсем ясно, что ваш вопрос, но это звучит, как вы пытаетесь получить C# приложение, чтобы обеспечить WSDL. Затем php может использовать открытый контракт.

Эта библиотека поддерживает библиотеку .NET Framework. В частности, класс 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() 

Надеюсь, что поможет вам начать работу.

0

Я работаю над аналогичной проблемой. Я прошел через всевозможные перестановки и пришел к выводу, что WDSL/XML не являются лучшим решением.

Вот что я придумал: AJAX. Нажмите запрос веб-страницы на автономный код C#. Затем он выталкивает требуемую графику (предпочтительно в PNG или JPEG). Это, в свою очередь, попадает в HTML-элемент для отображения.

+0

Как вы нажимали AJAX на код C#, использовали ли вы сервер IIS - im в некотором смысле, поскольку код веб-сайта размещен в общей серверной среде (fatcow), в то время как локальное оборудование для запуска САПР находится на сайте. – Dan

+0

Извините, просто увидел ваш комментарий. Java (очевидно) работает на каком-то клиенте. Сервер ловит запрос так же, как и любой другой, и выводит mime: <какой бы формат изображения> не выводил. – Shlomi

Смежные вопросы