2012-04-12 12 views
1

ich einen WCF-Dienst haben, das ein Verfahren mit der folgenden Signatur hat:Unterstützung

object GetCommand(Guid apiKey, SocialService service, string name, object argument); 

Der Grund ist es mit Objekten, da sowohl die Rückgabetyp und letzte Argument funktioniert, ist weil es möglich sein sollte, einen beliebigen Typ als Argument zu übergeben und einen beliebigen Typ zurückzugeben.

Wie dem auch sei, ich bin ein Objekt übergeben, die die folgende Eigenschaft enthält:

public byte[] Photo { get; set; } 

große Nachrichten zu aktivieren, würde Ich mag MtoM beginnen, während ich vorher Klartext als MessageEncoding wurde unter Verwendung Art.

Problem ist, ich möchte, dass es abwärtskompatibel ist, so dass aktuelle bereits konfigurierte Clients weiterhin Klartextcodierung verwenden sollten, während neue Clients in der Lage sein sollten, Mtom über die web.config zu verwenden.

Meine Frage ist: ist es möglich, Klartext als MessageEncoding standardmäßig (bestehende Kunden) und bieten MTOM-Codierung als auch Seite-an-Seite zu halten, verwenden?

Ich habe einige Dinge mit der Konfiguration ausprobiert, wie mehrere Endpunkte mit unterschiedlichen Bindungs-Konfigurationen definieren, aber ich kann es nicht funktionieren:

Server

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpTextBinding_SocialProxy" /> 
      <binding name="BasicHttpMtomBinding_SocialProxy" maxReceivedMessageSize="5242880" messageEncoding="Mtom"> 
       <readerQuotas maxStringContentLength="655360" maxArrayLength="1310720" maxNameTableCharCount="1310720" maxBytesPerRead="327680" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="SocialProxyService"> 
      <endpoint name="BasicEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpTextBinding_SocialProxy" /> 
      <endpoint name="MtomEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpMtomBinding_SocialProxy" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
       <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true" /> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

-Client

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_SocialProxy" messageEncoding="Mtom" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://socialproxy.local/socialproxy.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SocialProxy" 
      contract="Webservice.SocialProxy" name="BasicHttpBinding_SocialProxy" /> 
    </client> 
</system.serviceModel> 

Problem ist:

Wenn ich nicht setzen MtoM messageEncoding @ den Client, funktioniert alles über Klartext. Aber wenn ich es auf Mtom einstelle, bekomme ich eine Ausnahme:

The remote server returned an error: (415) Cannot process the message because the content type 'multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:65a6b418-8eb3-4c76-b4c0-ea3486a56892+id=2";start-info="text/xml"' was not the expected type 'text/xml; charset=utf-8'.. 

Kann mir jemand helfen? :-)

Antwort

3

Wenn Sie einen neuen Endpunkt hinzufügen möchten (für neuere Clients), muss dieser Endpunkt unter einer anderen Adresse sein. Da Sie keine Fehlermeldung erhalten haben, ich denke, Sie einen falschen Namen im name Attribut des <service> Element haben. Denken Sie daran, dass die Attributnamen der vollständig qualifizierten Namen der Dienstklasse enthalten sollte. Wenn Ihr Service-Klasse im Namespace ist InfoCaster.SocialProxy, sollten Sie Ihre Service-Konfiguration wie unten definiert werden:

<services> 
    <service name="InfoCaster.SocialProxy.SocialProxyService"> 
     <endpoint name="BasicEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpTextBinding_SocialProxy" /> 
     <endpoint name="MtomEndpoint_SocialProxy" address="newClients" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpMtomBinding_SocialProxy" /> 
    </service> 
</services> 

Und die Kunden wäre so etwas wie

<client> 
    <endpoint address="http://socialproxy.local/socialproxy.svc/newClients" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SocialProxy" 
     contract="Webservice.SocialProxy" name="BasicHttpBinding_SocialProxy" /> 
</client> 

Jetzt haben, wenn Sie einen einzigen Endpunkt wollen die sowohl Text als auch MTOM in einer Art und Weise unterstützen, dass die Kunden Text eine Textantwort erhalten senden und Kunden, die wieder eine MTOM Antwort MTOM erhalten senden, können Sie tun es immer noch. Sie benötigen einen benutzerdefinierten Encoder, und ich schrieb einen in der Post bei http://blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom-encoder.aspx.

+0

Danke für die Antwort. Wenn ich richtig verstehe, ist es unmöglich, beide Codierungsarten für die gleiche Adresse zu unterstützen? Das wäre sehr schade!Ich werde morgen mit Ihrer Lösung loslegen und sie zurückschicken, wenn sie fertig ist. – kipusoep

+0

Sie können, aber es ist nicht so einfach. Ich habe die Antwort mit weiteren Details aktualisiert. – carlosfigueira

+0

Vielen Dank Carlos! Ich bin eine Art Noob, wenn es um WCF und benutzerdefinierte Nachricht Encoder geht. Das Problem ist; Ich habe die Codestücke von Ihrem Blogpost genommen, aber ich vermisse immer noch einige Teile. Auch ich habe diesen Forum-Thread gefunden; http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f5c0ea22-1d45-484e-b2c0-e3bc9de20915/ und dort ist eine C# Datei erwähnt, aber es ist nicht verfügbar. Die aktuellen Probleme, die ich habe, sind die Implementierung der Eigenschaften ContentType, MediaType und MessageVersion. Ich vermisse auch eine Klasse namens 'TextOrMtomEncodingBindingElement'. Hier ist der Code: http://pastebin.com/jxk3WeJX – kipusoep