Посмотрите на следующий код:
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 , фактической реализации стандартов, о которой я расскажу в следующем посте.
