Asp.net Web API 将挂机作为代理进行委派



我想为我的XmlHttpRequest操作创建一个basix代理处理程序。我正在创建一个委派处理程序。

public class ProxyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var forwardUri = new UriBuilder(request.RequestUri);
        request.RequestUri = forwardUri.Uri;
        var client = new HttpClient();
        var response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken);
        return response;
    }
}

配置

        config.Routes.MapHttpRoute(
            name: "Proxy", 
            routeTemplate: "{*path}", 
            handler: HttpClientFactory.CreatePipeline(
                    innerHandler: new HttpClientHandler(), 
                    handlers: new DelegatingHandler[] { new ProxyHandler() }),
            defaults: new { path = RouteParameter.Optional },
            constraints: null
        );

我想将请求转发到目标服务器。例如http://localhost:1123?path=http://another.web.api/controller

但是抛出错误:

System.Net.ProtocolViolationException: 无法发送包含以下内容的正文 这种动词类型。

`?path=http://another.web.api/controller` request may be post get or put request.

转发GET请求时,您需要为传递给处理程序的请求设置内容null。更新代码以检查请求方法并在执行GETnull内容。

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    var path = request.GetQueryNameValuePairs().Select(x => x.Key == "path").FirstOrDefault();
    var forwardUri = new UriBuilder(path);
    request.RequestUri = forwardUri.Uri;
    // Add this if block
    if (request.Method == HttpMethod.Get)
    {
        request.Content = null;
    }
    var client = new HttpClient();
    var response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken);
    return response;
}

最新更新