asp.net-web-api – 如何为代理控制器设置Web API路由?
我的部分应用程序需要充当第三方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中的路由功能. 解决方法
以下是我如何使用它.首先,使用您想要支持的每个动词的方法创建一个控制器:
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" }); 现在回到控制器中的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); } } 结合could be more sophisticated的URL,但这是基本的想法. 另请注意在SendAsync调用中传递的HttpCompletionOption.ResponseContentRead参数,因为没有它,如果内容很大,ASP.NET将花费exremeley长时间阅读内容(在我的情况下,它将500KB 100ms请求更改为60s请求) . (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 使用.NET和Jenkins的Selenium性能 – 如何分析和
- asp.net – 集合的Asp MVC3自定义EditorTemplate(空或不)
- asp.net-mvc – 没有CreateMap的简单转换时的Automapper错误
- ASP.NET – 图像未显示
- asp.net – 我使用什么Active Directory字段来唯一标识用户
- asp.net-mvc – 加载程序集时会发生什么?
- asp.net – 实现自定义成员资格提供程序成员资格用户问题
- asp.net-mvc-5 – 依赖注入结构图ASP.NET Identity MVC 5
- 调试 – 使用ASP.Net Core在VSCode中调试Typescript
- asp.net-mvc – 使用NLog记录未处理的异常? ELMAH和NLog应
- asp.net – Crystal Report Viewer按钮在Google
- sth about abp,zero module,asp.net zero
- ASP.NET连接字符串到本地SQL Server数据库,使用w
- 有没有带语音记录示例代码的ASP.NET?
- asp.net-mvc-2 – 仅在运行调试器时出现Antiforg
- asp.net – 什么叫Page_Load,它是如何做的?
- asp.net-mvc – 缺少Visual Studio 2012 MVC本地
- asp.net-mvc – 将JWT令牌存储在cookie中
- asp.net – 文件下载问题:文件名与空格被截断!
- asp.net-mvc – ASP.NET MVC控制器的静态方法