Asp.net Web api将吊架作为代理进行委派
我想为XmlHttpRequest操作创建一个basix代理处理程序。我正在创建一个委派处理程序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
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;
}