无法使用GET请求发送内容主体。

3
我目前正在通过WebApi接收请求,并尝试将其转发到另一个站点。
目标是接收请求,例如:http://localhost:9999/#q=test。然后将其转发到真实的站点:(我设置了google.com进行测试)http://google.com/#q=test 以下是我的代码:
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        string url = request.RequestUri.PathAndQuery;
        UriBuilder forwardUri = new UriBuilder(_otherWebSiteBase);
        forwardUri.Path = url;
        if (request.Method == HttpMethod.Get)
        {
            //request.Method = HttpMethod.Post;
        }
        request.RequestUri = forwardUri.Uri;
        request.Headers.Host = forwardUri.Host;
        return await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);//_client is an HttpClient
    }

我目前遇到了一个 System.Net.ProtocolViolationException 异常,它显示:

Cannot send a content-body with this verb-type.

但我的请求方式是GET(应该是GET),如果我使用POST请求,就没有异常发生,但Google表示他们不希望收到POST请求。

那么这个异常是为什么呢?有什么解决方法吗?

1个回答

4
我最后创建了一个初始请求的副本并再次发送它:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    string url = request.RequestUri.PathAndQuery;
    UriBuilder forwardUri = new UriBuilder(_otherWebSiteBase);
    forwardUri.Path = url;

    HttpRequestMessage newRequest = request.Clone(forwardUri.Uri.ToString());

    HttpResponseMessage responseMessage = await _client.SendAsync(newRequest);
    return responseMessage;
}

克隆方法如下,主要受到这个问题的启发:如何将HttpRequestMessage转发到另一个服务器

    public static HttpRequestMessage Clone(this HttpRequestMessage req, string newUri)
    {
        HttpRequestMessage clone = new HttpRequestMessage(req.Method, newUri);

        if (req.Method != HttpMethod.Get)
        {
            clone.Content = req.Content;
        }
        clone.Version = req.Version;

        foreach (KeyValuePair<string, object> prop in req.Properties)
        {
            clone.Properties.Add(prop);
        }

        foreach (KeyValuePair<string, IEnumerable<string>> header in req.Headers)
        {
            clone.Headers.TryAddWithoutValidation(header.Key, header.Value);
        }
        clone.Headers.Host = new Uri(newUri).Authority;
        return clone;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接