Laden...

WCF Dataservice ignoriert oData-Parameter

Erstellt von Spikocalypse vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.291 Views
S
Spikocalypse Themenstarter:in
21 Beiträge seit 2008
vor 11 Jahren
WCF Dataservice ignoriert oData-Parameter

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

16.842 Beiträge seit 2008
vor 11 Jahren

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.

S
Spikocalypse Themenstarter:in
21 Beiträge seit 2008
vor 11 Jahren

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