Webrequest GET Body ViolationException

时间:2017-03-08 09:13:20

标签: c# asp.net-mvc solr .net-core

我使用SolrExpress在c#(dotnet核心)中搜索和索引文档。插入(索引)文档工作正常,因为这是一个很好的发布请求。

但是,当我尝试执行选择查询(检索文档)时,我会收到聚合异常。到digging down the source in SolrExpress我发现了以下来源:

private WebRequest Prepare(SecurityOptions options, string requestMethod, string handler, string data)
{
    var baseUrl = $"{this.HostAddress}/{handler}";

    var encoding = new UTF8Encoding();
    var bytes = encoding.GetBytes(data);

    var request = WebRequest.Create(baseUrl);

    if (options.AuthenticationType == AuthenticationType.Basic)
    {
        var encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(options.UserName + ":" + options.Password));
        request.Headers[HttpRequestHeader.Authorization] = "Basic " + encoded;
    }

    request.Method = requestMethod;
    request.ContentType = "application/json";
#if NET451
    request.ContentLength = bytes.Length;
#endif

#if NETCORE
    var taskStream = request.GetRequestStreamAsync();
    taskStream.Wait();
    var stream = taskStream.Result;
    stream.Write(bytes, 0, bytes.Length);
#else
    var stream = request.GetRequestStream();
    stream.Write(bytes, 0, bytes.Length);
    stream.Close();
#endif

    return request;
}

调用此方法的方法如下:GET:

public string Get(SecurityOptions options, string handler, string data)
{
    var request = this.Prepare(options, "GET-X", handler, data);

#if NETCORE
    var task = this.ExecuteAsync(request, data);
    task.Wait();

    return task.Result;
#else
    return this.Execute(request, data);
#endif
}

此Get方法使用Solr本身(6.4.1)无法理解的请求方法GET-X导致错误。我已将此更改为正常的请求方法:GET因此解决了solr方面的错误。 但是目前我收到System.Net.ProtocolViolationException的消息:Cannot send a content-body with this verb-type.当等待taskStream完成并将其结果写入请求正文时,就会发生这种情况。

我的问题:

如何在dotnet核心内发送带有正文的GET请求(以json格式(作为字符串))?

由于RFC2616说它不被禁止,我想使用这个功能'正如在the following question

中所回答的那样
  

See RFC2616 - Hypertext Transfer Protocol - HTTP / 1.1,第4.3和34条;消息正文":

     
    

如果>的规范,则消息体不得包含在请求中。 >请求方法(第5.1.1节)不允许在请求中发送实体主体。     在第9.3节" GET"包括一个实体 - 身体是不被禁止的。

  
     

所以,是的,您可以使用HTTP GET请求发送实体主体。

0 个答案:

没有答案