Bessere Suchergebnisse mit affilinet Produktdaten Webservices

April 28th, 2009

Ein relativ unbekanntest Feature bei der Produktsuche über affilinet Webservices ist, dass man (und wie man) Suchbegriffe mit UND und/oder ODER verknüpfen kann. Das ganze geht folgendermaßen:

UND Verknüpfung:

Dies ist die Standard Verknüpfung. Hierbei werden einfach mehrere Suchbegriffe hintereinander geschrieben.

Beispiel: “BMW Benzin Diesel”

Hierbei werden alle Produkte gefunden, die sowohl “BMW” als auch “Benzin” enthalten.

ODER Verknüpfung:

Hierbei werden die Suchbegriffe in Klammern geschrieben.

Beispiel: (Benzin Diesel)

Hierbei werden alle Produkte gefunden, die entweder “Benzin” oder “Diesel” enthalten

ODER mit UND verknüpfen

Will man UND mit ODER verknüpfen, muss man darauf achten, dass das UND hinter dem ODER steht:

Beispiel: (Benzin Diesel) BMW

Hierbei werden alle Produkte gefunden die “BMW” UND “Benzin” ODER “Diesel” enthalten.

Gutscheincode Webservice von affilinet

April 26th, 2009

Wie ja schon im letzten Post geschrieben, hat sich etwas getan am WSDL der Inbox Webservices:

https://api.affili.net/V2.0/PublisherInbox.svc?wsdl

Seit kurzem ist da die neue Methode “GetVoucherCodes” aufgetaucht. Hiermit hat man die Möglichkeit die seit kurzem auf der Publisher Plattform verfügbaren Gutscheine bzw. Gutscheincodes via Webservice abzufragen.

In Aktion könnt ihr das ganze unter: http://www.derbilligpreisvergleich.de/Gutscheinverzeichnis_S0

Hidden Feature beim CSV Produktlisten Download von affilinet

April 24th, 2009

Ich weiß nicht, ob ihr es schon wusstet:

Will man sich die Produktlisten von affilinet runterladen, so kann man dies direkt über die Website machen und hat hier die Auswahl ob es gezipped sein soll oder nicht. Nutzt man dagegen die von affilinet bereit gestellte Liste für den automatischen Download werden diese immer ungezipped heruntergeladen. Fügt man in den Urls allerdings den Parameter zip=1 hinzu, kann man sich auch auf diesem Weg die Produktlisten gezipped besorgen.

Die Liste für den automatischen Download findet ihr hier:

Konto / Technische Einstellungen / CSV Produktdaten / automatischer CSV Download

Beispiel:

http://publisher.affili.net/Download/AutoDownload.aspx?PartnerID=XXX&csvPW=XXX&listID=XXX&zip=1

affilinet Produktdaten Webservices effektiv nutzen – Teil 2

April 18th, 2009

Da ich in der letzten Woche ein wenig Zeit hatte, habe Ich es endlich geschafft die im Teil 1 beschriebene Funktionalität umsetzen zu können. Das Resultat könnt ihr euch unter folgender URL ansehen:

http://www.derbilligpreisvergleich.de

Hier werden für die Darstellung der Produktdaten lediglich affilinet Webservices genutzt. Welche dies genau sind und mit welchen schwierigkeiten man dabei zu kämpfen hat, erfahrt ihr im nächsten Teil. Soviel aber schon jetzt: Caching, caching, caching!

Und noch ein Tipp: guckt euch mal das WSDL für die Inbox Webservices (die neuen) an…passend zu Ostern! Naja, fast! ;-)

affilinet Produktdaten Webservices effektiv nutzen – Teil 1

April 8th, 2009

