gpt4 book ai didi

asp.net-web-api - 如何为代理 Controller 设置 Web API 路由?

转载 作者:行者123 更新时间:2023-12-04 10:00:06 24 4
gpt4 key购买 nike

我的应用程序的一部分需要充当第三方 RESTful Web 服务的代理服务器。有没有办法设置 Web API 路由,以便所有相同类型的请求都转到相同的方法?

例如,如果客户端发送这些 GET 请求中的任何一个,我希望它们进入单个 GET 操作方法,然后将请求发送到下游服务器。

api/Proxy/Customers/10045
api/Proxy/Customers/10045/orders
api/Proxy/Customers?lastname=smith

GET 的单一操作方法将选择这三个请求中的任何一个并将它们发送到相应的服务(我知道如何使用 HttpClient 来有效地实现这一点):
http://otherwebservice.com/Customers/10045
http://otherwebservice.com/Customers/10045/orders
http://otherwebservice.com/Customers?lastname=smith

我不想将我的 Web 服务与第三方 Web 服务紧密耦合,并将它们的整个 API 作为方法调用复制到我的内部。

我想到的一种解决方法是在客户端用 JavaScript 简单地对目标 URL 进行编码,然后将其传递到 Web API 中,然后 Web API 只会看到一个参数。它会起作用,但如果可能的话,我更愿意使用 Web API 中的路由功能。

最佳答案

这就是我如何让它工作的。首先,为每个要支持的动词创建一个带有方法的 Controller :

public class ProxyController : ApiController
{
private Uri _baseUri = new Uri("http://otherwebservice.com");

public async Task<HttpResponseMessage> Get(string url)
{
}

public async Task<HttpResponseMessage> Post(string url)
{
}

public async Task<HttpResponseMessage> Put(string url)
{
}

public async Task<HttpResponseMessage> Delete(string url)
{
}
}

这些方法是异步的,因为它们将使用 HttpClient。像这样映射你的路线:
config.Routes.MapHttpRoute(
name: "Proxy",
routeTemplate: "api/Proxy/{*url}",
defaults: new { controller = "Proxy" });

现在回到 Controller 中的 Get 方法。创建一个 HttpClient 对象,使用适当的 Url 创建一个新的 HttpRequestMessage 对象,从原始请求消息中复制所有内容(或几乎所有内容),然后调用 SendAsync():
public async Task<HttpResponseMessage> Get(string url)
{
using (var httpClient = new HttpClient())
{
string absoluteUrl = _baseUri.ToString() + "/" + url + Request.RequestUri.Query;
var proxyRequest = new HttpRequestMessage(Request.Method, absoluteUrl);
foreach (var header in Request.Headers)
{
proxyRequest.Headers.Add(header.Key, header.Value);
}

return await httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseContentRead);
}
}

URL组合 could be more sophisticated ,但这是基本思想。
对于 Post 和 Put 方法,您还需要复制请求正文

另请注意 HttpCompletionOption.ResponseContentRead传入的参数 SendAsync调用,因为没有它,如果内容很大,ASP.NET 将花费很长时间来读取内容(在我的情况下,它将 500KB 100ms 请求更改为 60s 请求)。

关于asp.net-web-api - 如何为代理 Controller 设置 Web API 路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25145098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com