Как перенаправить веб-службу REST с помощью C # (WCF)?

#c# #wcf #web-services

#c# #wcf #веб-службы

Вопрос:

Существует веб-служба, которая может использоваться только через http, и клиент, который может использовать только веб-службы https. Поэтому мне нужен какой-то посредник, который пересылает запросы, полученные по протоколу https, и возвращает ответы по протоколу http.

Предположим, что посредник полностью тупой, за исключением того факта, что он знает, где находится конечная точка веб-службы (т. Е. Он не знает, какова сигнатура службы, он просто знает, что он может взаимодействовать с ним через веб-запрос http, и он прослушивает некоторый uri https, перенаправляя на что угодноон получает), каков самый простой способ добиться этого?

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

Комментарии:

1. Вы уверены в ограничении HTTP / HTTPS? HTTPS по-прежнему является HTTP, только по защищенному соединению. Возможно, вы сможете решить свою проблему, просто используя перенаправление портов с 443 на 80 (при условии, что клиент принимает простые HTTP-ответы)

2. Мне сказали, что перенаправление портов не является вариантом. Не уверен, почему это так, но это часть спецификации; может быть, потому, что клиент находится за пределами интрасети компании, поэтому не может вернуться по http.

3. Что вы пробовали до сих пор? Разве это не просто выполнение HTTP POST с исходной полезной нагрузкой SOAP от клиента (возможно, после удаления учетных данных клиента) на конечную конечную точку и возврат ответа обратно?

4. @muratgu: Проблема, вероятно, в том, что конечная точка WCF уже получила полезную нагрузку от клиента, преобразовав ее в какой-то объект. WCF, вероятно, будет бороться с вами в подобном случае.

5. @mellamokb: Да, это моя проблема. Как вернуть «полезную нагрузку» в чистом виде.

Ответ №1:

Тупой посредник — это, по сути, прокси. Ваш лучший выбор может быть просто использовать стандартный asp.net страницы (вместо того, чтобы подключаться к сервисным функциям, таким как ASMX или WCF, которые просто будут бороться с вами), чтобы вы могли получить запрос точно как есть и обработать его простым способом, используя стандартный запрос / ответ. Вы можете использовать HttpWebRequest class для пересылки запроса на другую конечную точку.

  1. Клиентские запросы https://myserver.com/forwarder.aspx?forwardUrl=http://3rdparty.com/api/login
  2. myserver.com (ваш прокси-сервер) считывает строку forwardUrl запроса и любой включенный запрос POST или GET.
  3. myserver.com просьбы к http://3rdparty.com/api/login и передает данные GET или POST, отправленные от клиента.
  4. myserver.com принимает ответ и отправляет обратно в качестве ответа на другую конечную точку (по сути, просто Response.Write содержимое в ответ)

Вам нужно будет написать forwarder.aspx для обработки запросов. Код для forwarder.aspx будет примерно таким (непроверенный):

 protected void Page_Load(object sender, EventArgs e)
{
    var forwardUrl = Request.QueryString["forwardUrl"];
    var post = new StreamReader(Request.InputStream).ReadToEnd();
    var req = (HttpWebRequest) HttpWebRequest.Create(forwardUrl);
    new StreamWriter(req.GetRequestStream()).Write(post);
    var resp = (HttpWebResponse)req.GetResponse();
    var result = new StreamReader(resp.GetResponseStream).ReadToEnd();
    Response.Write(result);  // send result back to caller
}
  

Комментарии:

1. Это было направление, в котором я двигался. Спасибо за это, я попробую это сейчас и отчитаюсь.

2. Возможно, вы захотите узнать, как использовать Fiddler, чтобы помочь отслеживать трафик и диагностировать проблемы, если что-то не работает: fiddler2.com/fiddler2 . Кроме того, я не подумал о том, что если API использует файлы cookie для отслеживания сеанса, это также необходимо будет обработать.

3. Приветствия, это сделало работу. Выполнение этого через прокси-сайт — определенно правильный подход! Мне также удалось расширить код, чтобы он также обрабатывал SOAP. Надеюсь, мне не нужно будет настраивать файлы cookie, но я узнаю об этом в понедельник, когда кто-нибудь действительно даст мне спецификацию. И во время моих путешествий я обнаружил это membrane-soa.org/soap-router.htm Который я надеюсь продать ИТ-специалистам вместо моего варианта с домашним сайтом, который, я просто знаю, закончится плачевно, и я получу по шее.

4. Просто хотел еще раз сказать спасибо за это. После развертывания оказалось, что это был запрос SOAP, а не REST ( очевидно , мне просто дали URL-адрес и сказали, чтобы он работал). Однако этот подход работает для обоих, и возможность доступа к нему в режиме RESTful была очень удобна с точки зрения отладки.