如何使用C#(WCF)转发REST Web服务?

4
有一个网络服务只能通过http进行消费,而客户端只能消费https网络服务。因此,我需要一些中介来转发在https接收到的请求并返回http响应。
假设中介是完全愚蠢的,除了它知道Web服务端点在哪里之外(即它不知道服务的签名是什么,它只知道可以通过http Web请求与其通信,并且它监听某些https URI,将收到的任何内容转发出去),如何实现这一点最简单?
我已经玩了一整天,不确定如何实现“愚蠢”的部分,即不知道传回逐字响应的签名。

1
你确定需要HTTP/HTTPS限制吗?HTTPS仍然是HTTP,只不过是在安全连接上。如果客户端接受纯HTTP响应,您可以使用从443到80的端口转发来解决问题。 - Cameron
我被告知端口转发不是一个选项。不确定为什么,但这是规范的一部分;可能是因为客户端在公司内部网络之外,所以无法通过http返回。 - satnhak
你目前尝试了什么?难道不只是使用客户端的原始SOAP有效负载(可能在删除客户端凭据后)执行HTTP POST到最终端点并返回响应吗? - muratgu
@muratgu:问题很可能是WCF终结点已经通过将其转换为某种对象消耗了来自客户端的有效负载。在这种情况下,WCF可能会与您作对。 - mellamokb
@mellamokb:是的,那就是我的问题。如何不经过篡改地返回“有效载荷”。 - satnhak
1个回答

4
一个“愚蠢”的中介是一个代理。最好的方法可能是使用标准的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获取响应并将其作为响应发送回其他端点(基本上只需将内容写入响应即可)。
您需要编写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
}

那正是我正在努力的方向。感谢你,我现在会尝试并回复反馈。 - satnhak
如果某些功能无法正常工作,您可能需要学习如何使用 Fiddler 来跟踪流量和诊断问题:http://www.fiddler2.com/fiddler2/。另外,我没有考虑到的是,如果 API 使用 cookie 进行会话跟踪,那么也必须处理它们。 - mellamokb
1
干得好!通过代理网站进行操作绝对是正确的方法!我还成功地扩展了代码,使其也能处理SOAP。希望我不需要调整cookie,但周一有人给我规范时我会找出来的。在我的旅行中,我发现了这个http://membrane-soa.org/soap-router.htm,我希望能够向IT人员推荐它,而不是使用自己编写的网站选项,因为我知道这将最终导致失败并让我受到指责。 - satnhak
只是想再次感谢您。一旦部署了该项目,发现它是一个SOAP请求,而不是REST(显然,我只是被给了一个URL并被告知让它工作)。但是这种方法适用于两者,并且能够以RESTful方式访问非常方便,从调试的角度来看。 - satnhak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接