Aus aktuellem Anlass werde Ich mit dem ASP.NET Tutorial für Anfänger erstmal nicht weitermachen und stattdessen einige Tipps und Beispiele für die effektive Nutzung von affilinet Produktdaten geben. Hier tauchen anscheinend immer wieder die gleichen Fragen und Probleme auf, so dass viele potentielle Anwender schon nach einigen Stunden abgeschreckt werden, bevor überhaupt ein Ergebnis erzielt wurde. Um das Szenario möglichst realistisch zu halten, werde Ich hierfür bei affilinet einen neuen Account anlegen und somit den kompletten Ablauf dokumentieren um von einem neuen Account zu einem funktionierenden Online Shop zu kommen, welcher möglichst viele Daten enthält. Auch SEO wird hier eine große Rolle spielen.

Ein großes Problem, welches nur manuell gelöst werden kann ist die Anzahl der Produkte zu maximieren mit der man arbeiten kann. Hierfür benötigt man natürlich möglichst viele Partnerschaften mit Programmen, welche Produktdaten anbieten. Ich werde mich hierbei lediglich auf die affilinet Webservices konzentrieren, da die Nutzung der CSV Produktdaten IMHO schon ein wenig komplizierter ist (Meist eine eigene DB notwendig).

Ich werde mich dabei allerdings nicht nur auf die Produktdaten Webservices beschränken sondern zumindest auch die Programmlisten Webservices benutzen.

Ziel ist hierbei einen Onlineshop zu erstellen, welcher für möglichst viele verschiedene Zielgruppen optimierte Produktdaten liefert, also einen wirklichen Mehrwert für den Benutzer darstellt und nicht nur die Suchmaschinen mit unnötigem Spam versorgt.

Eigentlich sieht es ja so aus, dass man sich zuerst mit einer bestehenden Website bei den jeweiligen Programmen bewirbt. Das ist natürlich das erste Problem bei der Erstellung eines neuen Projektes. Man benötigt Daten um eine Seite zu erstellen, die man aber erst bekommt, wenn bereits eine Seite vorhanden ist. Ein typisches Henne Ei Problem. Hier bleibt einem nichts anderes übrig, als eine Seite zu erstellen, welche für den Advertiser interessant ist, so dass eine Partnerschaft ermöglicht wird.

In den meisten Fällen reicht es aus eine Partnerschaft mit einem Program einzugehen, welches Produktdaten anbietet. In einigen Fällen muss aber die Benutzung der Produktdaten gesondert beantragt werden.

Typischer Ablauf

1. Relevante Seite erstellen und im Internet veröffentlichen

Tipp: Seiten wie „Hier entsteht eine neue Internetpräsenz” o.ä. werden euch nicht viel nützen sondern eher schaden. Wird eine Bewerbung abgelehnt, könnt ihr euch erst nach 3 Monaten bei diesem Programm erneut bewerben.

2. Neuen Account für diese URL bei affilinet erstellen (oder vorhanden Benutzen)

Tipp: Wird ein neuer Account mit genau denselben Einstellungen erstellt (Natürlich mit anderer URL), wird dieser bei affilinet als „verlinkter” Account gehandhabt. Somit könnt Ihr euch mit einem Account anmelden und trotzdem alle mit einem Login verwalten.

3. Suche nach Programmen mit Produktdaten durchführen und bei diesen bewerben

Hierfür muss einfach folgende Seite aufgerufen werden:

Solutions / Produktdaten / Produktlisten
http://publisher.affili.net/Solutions/productSearch.aspx

Leider ist es nicht möglich sich bei mehreren Programmen automatisch zu bewerben. Somit ist hier ein hoher manueller Aufwand nötig. L

4. Bewerbung bei Programmen ohne Produktdaten (optional)

Ich gehe hierbei auch Partnerschaften mit Programmen ein, welche keinerlei Produktdaten anbieten, da ich mit Benutzung der Programmlisten Webservices meinen Benutzern ebenfalls Dienstleistungen schmackhaft machen möchte, welche keinerlei Produktdaten anbieten (Kreditvergleicher o.ä.)

