我使用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请求发送实体主体。