调用将 HttpRequestMessage 作为参数的 Restful Web 服务?



我正在将我公司的一个 Web 服务迁移到新服务器,不幸的是,以前的开发人员让我们无法在迁移生产版本之前测试此服务的迁移。这使我们处于一个严峻的境地,我必须制定备份计划,以防我们在迁移到新服务器时出现问题。

要了解我的计划,您必须首先了解此 Web 服务的执行流程当前为:

  1. 客户呼叫平台。
  2. 平台调用 Web 服务。
  3. Web 服务响应平台。
  4. 平台响应客户。

很简单,但平台的更改已经到位,只需翻转开关即可部署,开发人员不会在内部进行迁移。因此,他们会拨动开关,让我希望迁移有效。

我有一个简单的回滚计划,其中不需要平台的开发人员进行回滚。我只是在上面的链上注入一个中间人,作为平台 Web 服务的管道:

  1. 客户呼叫平台。
  2. 平台调用管道服务。
  3. 管道服务调用 Web 服务。
  4. Web 服务响应管道。
  5. 管道响应平台。
  6. 平台响应客户。

这样,如果由于某种原因,Web 服务的迁移版本失败,我可以回退到旧服务器上托管的原始版本,直到我们可以调查缺少的内容以及为什么会出错(目前我们没有办法做到这一点(。


现在您已经了解了这个问题,我在将管道写入基础 Web 服务时遇到了一个简单的问题。我在 Web 服务中遇到了一个返回HttpResponseMessage并期望HttpRequestMessage作为请求的方法。这相当令人困惑,因为平台通过以下 URI 调用此方法:

test.domain.com:port/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;
}
}

如何调用 restful Web 服务并将请求消息传递给该服务?

注意:我知道,我提供的代码段将无法正常工作并且有错误。我不希望任何人只是分发代码。关于需要做什么以及为什么是我正在寻找的参考和解释。

我不确定我是否完全理解这个问题,所以如果这没有帮助,请道歉,但是如果您的管道真的只是按原样转发每个请求,您应该能够通过将 RequestUri 属性更改为 Web 服务 URI 并将其转发到 Web 服务(使用 HttpClient 实例(来重用传入的 HttpRequestMessage。像这样:

[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;
}
}

相关内容

  • 没有找到相关文章

最新更新