5. Auf Bestätigung der Partnerschaft warten

Da einige Programme euch sofort automatsch annehmen werden, könnt ihr mit diesen natürlich schon sofort loslegen. Bei den meisten müsst ihr euch leider auf längere Wartezeiten gefasst machen.

6. Gesondert für die Benutzung der Produktdaten bewerben

Wenn eure Partnerschaft vom Program angenommen wurde, solltet ihr nochmal kontrollieren, ob ihr die Benutzung der Produktdaten gesondert beantragen müsst, indem ihr nach der Annahme nochmals die Produktlistenseite kontrolliert und gegeben falls hier beim jeweiligen Shop die Benutzung beantragt.

7. Passwörter für den Webservices Zugriff generieren

Um überhaupt die Webservices benutzen zu können, müsst ihr euch bei affilinet noch die entsprechenden Passwörter besorgen. Dazu geht ihr auf folgende Seite und generiert euch diese.

Konto / Technische Einstellungen / Webservices
http://publisher.affili.net/Account/techSettingsPublisherWS.aspx

8. Wahl der “richtigen” API

Nun habt ihr noch einmal die Qual der Wahl. Es wurde vor kurzem eine neue Version der affilinet Webservices API veröffentlicht, die im Vergleich zu den alten einige offensichtliche Verbesserungen gebracht haben was die Einheitlichkeit der Methoden angeht (Parameternamen und Typen). Allerdings sind diese zurzeit nur via SOAP zu erreichen. Um es kurz zu machen: Wisst ihr was SOAP ist und wie ihr SOAP Webservices via PHP o.ä. ansprechen könnt nehmt einfach die neuen. Wisst ihr das nicht und habt auch kein Interesse daran euch dieses Wissen anzueignen oder könnt es aus technischen Gründen nicht (Für PHP: Server benötigt SOAP Extensions und OpenSSL), bleibt euch nichts anderes übrig als die „alten” Webservices zu benutzen. Die verstehen sich auch mit HttpGet Requests (D.h. Ihr könnt einfach eine URL aufrufen um an die Ergebnisse zu kommen).

Neue Dienste

http://developer.affili.net/

Hier wurde von affilinet eigens für die neuen Webservices ein neues Portal erstellt, welches neben der Dokumentation der Dienste ebenfalls eine Sandbox Datenbank zur Verfügung stellt um ohne Partnerschaften testen zu können.

Alte Dienste

Für Programmlisten, Statistiken o.ä.:
http://webservices.affili.net/Publisher/Default.aspx
Dokumentation

Für Produktdaten:
http://webservices.affili.net/PDWS/ProductDataV2.asmx
Dokumentation

So, nun habt ihr eigentlich alles, was ihr für die Nutzung der Webservices braucht um einen schönen Onlineshop zu basteln. Im nächsten Teil werde Ich dann einige Hilfestellungen zu den richtigen Methoden und deren Parametern geben. Ein wenig selber mit den Webservices zu spielen kann ja zwischenzeitlich auch nicht schaden…zumal ihr sowieso wahrscheinlich auf einige Bewerbungen warten werdet! ;-)

Hinweise:

Programme vs Shops (aka Produktlisten)

Programme sind nicht gleich Shops! Angenommen ihr habt eine Partnerschaft mit einem Program mit der ID 0815, dann ist dies nicht auch gleichzeitig die ShopId. Diese kann dann zum Beispiel 4711 sein. Dies hat damit zu tun, dass viele Programme verschiedene Produktliste aka Shops anbieten, die jeweils unterschiedliche IDs haben. Um eine Liste aller Shops zu bekommen müsst ihr entweder die oben beschriebene Produktlistenseite benutzen oder gleich den Webservice GetShopList, welche wiederum ein Mapping von Shop auf Program ermöglicht.

Programmkategorien vs Shopkategorien vs Kategorien der einzelnen Shops

