Asp.net mvc 4 &引用;透明的;用于请求ASP.NET Web API的服务器端代理
具有生成JSON响应的ASP.NET Web API端点。但由于两个因素,不能直接从浏览器中使用Asp.net mvc 4 &引用;透明的;用于请求ASP.NET Web API的服务器端代理,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,具有生成JSON响应的ASP.NET Web API端点。但由于两个因素,不能直接从浏览器中使用 跨域问题 需要为只有服务器端已知的API提供会话票证 因此,我需要一个用于客户端(浏览器)请求的轻量级服务器端代理,以使用会话密钥扩展请求。不希望在代理代码中对客户端JSON请求或Web API JSON响应进行反序列化带来开销。希望按“原样”传递有效负载,并仅对Web API端的客户端请求和仅对Web API响应的客户端(浏览器)端进行反序列化。也就是说,代理从浏览器获取json并将其直接传递给W
public class ForwardProxyMessageHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Add("X-Forwarded-For", request.GetClientIp());
if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace) request.Content = null;
request.RequestUri = new Uri(request.RequestUri.ToString().Replace(":3002", "")); //comes through with the port for the proxy, rewrite to port 80
request.Headers.AcceptEncoding.Clear();
var responseMessage = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
responseMessage.Headers.TransferEncodingChunked = null; //throws an error on calls to WebApi results
if (request.Method == HttpMethod.Head) responseMessage.Content = null;
return responseMessage;
}
}
公共类ForwardProxyMessageHandler:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
Add(“X-Forwarded-For”,request.GetClientIp());
if(request.Method==HttpMethod.Get | | request.Method==HttpMethod.Trace)request.Content=null;
request.RequestUri=newURI(request.RequestUri.ToString().Replace(“:3002”,”);//通过代理的端口,重写到端口80
request.Headers.AcceptEncoding.Clear();
var responseMessage=wait new HttpClient().sendsync(请求,HttpCompletionOption.ResponseHeadersRead);
responseMessage.Headers.TransferncodingChunked=null;//在调用WebApi结果时引发错误
if(request.Method==HttpMethod.Head)responseMessage.Content=null;
返回响应消息;
}
}
您如何将其合并到特定路径的web api控制器中?我认为您只需单独注册它的路由,而不是作为任何其他控制器的一部分。是否有其他人会收到任何url返回的404?人们应该知道,像提供的示例中那样更新HttpClient实例可能会导致问题。文档中写道:“HttpClient打算实例化一次,并在应用程序的整个生命周期内重复使用。为每个请求实例化HttpClient类将耗尽重载下可用的套接字数量。”@Asher我收到了404个PUT/DELETE方法的返回;GET/POST按预期命中委派处理程序。我在同一个应用程序的其他地方使用PUT/DELETE,它只是调用透明服务器端代理,获取这些HTTP谓词的404。