visual - Serialice el mensaje WCF de forma binaria, y no como un mensaje SOAP
wcf vs2015 (4)
Aquí hay un ejemplo de cómo hacer una codificación personalizada aquí https://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study
Vale la pena señalar que lo que realmente se envía es lo mismo que si tuviera un método de servicio que enviara el byte [] con la codificación predeterminada. El mensaje que pasa por el cable aún utiliza un sobre XML de SOAP, independientemente de cómo configure la serialización.
Se parece a esto:
POST http://127.0.0.1:12345/forSwerGup182948/Client HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo+WkoDpet/JOtGlW+EHdpDQAAAAAvFs5XOJ0tEW0wTvNVRDUIiabR6u+p+JNnd5Z+SWl1NcACQAA
SOAPAction: "http://tempuri.org/ITransmissionService/SendData"
Host: 127.0.0.1:12345
Expect: 100-continue
Accept-Encoding: gzip, deflate
Content-Length: 2890
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendData xmlns="http://tempuri.org/"><message>eyI8Q2FsbGJhY2tJZD5rX19CYWNraW5nRmllbGQiOiJlYTQ3ZWIzMS1iYjIzLTRkODItODljNS1hNTZmNjdiYmQ4MTQiLCI8RnJvbT5rX19CYWNraW5nRmllbGQiOnsiPENoYW5uZWxOYW1lPmtfX0JhY2tpbmdGaWVsZCI6Ikdyb3VwMSIsIjxOYW1lPmtfX0==</message></SendData></s:Body></s:Envelope>
Tengo una aplicación cliente-servidor, que se comunica mediante WCF, y utiliza NetDataContractSerializer para serializar el gráfico de objetos.
Dado que se transfiere una gran cantidad de datos entre el servidor y el cliente, intenté reducir su tamaño ajustando el tamaño de los miembros de los datos (por ejemplo, cambiar int a short, long a int, etc.).
Después de terminar la sintonización, descubrí que la cantidad de datos transferidos no ha cambiado.
El problema es que NetDataContractSerializer serializa el gráfico de objetos a XML, por lo que no importa cuál sea el tamaño del miembro de datos, lo único que importa es el tamaño de su valor. Por ejemplo, el valor 10023 de un miembro de datos Int16 se serializará como la cadena "10023" (0x3130303233), en lugar de solo 10023 (0x2727).
Recuerdo que en Remoting podía usar el BinaryFormatter que serializaba los valores según el tipo de miembro de datos, pero no sé si es posible usarlo con WCF.
¿Alguien tiene una solución?
El codificador binario NO serializará su objeto en binario, ¡porque no tiene nada que ver con la serialización! Es algo que funciona en una capa inferior y decide cómo se transporta el mensaje entre el servidor y el cliente.
En otras palabras, el objeto primero se serializará (por ejemplo, por DataContractSerializer) y luego se codificará (por BinaryEncoder). Por lo tanto, su objeto siempre estará en formato XML siempre que esté involucrado DataContractSerializer.
Si desea una información más compacta y un mejor rendimiento, lea este blog:
https://blogs.msdn.microsoft.com/dmetzgar/2011/03/29/protocol-buffers-and-wcf/
Primer pensamiento; ¿Has habilitado la compresión de transporte?
¿Qué tan complejos son los datos? Si es algo que funcionaría con el DataContractSerializer
regular (es decir, un árbol de objetos simple), entonces puede ser útil protobuf-net . Es una biblioteca de serialización binaria muy eficiente con soporte para WCF a través de atributos adicionales en el contrato de servicio, por ejemplo:
[ServiceContract]
public interface IFoo
{
[OperationContract, ProtoBehavior]
Test3 Bar(Test1 value);
}
(el [ProtoBehaviour]
es lo que cambia en el serializador diferente para este método)
Sin embargo:
- debe ser capaz de identificar una etiqueta numérica para cada propiedad, ya sea a través de atributos adicionales, o puede usar la
Order
en un[DataMember(Order = x)]
- la herencia (si la está utilizando) requiere atributos adicionales
- funciona mejor si está utilizando el uso compartido de ensamblajes ("mex" no lo ama ...)
Bien, también funciona con MTOM, reduciendo el costo base-64 para mensajes más grandes.
WCF utiliza mensajes SOAP, pero el tipo de codificación de mensajes que se utiliza es totalmente tuyo.
Básicamente, fuera de la caja, tiene dos: codificación de texto (representación de texto de mensaje XML) o codificación binaria. Puede escribir su propio mensaje de codificación, si realmente debe y lo necesita.
Fuera de la caja, los enlaces basicHttp y wsHttp utilizan codificación de texto, pero puede cambiarlo si lo desea. El enlace netTcp (que es la opción clara y clara detrás de los firewalls corporativos) usará el binario de forma predeterminada.
También puede definir (solo en configuración) su propio protocolo "http binario", si lo desea:
<bindings>
<customBinding>
<binding name="BinaryHttpBinding">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
y luego úselo en su configuración del lado del servicio y del cliente:
<services>
<service name="YourService">
<endpoint
address="http://localhost:8888/YourService/"
binding="customBinding"
bindingConfiguration="BinaryHttpBinding"
contract="IYourService"
name="YourService" />
</service>
</services>
Ahora tiene un protocolo de transporte basado en http, que codificará su mensaje en binario compacto, para que lo use y disfrute.
No se necesita codificación adicional ni trucos complicados ni mucho código de serialización manual de XML, ¡solo conéctelo y úselo! ¡Ah, la alegría de la flexibilidad de WCF!