Das gleiche gilt für die Kategorien. Es gibt zum einen die Programmkategorien des affilinet Portals in welche die Programme einsortiert sind (ProgramListService/GetProgramCategories) und zum anderen sogenannte Shopkategorien (getCategoryList mit Parameter „0″ für ShopID) in welche die Produkte aller Shops einsortiert sind. Zusätzlich hat jeder Shop wiederum eigene Kategorien, welche ebenfalls über getCategoryList mit der jeweiligen ShopID abzufragen sind die ihr über die Methode GetShopList bekommt! ;-)

Die Struktur sieht also folgendermaßen aus:

Programmkategorien – > Programme -> Shops -> Shopkategorien -> Produkte

Oder

Shopkategorien (von ShopID „0″) -> Produkte

affilinet hat freundlicherweise die Kategorien der einzelnen Shops auf den generellen Kategorie baum „gemapped”, so dass ihr anhand der generellen Kategorien (ShopID „0″) einen einheitlichen Shop aufbauen könnt, welche die Produkte aller einzelnen Shops enthält. Alternativ könnt ihr über den Kategorie baum eines einzelnen Shops eine spezialisierte Seite bauen, die lediglich eine Produktliste behandelt (Mein toller Buchladen o.ä.) wenn ihr eine Seite für eine Nische haben wollt.

Hierfür werde ich in naher Zukunft Beispiele vorstellen, die es euch ermöglicht mit den richtigen Methoden und Parametern sehr einfach eigene Onlineshops zu erstellen.

Wahl der richtigen Methode

Grundsätzlich stehen folgende Methoden zum Suchen von Produkten zur Verfügung:

  • SearchProducts
  • SearchProductsInCategory
  • SearchProductsInCategories

Ich will jetzt gar nicht lange Beschreiben, wofür welche Methode genau da ist. Dafür gibt es ja die Dokumentation von affilinet. Aus Erfahrung kann Ich nur empfehlen nach Möglichkeit die Suche auf Kategorien einzuschränken und hierfür die Methode SearchProductsInCategories zu verwenden. Muss über den gesamten Datenbestand gesucht werden bleibt nur die SearchProducts. Hierbei sind die Ergebnisse allerdings aufgrund der vielen Daten nicht immer wirklich optimal.

Wenn ihr schnell mal gucken wollt, welche Anfragen welche Ergebnisse bringen sei euch neomatrix ans Herz gelegt. Hier liegt zwar der eigentliche Fokus auf Statistiken (mehrere Publisher Accounts aggregiert, Vergleichszeiträume etc.) aber auch der Teil „Werbemittel” welcher einen Generator für Flash Carousels beinhaltet ist für die Abfrage und den Test der Produktdatenwebservices gut geeignet. Grundsätzlich benutzt das Tool nur affilinet Webservices, so dass ihr hier einen guten Überblick bekommen könnt, was hiermit alles möglich ist! :-) http://www.affili-tools.net/

ASP.NET Basics – Mehrteiliges Tutorial

February 5th, 2009

Ich werde in den nächsten Tagen / Wochen schrittweise ein Tutorial posten, welches die Basics von ASP.NET so einfach wie möglich vermitteln soll. Somit wird es erst mal wieder nix mit .NET 3.5 und so! ;-)  Da ich aber gerade versuche einem Freund zu zeigen wie er möglichst einfach eine Website hinbekommt, nutze ich doch einfach meinen blog dafür! Es wird zu jedem Teil einen Film geben (Screen-Recorder) in dem Ich klick-für-klick alles zeige, was nötig ist um zum Ziel zu kommen. Ausserdem gibt’s natürlich jede Menge Screenshots und Code Samples (wenn nötig)!

