Использование веб-службы или ссылки на веб-службу - PullRequest
2 голосов
/ 29 июля 2009

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

Итак, вот проблема для меня. Позвольте мне сначала объяснить, откуда я. В одном из прошлых проектов я уже говорил с парой API, создавая ручные классы, такие как, например, GetPicturesRequest.cs и GetPicturesResponse.cs, которые будут содержать состояние для меня. Я бы имел базовый класс с именем Request.cs, который выполнял фактическую отправку вызова API:

Stream requestStream;
Stream responseStream;
XmlDocument doc = new XmlDocument();
doc = CreateRequestXML();

// Determins if API call needs to use a session based URI
string requestURI = UseAuthURI == true ? _requestURIAuthBased + JSessionID : _requestURI;

byte[] data = XmlUtil.DocumentToBytes(doc);

// Create the atual Request instance
HttpWebRequest request = CreateWebRequest(requestURI, data.Length);
request.ContentLength = data.Length;
request.KeepAlive = false;
request.Timeout = 30000;

// Send the Request
requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();

Теперь я хочу использовать ссылку на веб-сервис. Поэтому я указал и создал новую ссылку на https://www.sandbox.paypal.com/wsdl/PayPalSvc.wsdl в VS 2008. Теперь у меня есть веб-ссылка.

Теперь у меня есть эти вопросы, когда я впервые пользуюсь веб-службами, а не вручную, как при использовании стороннего API:

1) Как указать параметры заголовка? Например, некоторые API требуют, чтобы вы отправляли хэш (подпись), sessionID, имя пользователя, пароль, вы называете его вместе с запросом вызова метода API. Как указать это с помощью прокси-класса веб-службы?

2) Как обрабатываются объекты запроса / ответа или мне не нужно беспокоиться об этом сейчас, когда я использую веб-сервис / ссылку? Я имею в виду, нужно ли мне еще создавать объект запроса и как я получу ответ?

3) Когда я получаю ответ, содержит ли прокси-класс свое состояние или мне все еще нужно создать класс для хранения состояния возвращаемых данных из ответа на вызов метода API при использовании веб-интерфейса услуги / ссылки?

4) Когда бы я захотел вместо этого просто создать собственный код, как я делал раньше, и не использовать опцию веб-сервисов / ссылок с WSDL? ... по сути, создавая собственные прокси-классы, объекты запросов объекты ответа, все? Вместо того, чтобы VS выкладывал веб-ссылку на основе WSDL? Это потому, что если это не сторонний API на основе SOAP? Это потому, что сторонний API не предоставляет WSDL, тогда вы вынуждены сами кодировать обертки?

Ответы [ 3 ]

9 голосов
/ 29 июля 2009

Здесь серьезная путаница. Все, пожалуйста, прекратите!

WSE устарел. Не используйте его.

«Веб-ссылки» относятся к старой технологии веб-сервиса ASMX. Microsoft теперь считает его «устаревшим» кодом и прекратила исправлять ошибки. Не используйте его, если вам не нужно.

ОП должен использовать «Добавить справочник услуг». Я только что попробовал, и это сработало.


Теперь на ваши вопросы:

  1. Как указать параметры заголовка?

    Поскольку эта служба использует заголовки, прокси-классы были сгенерированы как Контракты сообщений, которые могут иметь части заголовка и части тела. Например, класс RefundTransactionRequest имеет свойство RequesterCredentials, которое имеет тип CustomSecurityHeaderType. Вы просто устанавливаете это перед отправкой запроса. Фактически, он сгенерировал конструктор для RefundTransactionRequest, который принимает в качестве параметров заголовок и тело, так что это просто.

  2. Как обрабатываются объекты запроса / ответа?

    Вам не нужно ничего делать, кроме как создавать экземпляры классов и вызывать методы. Вся сериализация сделана для вас. Все создание класса сделано для вас.

  3. Когда я получаю ответ, содержит ли класс Proxy свое состояние?

    Да. Прокси-класс будет содержать все заголовок сообщения и части тела. Конечно, часть заголовка будет только в том случае, если был заголовок вывода.

  4. Когда бы я хотел вместо этого просто создать собственный код, как я делал раньше, и не использовать опцию веб-сервисов / ссылок с WSDL?

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


* * Пример 1 042:
using (var svc = new PayPalAPIAAInterfaceClient())
{
    var paypal = (PayPalAPIInterface) svc;
    var credentials = new CustomSecurityHeaderType
                          {
                              Credentials =
                                  new UserIdPasswordType
                                      {
                                          AppId = "",
                                          Username = "John",
                                          Password = "John"
                                      }
                          };
    var request = new RefundTransactionRequestType
                      {
                          Amount =
                              new BasicAmountType
                                  {
                                      currencyID = CurrencyCodeType.USD,
                                      Value = "100.00"
                                  },
                          Memo = "I want my money back",
                          RefundType = RefundType.Full,
                          RefundTypeSpecified = true
                      };
    var refundRequest = new RefundTransactionReq
                            {RefundTransactionRequest = request};
    var result =
        paypal.RefundTransaction(
            new RefundTransactionRequest(credentials, refundRequest));
    var response = result.RefundTransactionResponse1;
    var returnedCredentials = result.RequesterCredentials;
}
2 голосов
/ 29 июля 2009

Я предполагаю, что вы используете веб-ссылку для этого. В большинстве случаев использование веб-службы должно быть таким же простым, как и использование локального объекта. .NET обрабатывает всю сантехнику под крышками. Иногда это работает очень хорошо - иногда не так много.

Когда вы добавляете веб-ссылку в веб-службу PayPal, Visual Studio создаст файл в подпапке «Веб-ссылки» с именем reference.cs, который является прокси-классом (по умолчанию VS 2008 скрывает его - вы должны » показать все файлы "чтобы увидеть это).

В вашем конкретном случае похоже, что PayPal использует пользовательские заголовки SOAP для передачи всей информации о контексте безопасности. Посмотрите на типы CustomSecurityHeaderType и UserIdPasswordType для получения более подробной информации. Также может помочь некоторая документация от PayPal. :)

Чтобы воспользоваться услугой, вам нужно будет сделать что-то вроде этого:

    PayPalAPISoapBinding payPal = new PayPalAPISoapBinding();

    CustomSecurityHeaderType customSecurity = new CustomSecurityHeaderType();
    customSecurity.eBayAuthToken = "The Auth Token";

    UserIdPasswordType userId = new UserIdPasswordType();
    userId.Password = "PWD";
    userId.Username = "JIMMY";

    customSecurity.Credentials = userId;

    payPal.RequesterCredentials = customSecurity;

    RefundTransactionReq request = new RefundTransactionReq();

    RefundTransactionResponseType response = payPal.RefundTransaction(request); 

Я не знаком со службой PayPal, но думаю, что именно так она и должна работать.

0 голосов
/ 29 июля 2009

1) В вашем случае подпись, имя пользователя и пароль передаются в мыльном заголовке. Вам нужно будет установить WSE 3.0 , активировать его в своем проекте VS и еще раз сгенерировать прокси.

2) Создание запросов и анализ ответов выполняются внутренними компонентами WSE. Просто создайте прокси, установите заголовок и вызовите метод на прокси.

3) Должна быть очень веская причина для создания собственной реализации прокси. WSE охватывает сценарии SOAP и часть спецификаций WS- *. WCF охватывает TCP, Pipes и MSMQ, а также SOAP. Даже если служба не предоставляет WSDL, вы все равно можете сами указать договор и позволить инфраструктуре выполнять транспортную работу.

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