Посмотрите на следующий код:
var binding = new WSHttpBinding( { MessageEncoding: "Mtom" , SecurityMode:"TransportWithMessageCredential" }) , proxy = new Proxy(binding) proxy.ClientCredentials.Username.Username = "yaron"; proxy.ClientCredentials.Username.Password = "1234"; proxy.send(message, function(response) { console.log(response) });
Вы видите что-нибудь … особенное? Ну, c # уже имеет ключевое слово «var» начиная с версии 3.0, так что, может быть, это какой-то диалект ac # -ish? Или, может быть, это CTP для javascript в качестве языка CLR? Или что-то связанное с
лазурным sdk для node.js ?
Не за что. Это фрагмент из
wcf.js — чистого javascript-модуля node.js, который обеспечивает совместную работу wcf и node.js!
Поскольку узел занимает центральное место в современной веб-разработке, многие разработчики создают приложения для узлов, которые должны использовать нисходящие wcf-сервисы. Теперь, если эти сервисы используют
веб-API WCF, веб-API
ASP.NET очень просто. Также легко, если вы можете добавить базовую http-привязку к сервису Wcf, и немного больше работы, если вы планируете использовать
маршрутизатор wcf, чтобы сделать протокол моста.
Wcf.js — это библиотека, цель которой — предоставить опыт разработки на чистом javascript для таких сценариев.
Обратите внимание, что создание новых сервисов на базе node.js на основе ws- * не является целью этого проекта. Оставляя в стороне все религиозные войны, Soap — это не «путь узлов», поэтому вам следует придерживаться Rest, где вы получите хорошую поддержку языков (json) и встроенные библиотеки.
«Здравствуйте, Wcf … from node»
Вы ближе, чем вы думаете, чтобы использовать свой первый Wcf-сервис node.js:
1. Создайте новый веб-сайт wcf в VS и назовите его «Wcf2Node». Если вы используете .Net 4, то BasicHttpBinding используется по умолчанию, в противном случае в файле web.config замените WsHttp на BasicHttp. Не нужно развертывать, просто запустите службу в VS, используя F5.
2. Создайте в любом месте папку на стороне узла и в командной строке введите его корень и выполните:
$> npm install wcf.js
3. В этой же папке создайте test.js:
var BasicHttpBinding = require('wcf.js').BasicHttpBinding , Proxy = require('wcf.js').Proxy , binding = new BasicHttpBinding() , proxy = new Proxy(binding, " http://localhost:12/Wcf2Node/Service.svc") , message = '<Envelope xmlns=' + '"http://schemas.xmlsoap.org/soap/envelope/">' + '<Header />' + '<Body>' + '<GetData xmlns="http://tempuri.org/">' + '<value>123</value>' + '</GetData>' + '</Body>' + '</Envelope>' proxy.send(message, "http://tempuri.org/IService/GetData", function(response, ctx) { console.log(response) });
4. В test.js измените порт 12 (не спрашивайте …) на порт, на котором работает ваша служба.
5. Теперь мы можем выполнить узел:
$> node test.js
6. Теперь вы должны увидеть выходное мыло на консоли.
Конечно, этот образец не очень интересен, и вам лучше отправить сырое мыло, используя
запрос . Давайте посмотрим что-нибудь более интересное. Если ваша служба использует токен ssl + username (транспорт с учетными данными сообщения), конфигурация может выглядеть следующим образом:
<wsHttpBinding> <binding name="NewBinding0"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding>
Следующие модификации предыдущего примера позволят использовать его из узла:
... binding = new WSHttpBinding( { SecurityMode: "TransportWithMessageCredential" , MessageClientCredentialType: "UserName" }) ... proxy.ClientCredentials.Username.Username = "yaron"; proxy.ClientCredentials.Username.Password = "1234"; proxy.send(...)
А вот и проволочное мыло:
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <Header> <o:Security> <u:Timestamp> <u:Created>2012-02-26T11:03:40Z</u:Created> <u:Expires>2012-02-26T11:08:40Z</u:Expires> </u:Timestamp> <o:UsernameToken> <o:Username>yaron</o:Username> <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</o:Password> </o:UsernameToken> </o:Security> </Header> <Body> <EchoString xmlns="http://tempuri.org/"> <s>123</s> </EchoString> </Body>
Если вы используете Mtom, посмотрите этот код:
(форматирование здесь немного утомительно из-за моего макета блога — в github он выглядит намного лучше
!)
var CustomBinding = require('wcf.js').CustomBinding , MtomMessageEncodingBindingElement = require('wcf.js').MtomMessageEncodingBindingElement , HttpTransportBindingElement = require('wcf.js').HttpTransportBindingElement , Proxy = require('wcf.js').Proxy , fs = require('fs') , binding = new CustomBinding( [ new MtomMessageEncodingBindingElement({MessageVersion: "Soap12WSAddressing10"}), , new HttpTransportBindingElement() ]) , proxy = new Proxy(binding, "http://localhost:7171/Service/mtom") , message = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">' + '<s:Header />' + '<s:Body>' + '<EchoFiles xmlns="http://tempuri.org/">' + '<value xmlns:a="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' + '<a:File1 />' + '</value>' + '</EchoFiles>' + '</s:Body>' + '</s:Envelope>' proxy.addAttachment("//*[local-name(.)='File1']", "me.jpg"); proxy.send(message, "http://tempuri.org/IService/EchoFiles", function(response, ctx) { var file = proxy.getAttachment("//*[local-name(.)='File1']") fs.writeFileSync("result.jpg", file) });
Mtom немного сложнее, так как wcf.js должен знать, какие узлы являются двоичными. Использование простого xpath может помочь вам достичь этого.
Очищение
рук с помощью Soap
Wcf.js использует мыло в необработанном формате. Генерация кода прокси не очень хорошо сочетается с динамическим языком, таким как javascript. Я также предполагаю, что вы используете существующую службу, в которой уже есть работающие клиенты, поэтому вы сможете получить образец рабочего мыла. И если вы , как некоторый уровень абстракции между вами и вашим мылом я рекомендую
узел-мыло , хотя он по- прежнему не обеспечивает интеграцию с
wcf.js .
Если вы будете использовать необработанные запросы и ответы мыла, вам понадобится хорошая библиотека xml. И хотя узел имеет множество библиотек dom / xpath, они не подходят для Windows. Мой следующий пост будет о хорошем совпадении здесь.
Поддерживаемые стандарты
Wcf реализует многие стандарты ws- * и даже больше через собственные расширения. Первая версия wcf.js поддерживает следующее:
Поддерживаемая привязка:
Что вы хотите увидеть дальше? Дайте мне знать .
Получить код
Wcf.js размещается в GitHub, и каждый может внести свой вклад в исправления и исправления, если это необходимо.
Wcf.js работает на ws.js , фактической реализации стандартов, о которой я расскажу в следующем посте.