Das grundsätzliche Thema wird es sein, eine Website zu erstellen die es (dem dazu berechtigten Benutzer) ermöglicht Daten in einem Formular eingeben, ändern und löschen zu können. Ausserdem sollen die Eingaben in einer Tabelle ausgegeben werden können.

 Momentan plane ich folgende Themen zu posten:

  1. Erstellen von Projekt & Datenbank
  2. Ausgeben der Daten mit dem GridView Control
  3. Administrieren der Daten mit dem DetailsView Control
  4. Eigene Controls für die Eingabe der Daten einfügen mit dem TemplateField
  5. Immer passende Daten mit den Validator Controls
  6. Fehlermeldungen gebündelt ausgeben mit dem Validation Summary
  7. Validierung mit dem eigenen Calendar Control Extender
  8. Eigene Formulare mit dem FormView Control
  9. Eigene Bilder auf den Server laden mit dem FileUpload Control
  10. Repeater Control für einfachen Ausgabe von Daten
  11. Und jetzt in hübsch! – (x)HTML und CSS Grundlagen 
  12. Klare Struktur mit MasterPages und ContentPages
  13. Benutzer verwalten und Berechtigungen prüfen mit dem MembershipProvider
  14. Auf den Server…fertig…los! – Suche nach einem geeigneten Server
  15. Sag’ mir deine Domain und ich sage dir wer du bist…
  16. 3…2…1…Deploy! – Hochspielen der Website und konfigurieren des Servers.

Ob das alles genau in dieser Reihenfolge kommen wird oder ob ich auf einige Themen in mehreren Teilen eingehe weiß ich noch nicht. Auf jeden Fall werde ich hier ab morgen alle zwei bis drei Tage jeweils einen Teil hier posten!

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß

Lösung für den Fehler: “Format of the initialization string does not conform to specification starting at index 0.”

February 4th, 2009

Folgender Fehler tritt teilweise auf, wenn man mittels des Enterprise Library Configuration Tools einen Connection String mit Copy & Paste einfügt:

Format of the initialization string does not conform to specification starting at index 0.

Dies kann manchmal daran liegen, dass die Anführungszeichen im Connection String falsch formatiert in die jeweilige Config eingefügt wird:

  <connectionStrings>
    <add name="ConnectionString" connectionString="database=DBNAME;Server=192.168.0.1;Persist Security Info=False;
      User ID=UserName;pwd=password;&quot; providerName=&quot;System.Data.SqlClient" />
  </connectionStrings>

Hier reicht es somit aus die Anführungszeichen manuell in der Config zu korrigieren:

  <connectionStrings>
    <add name="ConnectionString" connectionString="database=DBNAME;Server=192.168.0.1;Persist Security Info=False;
      User ID=UserName;pwd=password;" providerName="System.Data.SqlClient" />
  </connectionStrings>

Sobald der Connection String richtig formatiert in der jeweiligen Config steht, sollte das Problem behoben sein! :-)

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß

“Validation of viewstate MAC failed” Problem in .NET 3.5 SP1

January 29th, 2009

Falls ihr auch schon bei der Umstellung von .NET 2.0 auf .NET 3.5 (speziell nach der Installation von SP1) auf folgende Fehlermeldung gestoßen seid und bei google zu diesem Thema keine wirkliche Lösung gefunden habt:

“Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.”

Validation of viewstate MAC failed

ViewStateMAC Fehlermeldung

Es ist so, dass die Behebung der Fehlermeldung in vielen Fällen absolut nichts mit der Konfiguration zu tun hat. In den meisten Einträgen bei google habe Ich eigentlich nur hinweise gefunden, dass man den ViewStateMac abstellen soll, damit wieder alles funktioniert.

Also entweder in der Web.Config:

oder direkt in der Page Direktive

<!--bla....bla...** Inherits="MyAssembly.MyPage" enableViewStateMac="False"-->

Dabei ist es in vielen Fällen viel einfacher! Bei mir war in einer alten Website das Problem, dass im form tag der MasterPage eine action angegeben war. Bisher wurde das “action” Attribut komplett ignoriert…was nun aber bei .NET 3.5 SP1 nicht mehr der Fall ist!

