【问题标题】:How to forward a REST web service using C# (WCF)?如何使用 C# (WCF) 转发 REST Web 服务?
【发布时间】:2023-03-17 09:44:02
【问题描述】:

有一个只能通过 http 消费的 web 服务和一个只能消费 https web 服务的客户端。因此,我需要一些中介来转发在 https 中收到的请求并在 http 中返回响应。

假设中介完全愚蠢,除了它知道 Web 服务端点在哪里(即它不知道服务的签名是什么,它只知道它可以通过 http 与它通信web 请求,它监听一些 https uri,转发它收到的任何东西),实现这一点的最简单方法是什么?

我整天都在玩这个,不知道如何实现“愚蠢”位,即不知道传递回逐字响应的签名。

【问题讨论】:

  • 您确定 HTTP/HTTPS 限制吗? HTTPS 仍然是 HTTP,只是通过安全连接。您也许可以通过使用从 443 到 80 的端口转发来解决您的问题(假设客户端接受纯 HTTP 响应)
  • 有人告诉我,端口转发不是一种选择。不知道为什么会这样,但它是规范的一部分;可能是因为客户端不在公司内网所以无法通过http返回。
  • 到目前为止你尝试过什么?它不只是使用原始 SOAP 有效负载从客户端(可能在删除客户端凭据之后)到最终端点执行 HTTP POST 并返回响应吗?
  • @muratgu:问题很可能是 WCF 端点已经通过将客户端转换为某种对象而消耗了来自客户端的有效负载。在这种情况下,WCF 很可能会与你作对。
  • @mellamokb:是的,这是我的问题。如何原封不动地返回“有效载荷”。

标签: c# wcf web-services


【解决方案1】:

一个愚蠢的中介本质上是一个代理。您最好的选择可能是只使用标准的 asp.net 页面(而不是硬塞进 ASMX 或 WCF 之类的服务功能,它们只会与您抗衡),这样您就可以完全按原样接收请求并使用简单的方式处理它标准请求/响应。您可以使用HttpWebRequest 类将请求转发到另一个端点。

  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
}

【讨论】:

  • 这就是我前进的方向。谢谢你,我现在就试试并报告。
  • 您可能想了解如何使用 Fiddler 来帮助跟踪流量并在出现问题时诊断问题:fiddler2.com/fiddler2。另外,我没有想到的是,如果 API 使用 cookie 进行会话跟踪,那也必须处理。
  • 干杯,工作完成了。通过代理网站进行操作绝对是正确的方法!我还设法扩展了代码,以便它也可以处理 SOAP。希望我不需要摆弄饼干,但我会在星期一发现有人真正给我一个规格。在我的旅行中,我发现了这个membrane-soa.org/soap-router.htm,我希望把它卖给 IT 人员,而不是我的自制网站选项,我只知道这一切都会以泪水告终,我会被扼杀。
  • 只是想再次对此表示感谢。事情一经部署,结果发现它是一个 SOAP 请求,而不是 REST(显然,我只是得到了一个 URL 并被告知让它工作)。然而,这种方法对两者都适用,并且从调试的角度来看,能够以 RESTful 方式访问它非常方便。
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多