Вызов веб-службы Restful с параметром HttpRequestMessage? - PullRequest
1 голос
/ 07 января 2020

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

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

  1. Платформа вызовов клиентов.
  2. Платформа вызывает веб-сервис.
  3. Веб-сервис отвечает платформе.
  4. Платформа отвечает клиенту.

Достаточно просто, но изменения платформы уже внесены для развертывания сразу после переключения, и разработчик не будет в доме для миграции. Таким образом, они переключат коммутатор и оставят меня в надежде, что миграция работает.

У меня есть простой план отката, при котором от разработчика платформы не потребуется откат. Я просто добавляю посредника в цепочку выше, которая действует как канал к веб-сервису для платформы:

  1. Клиент звонит платформе.
  2. Платформа звонит сервису проводов.
  3. Служба Conduit вызывает веб-службу.
  4. Веб-служба отвечает на канал.
  5. Проводник отвечает на платформу.
  6. Платформа отвечает клиенту.

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


Теперь, когда у вас есть понимание проблемы, у меня есть простая проблема с записью канала в базовый веб-сервис. Я столкнулся с методом в веб-сервисе, который возвращает HttpResponseMessage и ожидает HttpRequestMessage в качестве запроса. Это довольно запутанно, поскольку платформа вызывает этот метод через следующий URI:

test.domain.com: порт / api / route / methodname

У меня нет доступа к коду под этим назначением URI (который находится в коде RPG), поэтому я понятия не имею, как они передают данные. В настоящее время мой код прост:

[Route("MethodName")]
[HttpPost]
public HttpResponseMessage MethodName(HttpRequestMessage request) {
    try {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create($"{ServiceRoute}/api/route/methodname");
        request.Method = "GET";
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        return response; // There is a type mismatch, I know.
    } catch (Exception e) {
        // Log exception.
        return null;
    }
}

Как я могу позвонить в спокойный веб-сервис и передать сообщение запроса в службу?

NOTE : Я понимаю, предоставленный фрагмент кода не будет работать и содержит ошибку. Я НЕ ожидаю, что кто-то просто раздаст код. Ссылки и объяснения относительно того, что нужно сделать и почему я ищу.

1 Ответ

1 голос
/ 07 января 2020

Я не уверен, что полностью понимаю вопрос, поэтому извиняюсь, если это бесполезно, но если ваш канал действительно просто перенаправляет каждый запрос как есть, вы сможете повторно использовать входящий HttpRequestMessage, изменив свойство RequestUri в URI веб-службы и переадресацию его в веб-службу с экземпляром HttpClient. Как то так:

[Route("MethodName")]
[HttpPost]
public async HttpResponseMessage MethodName(HttpRequestMessage request) {
        request.RequestUri = $"{ServiceRoute}/api/route/methodname";
        request.Method = HttpMethod.Get;
        request.Headers.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
        //add any additional headers, etc...
    try 
    {
        //best practice is to reuse the same HttpClient instance instead of reinstantiating per request, but this will do for an example
        var httpClient = new HttpClient();
        var response = await httpClient.SendAsync(request);
        //perform any validation or modification of the response here, or fall back to the old web service on a failure
        return response;
    } 
    catch (Exception e) 
    {
        // Log exception.
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...