Hi zusammen,
ich habe ein Problem bei dem ich echt nicht mehr weiter weiß.
Ich arbeite aktuell an einem WCF Dataservice. Dieser liest beim Aufrufen eine Liste von NewsFeeds-Links in den Bauch. In der Adresse kann dann ein Parameter weitergegeben werden, mit dem die Newsfeed-Liste eingeschränkt wird (ein Standort in diesem Fall) und nur für diese Elemente Atome mit den Feed-Inhalten zurückgeliefert werden.
Das funktioniert an sich schon, und auch recht gut. Mein Problem ist jetzt aber nur (korrigiert mich wenn ich mich irre und das überhaupt noch nie ging), dass er oData-Parameter wie "$top=5" z.B. komplett ignoriert, bzw. noch schlimmer: Beim Debuggen ist alles gut, und sobald ich nach dem letzten Breakpoint F5 drücke, bekomm ich im Browser nur einen HTTP400.
Anbei hab ich mal den Code des Dataservice an sich mit reingepackt. Das Ergebnis das hinten rauskommt ("NewsItems") ist eine ObservableCollection<NewsItem>
namespace NewsFeedProvider
{
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class NewsProviderService : DataService<NewsItemContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
try
{
config.UseVerboseErrors = true;
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
catch { }
}
[WebGet]
public IQueryable<NewsItem> byUnit(string unit = null)
{
try
{
IEnumerable<SPListItem> UnitResults = this.CurrentDataSource.FeedList.Where(ThisItem => ThisItem.Unit == unit);
NewsItemList NewsResultList = new NewsItemList(UnitResults);
return NewsResultList.AsQueryable();
}
catch
{
return null;
}
}
[WebGet]
public IQueryable<NewsItem> byLocation(string loc)
{
//return this.CurrentDataSource.Header.Take(4);
//Zusammenbauen der News-Items nach angegebener Location
try
{
IEnumerable<SPListItem> LocResults = this.CurrentDataSource.FeedList.Where(ThisItem => ThisItem.Location == loc);
NewsItemList NewsResultList = new NewsItemList(LocResults);
return (from n in NewsResultList select n).AsQueryable();
}
catch { return null; }
}
}
}
habt ihr Ideen dazu? Aktuell kann ich zwar "top" zum Beispiel eben selber handeln in dem Webget, aber das ist ja nicht der Sinn eigentlich.
Vielen Dank
Marco
Die Methoden müssen mit dem QueryableAttribut gekennzeichnet sein.
Deine Methoden sind aber nicht wirklich gut umgesetzt.
So entsprich ein return (from n in NewsResultList select n).AsQueryable();
nicht anderes als NewsResultList.AsQueryable();
Zudem schreibt man Variablen klein, damit man sie besser unterscheiden kann.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Moin!
erst mal danke für die Antwort, das werde ich mal versuchen.
Der Code ist aktuell noch nicht mehr als ein Versuch. Das ist auch das erste mal das wir einen dataservice einsetzen, der kein echtes Datamodel als Context hat, sondern Dinge aus FileIO zusammenbaut. Produktiv wird das Prinzip wo anders implementiert.
Verwendung von Groß und Klein ist hier im Team einfach abgesprochen. Das war schon vor mir da...
viele Grüße