Bei mir hat es dann ausgereicht aus:

<form id="form1" action="SomePage.aspx" enctype="application/x-www-form-urlencoded">
</form>

einfach das “action” Attribut zu entfernen:

<form id="form1" enctype="application/x-www-form-urlencoded"></form>

Und schon funktionierte wieder alles so wie es sollte!

Hintergrund dazu ist, daß es mit .NET 3.5 SP1 nun möglich ist eine eigene Seite zu definieren, an die das Formular gesendet werden soll. Bisher wurde das Attribut einfach ignoriert…egal was da angegeben war. Wenn ich mich nicht irre, war es bei mir vorher sogar leer.

Ich kann also nur empfehlen bei Applikationen, die vor .NET 3.5 und SP1 wunderbar funktioniert haben zuerst kurz mal nach dem action Attribut im form tag zu gucken, bevor ihr an den Configs dreht! ;-)

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß

Zugriff auf Properties einer MasterPage aus dem Code-Behind einer ContentPage

January 27th, 2009

So, hier ist er nun: Der erste reguläre Post!

Eigentlich wollte Ich ja mit ein wenig anspruchsvolleren Tutorials zum Thema LINQ, .NET 3.5 & Design Patterns anfangen. Allerdings sind es ja auch immer wieder die kleinen Dinge, die man schon gefühlte 100 mal bei google gesucht hat und sich einfach nie merken kann.

Ein Kandidat hierfür ist bei mir das “Wie kann Ich noch gleich auf eine Property einer MasterPage innerhalb der ContentPage zugreifen?”.

Für alle, die es nur zufälligerweise kurz vergessen haben:

<!--MasterType VirtualPath="~/MasterPage.master"-->

Für alle, die es in Zukunft vergessen können wollen:

Angenommen, wir haben eine MasterPage, auf der ein Label platziert ist, welches den Titel der Seite darstellen soll.

DefaultMaster.master

   <form id="form1" runat="server">
    <div>
        <asp:Label ID="Header" runat="server"></asp:Label>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
 
        </asp:ContentPlaceHolder>
    </div>
    </form>

Wir wollen nun diesen Titel über eine Property der MasterPage direkt im Code-Behind der ContentPage ansprechen. Hier wird nun noch eine Property angelegt mit der wir das Label füllen wollen:

DefaultMaster.master.cs

public partial class MasterPage : System.Web.UI.MasterPage
{
    public string HeaderText { get; set; }
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (HeaderText != null) Header.Text = HeaderText;
    }
}

Hinweis: Hier wird die kurze Schreibweise von Properties ohne “backing-field” benutzt. D.h. es wird nicht explizit ein Field deklariert und der getter und setter implementiert. Diese Schreibweise gibt’s seit .NET 3.5! Natürlich kann die Property auch wie gehabt geschrieben werden!

    private string headerText;
 
    public string HeaderText
    {
        get { return headerText; }
        set { headerText = value; }
    }

Will man nun auf diese Property von einer ContentPage zugreifen, muss zuerst eine “Strongly Typed Reference” in der ContentPage zu der MasterPage erstellt werden.

Default.aspx

<!--Page Language="C#" MasterPageFile="~/MasterPage.master" ... -->
<!--MasterType VirtualPath="~/MasterPage.master"-->

Nun kann man im Code-Behind der ContentPage schön auf alle Properties der MasterPage über “Master” zugreifen:

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Master.HeaderText = "Hallo, Ich komme gerade von der ContentPage!";
    }
}

So, das war’s auch schon. Ich denke mal, dass die nächsten Posts sich mehr mit interessanteren Dingen beschäftigen werden. Ich werde trotzdem auch weiterhin solche Kleinigkeiten posten…kann ja nix schaden die typischen Sachen mal an einer Stelle finden zu können!

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß