Solr - خطأ عند نشر "إضافة" إلى الخادم
سؤال
أقوم بنشر ما يلي إلى خادم Solr:
<add>
<doc>
<field name="uniqueid">5453543</field>
<field name="modifieddate">2008-12-03T15:49:00Z</field>
<field name="title">My Record</field>
<field name="description">Descirption
Details
</field>
<field name="startdate">2009-01-21T15:26:05.680Z</field>
<field name="enddate">2009-01-21T15:26:05.697Z</field>
<field name="Telephone_number">11111 111 111(text phone)</field>
<field name="Telephone_number">11111 111 111</field>
<field name="Mobile_number">1111111111</field>
</doc>
</add>
أنا استخدم سولرنت لإرسال المستندات إليك مقتطف من الكود (s هو ملف XML أعلاه):
public string Post(string relativeUrl, string s)
{
var u = new UriBuilder(serverURL);
u.Path += relativeUrl;
var request = httpWebRequestFactory.Create(u.Uri);
request.Method = HttpWebRequestMethod.POST;
request.KeepAlive = false;
if (Timeout > 0)
request.Timeout = Timeout;
request.ContentType = "text/xml; charset=utf-8";
request.ContentLength = s.Length;
request.ProtocolVersion = HttpVersion.Version10;
try
{
using (var postParams = request.GetRequestStream())
{
postParams.Write(xmlEncoding.GetBytes(s), 0, s.Length);
using (var response = request.GetResponse())
{
using (var rStream = response.GetResponseStream())
{
string r = xmlEncoding.GetString(ReadFully(rStream));
//Console.WriteLine(r);
return r;
}
}
}
}
catch (WebException e)
{
throw new SolrConnectionException(e);
}
}
عندما يصل إلى request.GetResponse، فشل بسبب هذا الخطأ:
base {system.invalidoperationexception} = {"أعاد الخادم البعيد خطأ:(500) خطأ داخلي في الخادم."}
عندما أنظر إلى الخادم في سجلات Apache، فإنه يعطي السبب التالي:
نهاية غير متوقعة لكتلة الإدخال في النهاية
إليك تتبع المكدس الكامل:
com.ctc.wstx.exc.WstxEOFException:نهاية غير متوقعة من كتلة الإدخال في العلامة النهائية في [row ، col {غير معروف المصدر}]:
يرجى ملاحظة أن خادم Solr يعمل على النظام التالي:
Microsoft Windows Server 2003 R2 Apache Tomcat 6
وأخيراً إليك سؤالي:
يبدو ملف Xml الذي أرسله جيدًا بالنسبة لي..هل لدى أي شخص أفكار حول سبب طرح Solr لهذا الاستثناء؟
شكرًا
ديف
تعديل الإجابة كالتالي:
public string Post(string relativeUrl, string s)
{
var u = new UriBuilder(serverURL);
u.Path += relativeUrl;
var request = httpWebRequestFactory.Create(u.Uri);
request.Method = HttpWebRequestMethod.POST;
request.KeepAlive = false;
if (Timeout > 0)
request.Timeout = Timeout;
request.ContentType = "text/xml; charset=utf-8";
request.ProtocolVersion = HttpVersion.Version10;
try
{
// Set the Content length after the size of the byte array has been calculated.
byte[] data = xmlEncoding.GetBytes(s);
request.ContentLength = s.Length;
using (var postParams = request.GetRequestStream())
{
postParams.Write(data, 0, data.Length);
using (var response = request.GetResponse())
{
using (var rStream = response.GetResponseStream())
{
string r = xmlEncoding.GetString(ReadFully(rStream));
//Console.WriteLine(r);
return r;
}
}
}
}
catch (WebException e)
{
throw new SolrConnectionException(e);
}
}
المحلول
لست على دراية كبيرة بمنفذ .Net أو Solr أو .Net الخاص بـ Solr.ولكن هنا هو تخميني.
postParams.Write(xmlEncoding.GetBytes(s), 0, s.Length);
هناك نوعان من الأخطاء المحتملة.
- عندما تحصل على بايتات من سلسلة، يجب عليك تحديد التشفير.قد يكون الأمر أن الترميز الافتراضي يختلف عن UTF8، الذي قمت بتعيينه في رأس نوع المحتوى استجابةً لذلك.
- من المحتمل أن تشير المعلمة الثالثة في Write() إلى طول مصفوفة البايت التي حصلت عليها من GetBytes().يمكن أن يكون صفيف البايت أطول من طول السلسلة.