Asp.net Web api将吊架作为代理进行委派

Asp.net Web api将吊架作为代理进行委派,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,我想为XmlHttpRequest操作创建一个basix代理处理程序。我正在创建一个委派处理程序 public class ProxyHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var

我想为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;
    }
}
我想将请求转发到目标服务器。例如
http://localhost:1123?path=http://another.web.api/controller

但却抛出了一个错误:

System.Net.ProtocolViolationException:无法发送带有 这是动词类型


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

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;
}
protectedoverride async Task sendaync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
var path=request.GetQueryNameValuePairs();
var forwardUri=新的UriBuilder(路径);
request.RequestUri=forwardUri.Uri;
//添加此if块
if(request.Method==HttpMethod.Get)
{
request.Content=null;
}
var client=新的HttpClient();
var response=wait client.sendaync(请求,HttpCompletionOption.ResponseContentRead,cancellationToken);
返回响应;
}

使用如何获取路径查询参数的示例更新了代码。显然,您应该添加自己的逻辑,以确定如何管理缺少path参数的情况。
`?path=http://another.web.api/controller` request may be post get or put request.
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;
}