Использование веб-службы с использованием POST вместо обычного маршрута WSDL - PullRequest
6 голосов
/ 01 апреля 2012

Вот так мне удалось использовать конкретный веб-сервис Microsoft. Обратите внимание, что он расположен на HTTPS-сервере и требует установки имени пользователя, пароля и файла .cer в «корневых центрах сертификации» операционной системы.

WSHttpBinding binding = new WSHttpBinding();

binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Message.NegotiateServiceCredential = true;
binding.Security.Message.AlgorithmSuite
  = System.ServiceModel.Security.SecurityAlgorithmSuite.Default;
binding.Security.Message.EstablishSecurityContext = true;

EndpointAddress endpoint = new EndpointAddress("https://address.of.service");

//"GreatClient" was created for me automatically by running
//"svcutil.exe https://address.of.service?wsdl"
GreatClient client = new GreatClient(binding, endpoint);

//Username and password for the authentication. Notice that I have also installed
//the required .cer certificate into the system's "root certificate authorities".
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

//Now I can start using the client as I wish.

Мой вопрос такой: Как я могу получить всю необходимую информацию, чтобы я мог использовать веб-сервис с прямым POST до https://address.of.service, и как я на самом деле выполняю POST с C #? Я только хочу использовать POST, где я могу предоставить необработанные данные XML, используя POST, непосредственно в https://address.of.service и получить результат в виде необработанных данных XML. Вопрос в том, что это за необработанные данные XML и как именно мне следует отправлять их с помощью POST?

( Цель этого вопроса: Причина, по которой я спрашиваю, заключается в том, что я хочу использовать этот сервис, используя что-то отличное от C # и .NET (например, Ruby или Cocoa в Mac OS X). I Я не знаю, как это сделать, потому что у меня нет простого в использовании «svcutil.exe» на других платформах для генерации необходимого мне кода. Вот почему я решил, что просто могу использование службы с использованием обычного POST позволило бы мне проще использовать службу на других платформах.)

Ответы [ 5 ]

1 голос
/ 10 апреля 2012

Я не программист .NET, но мне пришлось взаимодействовать с несколькими сервисами .NET и иметь большой опыт работы с SOAP / WSDL. Похоже, вы захватили XML для своего сервиса. Другая проблема, с которой вы столкнетесь, это аутентификация. OOTB, веб-сервисы .NET используют NTLM для аутентификации. Поддержка языка с открытым исходным кодом для NTLMv2 может быть безуспешной (хотя быстрый поиск в Google нашел несколько возможностей для ruby), и использование NTLM-аутентификации через HTTP может быть чем-то, что вам нужно соединить вместе. Чтобы ответить на вопрос выше: где авторские кредиты? Если служба использует NTLM по сети, аутентификация происходит на каком-то уровне ниже HTTP. Если служба использует NTLM для аутентификации HTTP, ваши кредиты NTLM находятся в заголовке HTTP Authorization. Вы должны быть в состоянии сказать с Wireshark, где они находятся. Вам также, вероятно, понадобится заголовок SOAPAction; это может также быть понюхано с wireshark. Я уверен, что для клиента C # есть документы, объясняющие, как добавить заголовки в ваш запрос.

1 голос
/ 10 апреля 2012

Что я сделаю:

1 - Создайте небольшое приложение на c #, которое может публиковать сообщения на этом веб-сервисе (используя svcutil). И измените его, чтобы показать отправленный / полученный XML. Для просмотра XML существует несколько способов: ведение журнала, wireshark и т. Д. Чтобы добавить его непосредственно в небольшое приложение, есть еще один вопрос здесь , который дает хороший ответ.

2- Как только вы знаете, что вам нужно отправить, вы можете сделать это в c # следующим образом:

// implement GetXmlString() to return the XML to post
string xml = GetXmlString();


// create the url
string url = new UriBuilder("http","address.of.service",80).ToString();     


// create a client object
using(System.Net.WebClient client = new System.Net.WebClient()) {
    // performs an HTTP POST
    client.UploadString(url, xml);  

}
1 голос
/ 05 апреля 2012

То, что вы пытаетесь сделать, звучит больно сейчас и больно продолжать двигаться вперед, если на сервере что-то изменится.Это действительно заново изобретает колесо.

Если вы еще не рассмотрели его, я бы:

(a) Изучите, можете ли вы использовать имеющиеся у вас метаданные для службы и использоватьпрокси-генератор родной для вашей целевой платформы.Не так много платформ, на которых нет хотя бы некоторого инструментария, который мог бы помочь вам частично, если не полностью.Возможно, перепечатайте вопрос, направленный на людей Ruby, спрашивающих, какие платформы существуют для использования службы HTTPS, учитывая, что это WSDL?

(b) Если это не удастся, если ваш сценарий позволит это, я рассмотрю использование прокси, написанного на C #, который действует какфасад для службы, который переводит его в нечто более простое в использовании (например, вы можете использовать что-то вроде ASP.NET MVC WebAPI, которое является гибким и может легко обслуживать ответы, соответствующие стандартам, над которыми вы можете сохранять полный контроль).

Я подозреваю, что один из них может оказаться проще и ценнее, чем дорога, по которой вы сейчас находитесь.

1 голос
/ 09 апреля 2012

Я думаю, когда вы говорите, что сервис должен использоваться другими платформами, у которых нет логики генерации прокси-классов, вы можете использовать сервисы REST. Это позволит вам создавать входные данные в виде простой конкатенации строк вместо сложного XML. Хотя его применимость зависит от ситуации.

Проверьте это обсуждение: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6907d765-7d4c-48e8-9e29-3ac5b4b9c405/

Что касается сертификата, см. http://msdn.microsoft.com/en-us/library/ms733791.aspx о том, как его настроить.

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

1 голос
/ 01 апреля 2012

Мне пришлось пройти через нечто подобное при переносе кода .NET WCF на другие платформы. Самый простой подход, который я нашел, состоял в том, чтобы включить ведение журнала сообщений на клиенте WCF . Это можно настроить для сохранения как конверта, так и тела, и как только все будет работать на стороне .NET, вы можете использовать журнал сообщений, чтобы получить «заведомо исправный» запрос / ответ XML для порта на другие платформы.

Я нашел этот подход более элегантным, поскольку мне не нужно было добавлять дополнительное поведение для регистрации сообщений, и его можно легко включить / отключить / настроить в конфигурации. Service Trace Viewer , поставляемый с Visual Studio, также удобен для просмотра файлов журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...