WCF in SharePoint – Nachrichtengröße und Stringlängen

Vor einiger Zeit hatte ich in einem Beitrag gezeigt, wie man einen eigenen WCF-Dienst entwickelt und in SharePoint bereitstellt. Das ist alles relativ einfach und durch Nutzung der von SharePoint bereitgestellten Factory-Klasse MultipleBaseAddressBasicHttpBindingServiceHostFactory fällt auch die Konfiguration nicht schwer.

Aber: im produktiven Einsatz wird man wahrscheinlich sehr schnell über eine der folgenden Fehlermeldungen stolpern (ich habe hier nur die englischen Meldungen):

The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.

– oder –

The remote server returned an unexpected response: (400) Bad Request.

– oder –

The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.

Diese Fehlermeldungen bekommt man, wenn entweder ein String-Parameter größer als 8k ist oder die gesamte Nachrichtengröße 64k überschreitet. Dabei handelt es sich um die voreingestellten Standardwerte.

Kein Problem, dachte ich zunächst. Wie man das von WCF kennt, legt man einfach die gewünschten Werte in einer eigenen web.config fest und stellt diese im selben Ordner wie die svc-Datei bereit. Wie im genannten Beitrag gezeigt, gab es in diesem Fall sogar bereits eine web.config für eigene Einstellungen. Nach langem Herumprobieren, Testen und Feststellen, daß es nicht geht, Prüfen der Einstellungen, Testen und Feststellen, daß es immer noch nicht geht und nochmaligem Prüfen, mußte ich dann einsehen, daß die ServiceHostFactory-Klasse von SharePoint keine Einstellungen aus der web.config liest.

Es gab jetzt zwei Möglichkeiten: eine eigene Factory-Klasse oder eine andere Möglichkeit suchen. Nachdem ich mehr Zeit mit der Suche nach einer anderen Lösung verbrachte, als ich zum Entwickeln einer eigenen Factory-Klasse gebraucht hätte, habe ich dann doch noch die Lösung gefunden: einen Blogbeitrag von Doug Ware von Elumenotion Specifying Reader Quotas for WCF Services in SharePoint 2010. Danke dafür!

Doug zeigt in diesem Beitrag, wie man Einstellungen für in SharePoint gehostete WCF-Dienste mit Programmcode setzen kann. Dieser Code läßt sich z.B. im FeatureInstalled- oder FeatureActivated-Ereignis unterbringen.

Man benötigt folgende using-Anweisung:

using Microsoft.SharePoint.Administration;

Der Code sieht so aus:

SPWebService svc = SPWebService.ContentService;

SPWcfServiceSettings settings = new SPWcfServiceSettings();

settings.ReaderQuotasMaxStringContentLength = 10485760;

settings.MaxReceivedMessageSize = 10485760;

settings.MaxBufferSize = 10485760;

// hier kann man weitere Einstellungen vornehmen

svc.WcfServiceSettings["myservice.svc"] = settings;

svc.Update();

Oder mit PowerShell:

$svc = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
$setting = new-object Microsoft.SharePoint.Administration.SPWcfServiceSettings
$setting.ReaderQuotasMaxStringContentLength = 10485760
$setting.MaxReceivedMessageSize = 10485760
$setting.MaxBufferSize = 10485760
$svc.WcfServiceSettings.item("myservice.svc") = $setting
$svc.update()

Als Schlüssel zum Speichern der Einstellungen muß dabei der exakte Name der svc-Datei verwendet werden. Die Werte wurden im Beispiel willkürlich auf 10MB gesetzt. Den "richtigen" Wert muß jeder für seinen Anwendungsfall selbst herausfinden.

Noch ein sehr wichtiger Hinweis zum Schluß: man muß sowohl den Namen der svc-Datei als auch den Schlüssel zum Speichern der Einstellungen in Kleinbuchstaben schreiben, sonst funktioniert es nicht. Den Hinweis darauf habe ich erst nach langem Suchen hier bei MSDN gefunden.

Ein Gedanke zu “WCF in SharePoint – Nachrichtengröße und Stringlängen

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s