Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 &引用;透明的;用于请求ASP.NET Web API的服务器端代理_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

Asp.net mvc 4 &引用;透明的;用于请求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

具有生成JSON响应的ASP.NET Web API端点。但由于两个因素,不能直接从浏览器中使用

  • 跨域问题
  • 需要为只有服务器端已知的API提供会话票证
  • 因此,我需要一个用于客户端(浏览器)请求的轻量级服务器端代理,以使用会话密钥扩展请求。不希望在代理代码中对客户端JSON请求或Web API JSON响应进行反序列化带来开销。希望按“原样”传递有效负载,并仅对Web API端的客户端请求和仅对Web API响应的客户端(浏览器)端进行反序列化。也就是说,代理从浏览器获取json并将其直接传递给Web API。它还将JSON响应从Web API直接传递到浏览器,而无需反序列化。只是一个虚拟代理,它不知道它传输的数据的任何信息。 请建议它是否可行,以及实施它的最佳方式是什么。现有的web应用程序(用于生成客户端页面的应用程序)是使用ASP.NET MVC 4实现的

    提前谢谢。

    我。出于您的目的,代码应该很容易更新

    基本思想是创建一个WebApi DelegatingHandler,将请求传递给HttpClient:

        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。