example endpointconfigurationname endpointaddress c# .net asp.net wcf basichttpbinding

c# - endpointconfigurationname - Gran Binario(byte[]) Transferencia de archivos a través de WCF



wcf endpoint (4)

Estoy intentando crear un servicio WCF que me permita enviar grandes archivos binarios desde clientes al servicio.

Sin embargo, solo puedo transferir con éxito archivos de hasta 3-4MB. (Fallé cuando intento transferir 4.91MB y, por supuesto, cualquier cosa más allá)

El error que recibo si intento enviar el archivo de 4.91 MB es:

Mensaje de excepción: Ocurrió un error al recibir la respuesta HTTP a http://localhost:56198/Service.svc . Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP. Esto también podría deberse a que el servidor ha cancelado un contexto de solicitud HTTP (posiblemente debido a que el servicio se ha apagado). Vea los registros del servidor para más detalles.

Mensaje de excepción interna: se cerró la conexión subyacente: se produjo un error inesperado en una recepción.

Mensaje de excepción interna: no se pueden leer los datos de la conexión de transporte: el host remoto ha cerrado a la fuerza una conexión existente.

Mensaje de excepción interno: una conexión existente fue cerrada a la fuerza por el host remoto

Este error ocurre en el lado del cliente tan pronto como el archivo byte [] se envía como un parámetro de método al método de servicio expuesto.

Tengo un punto de interrupción en la primera línea del método de servicio, en caso de transferencias de archivos exitosas (por debajo de 3MB), se golpea ese punto de interrupción y se transfiere el archivo. Sin embargo, en este caso, tan pronto como se llama al método, aparece el error. El punto de corte en el servicio no se golpea en caso de este error.

Voy a pegar mis secciones de mi servicio Web.config y Asp Page (Client) Web.config. Si también necesita el código que envía el archivo y acepta el archivo, avíseme, también lo enviaré.

Servicio Web.Config

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="basicHttpEndpointBinding" closeTimeout="01:01:00" openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646" messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest" useDefaultWebProxy="true"> <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646" maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <services> <service behaviorConfiguration="DragDrop.Service.ServiceBehavior" name="DragDrop.Service.Service"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpEndpointBinding" contract="DragDrop.Service.IService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="DragDrop.Service.ServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> <dataContractSerializer maxItemsInObjectGraph="2147483646"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

Cliente (página Asp.net) Web.Config

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646" messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedResponse" useDefaultWebProxy="true"> <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646" maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm=""> <extendedProtectionPolicy policyEnforcement="Never" /> </transport> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="debuggingBehaviour"> <dataContractSerializer maxItemsInObjectGraph="2147483646" /> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint address="http://localhost:56198/Service.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference.IService" name="BasicHttpBinding_IService" behaviorConfiguration="debuggingBehaviour" /> </client> </system.serviceModel>


¿Has echado un vistazo al uso de Streaming Transfer?

Windows Communication Foundation (WCF) puede enviar mensajes utilizando transferencias en búfer o en transmisión. En el modo de transferencia con búfer predeterminado, un mensaje debe entregarse por completo antes de que un receptor pueda leerlo. En el modo de transferencia de transmisión, el receptor puede comenzar a procesar el mensaje antes de que se entregue por completo. El modo de transmisión es útil cuando la información que se pasa es larga y se puede procesar en serie. El modo de transmisión también es útil cuando el mensaje es demasiado grande para ser completamente almacenado.

http://msdn.microsoft.com/en-us/library/ms789010.aspx


Como se señaló, intente usar Streaming Transfer , aquí hay un código de ejemplo que muestra tanto el envío como la recepción (posiblemente) de grandes cantidades de datos mediante la transferencia de datos.

Use un enlace como este, observe las configuraciones TranferMode y TranferMode .

<binding name="Streaming_Binding" maxReceivedMessageSize="67108864" messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed"> </binding>

Agregue un código de servicio :

[OperationContract] public Stream GetLargeFile() { return new FileStream(path, FileMode.Open, FileAccess.Read); } [OperationContract] public void SendLargeFile(Stream stream) { // Handle stream here - e.g. save to disk ProcessTheStream(stream); // Close the stream when done processing it stream.Close(); }

Y algún código de cliente :

public Stream GetLargeFile() { var client = /* create proxy here */; try { var response = client.GetLargeFile(); // All communication is now handled by the stream, // thus we can close the proxy at this point client.Close(); return response; } catch (Exception) { client.Abort(); throw; } } public void SendLargeFile(string path) { var client = /* create proxy here */; client.SendLargeFile(new FileStream(path, FileMode.Open, FileAccess.Read)); }

Además, asegúrese de no obtener un tiempo de espera, un archivo grande puede tardar un tiempo en transferirse (sin embargo, el valor predeterminado de receiveTimeout es de 10 minutos).

here puede descargar el código de muestra de Microsoft WCF / WF (el enlace C # superior está roto en el momento de la escritura, pero el código de otras muestras parece estar bien).


Me haré eco de lo que otros han dicho y diré que usar Streaming Transfer es el camino a seguir cuando se usa Windows Communication Foundation. A continuación hay una excelente guía que explica todos los pasos para transmitir archivos a través de WCF. Es bastante completo y muy informativo.

Aquí está: Guía sobre la transmisión de archivos a través de WCF .


(Aunque estoy de acuerdo en que la transferencia de streaming sería preferible, lo siguiente debería hacerlo funcionar sin ningún otro cambio)

También necesita aumentar la longitud máxima del mensaje en Web.config:

<configuration> <system.web> <httpRuntime maxMessageLength="409600" executionTimeoutInSeconds="300"/> </system.web> </configuration>

Esto establecerá la longitud máxima del mensaje en 400 MB (el parámetro está en kB). Consulte esta página de MSDN para más información.