Невозможно заполнить запрос libRETS с помощью SearchResultSet
Я очень новичок в libRETS. Я хотел получить некоторые данные MLS из сервиса MidWEST RETS. Я следовал примеру, указанному на официальном сайте RESO. http://www.reso.org/assets/Resources/CodeExamples/c-sharp-connection-ex.txt. Я использую C# в качестве языка программирования и использую пакет nuget https://www.nuget.org/packages/libRETS-x64/. Я могу войти, но после отправки запроса я не получаю результат. Я вставляю свой образец ниже.
using librets;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LibRETSExample
{
public class RetsHelper : IDisposable
{
private List<Listing> listings = new List<Listing>();
#region Properties
/// <summary>
/// Contains the rets session connection.
/// </summary>
internal RetsSession Session
{
get
{
return _sess;
}
set
{
_sess = value;
}
}
private RetsSession _sess;
#endregion
#region Constructors
public RetsHelper(string url, string userAgent, string userName,
string password)
{
this.Session = new RetsSession(url);
//this.Session.SetUserAgent(userAgent);
this.Session.LoggerDelegate = new RetsHttpLogger.Delegate(LogRETS);
//this.Session.SetDefaultEncoding(EncodingType.RETS_XML_ISO_ENCODING);
try
{ //Log in to RETS
bool loginResult = this.Session.Login(userName, password);
if (!loginResult)
{
Trace.WriteLine("\nLogin to RETS Failed at " + DateTime.Now);
}
else
{
Trace.WriteLine("\nLogin to RETS Succeeded at " + DateTime.Now);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
#endregion
#region Instance Methods
/// <summary>
/// Gets search results for a given query.
/// </summary>
/// <param name="searchType">Resource from rets metadata</param>
/// <param name="searchClass">Class from rets metadata</param>
/// <param name="query">RETS query to run.</param>
/// <param name="offset">Record number to start at. This is 1-based, not zero-based.</param>
/// <returns>Results of query.</returns>
internal SearchResultSet GetRetsSearchResults(string searchType, string searchClass,
string query, int offset)
{
using (SearchRequest search = this.Session.CreateSearchRequest(
searchType, searchClass.ToString(), query))
{
search.SetQueryType(SearchRequest.QueryType.DMQL2);
search.SetStandardNames(false);
search.SetLimit(10);
//search.SetFormatType(SearchRequest.FormatType.COMPACT);
search.SetOffset(offset);
SearchResultSet results = this.Session.Search(search);
return results;
}
}
/// <summary>
/// Downloads all listings, starting at the given offset. This method will recurse if needed.
/// </summary>
/// <param name="propType"></param>
/// <param name="offset">Starting record of results. This is 1-based, not zero-based.</param>
internal void DownloadAllListings(string propType, int offset)
{
try
{
using (SearchResultSet results = GetRetsSearchResults("Property", propType, "(LP=300000-)", offset))
{
// get the results as a list of objects.
List<Listing> list = Populate(results);
// Add to the master list
listings.AddRange(list);
// check to see if the list finished to the end.
int totalProcessed = list.Count + offset;
if (results.GetCount() > totalProcessed)
{
// recurse if needed.
DownloadAllListings(propType, totalProcessed);
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
public List<Listing> GetAllListings(string propType, int offset)
{
listings.Clear();
DownloadAllListings(propType, offset);
return listings;
}
/// <summary>
/// Populates a ListingCollection from a RETS result set.
/// </summary>
/// <param name="results">ResultSet to create the ListingCollection from.</param>
/// <returns>ListingCollection representing the result set. Will return
/// an empty collection if no records.</returns>
private List<Listing> Populate(SearchResultSet results)
{
List<Listing> listings = new List<Listing>();
while (results.HasNext())
{
Listing currentListing = new Listing();
//sample db mapping
currentListing.StreetNumber = results.GetString("StreetNumber");
currentListing.StreetDirection = results.GetString("StreetDirection");
currentListing.StreetName = results.GetString("StreetName");
listings.Add(currentListing);
}
return listings;
}
#endregion
#region IDisposable Members
/// <summary>
/// Logout of the RETS session.
/// </summary>
public void Dispose()
{
try
{
Session.Logout();
}
finally
{
Session.Dispose();
}
}
#endregion
public void LogRETS(RetsHttpLogger.Type type, byte[] data)
{
Trace.WriteLine(type.ToString() + ": " + Encoding.UTF8.GetString(data));
}
}
public class Listing
{
public string StreetNumber { get; set; }
public string StreetDirection { get; set; }
public string StreetName { get; set; }
}
}
Проблема, с которой я сталкиваюсь, заключается в закрытой функции List Populate(результаты SearchResultSet), код никогда не войдет в цикл while, поскольку HasNext() всегда возвращает false. Но на самом деле запрос был отправлен на сервер, и сервер возвращает результаты. Я могу видеть их в окне трассировки как данные XML. Обратите внимание, что я прикрепил делегат журнала. Я немного не понимаю, почему моя функция заполнения не работает, даже если сервер вернул результаты запроса. Любая помощь будет оценена.
1 ответ
Возможно, вам придется настроить тип формата поиска. Я знаю, что FlexMLS требует использования COMPACT_DECODED или hasNext() вернет false.
searchRequest.SetFormatType(SearchRequest.FormatType.COMPACT_DECODED);