Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP


87

Tengo un servicio WCF funcionando bien en mi máquina local. Lo puse en los servidores y recibo el siguiente error:

Se produjo un error al recibir la respuesta HTTP a http: //xx.xx.x.xx: 8200 / Services / WCFClient.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 anula un contexto de solicitud HTTP (posiblemente debido al cierre del servicio). Consulte los registros del servidor para obtener más detalles.]

He ido al servicio en la url y está funcionando correctamente. Todo lo que estoy haciendo para la función es devolver una cadena a un nombre de imagen, por lo que los datos que se pasan no son muchos. He rastreado el registro y me da la misma información. Aquí está mi configuración de cliente:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Aquí está la configuración de mi servidor:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

¿Sería una configuración en el servidor, ya que funciona en mi máquina local?


Resolví mi problema como expliqué aquí: stackoverflow.com/questions/5537794/…
Adi

Parece que llegaste más lejos que yo. Quizás puedas darme una pista sobre qué hacer a continuación. stackoverflow.com/questions/16628382/…
Niels Brinch

¿Alguna posibilidad de que acepte alguna de las respuestas, ya que dudo que todavía esté esperando obtener una? :)
Noctis

Respuestas:


100

Creo que hay un problema de serialización, puede encontrar el error exacto, solo necesita agregar el siguiente código en la configuración del servicio en la <configuration>sección.

Después de "App_tracelog.svclog"que se cree el archivo de actualización de configuración , donde exista su servicio, solo necesita abrir el .svclogarchivo y encontrar la línea de color rojo en el panel lateral izquierdo, que es un error y ver su descripción para obtener más información.

Espero que esto ayude a encontrar su error.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
En realidad, esto me salvó el día. De hecho, era un problema de serialización y me faltaba la System.Runtime.Serializationfuente en mi seguimiento.
Julealgon

Bien ... no estaba al tanto de esto :)
Noctis

¡épico! que escribe el error, que no ha estado disponible en ninguna excepción, en el archivo
App_tracelog.svclog

¡Brillante! Gracias
SyntaxError

1
Asegúrese de pegar la <system.diagnostics>sección al final del archivo, justo arriba </configuration>. Si lo pega en la parte superior, podría obtener un error de tipo de contenido al ejecutar su aplicación.
Tawab Wakil

75

Tuve este problema "Esto podría deberse a que el enlace del punto final del servicio no usa el protocolo HTTP" y el servicio WCF se apaga (en una máquina de desarrollo)

Me di cuenta: en mi caso, el problema se debió a Enums,

Lo resolví usando esto

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Tuve que decorar mis Enums con DataContract, Flags y todos los miembros de enum con atributos EnumMember.

Resolví esto después de mirar esta referencia de msdn :


1
Gracias. Esto era exactamente lo que tenía que hacer yo también.
Matthew Cole

1
Gracias, que acaba de guardar un montón de tiempo me
Nixon

4
Muchas gracias ... me ahorré mucho tiempo
amesh

Relacionado con esto, si tiene un tipo de enumeración en un contrato que no es el tipo de DataMember, obtendrá este error. Simplemente agregué una propiedad que era un DataMember y le di el tipo de enumeración que no es DataContract.
paz

¿No es también el caso de que las enumeraciones deben comenzar con el índice 0? Este fue sin duda un problema en el pasado para mí. Entonces, en el ejemplo anterior, APPLE = 0 en lugar de 1.
The Senator


14

En mi caso, el error se generó porque uno de mis tipos complejos tenía una propiedad sin un método establecido.

El serializador lanzó una excepción debido a ese hecho. Se agregaron métodos de configuración internos y todo funcionó bien.

La mejor manera de averiguar por qué sucede esto (en mi opinión) es habilitar el registro de seguimiento.

Lo logré agregando la siguiente sección a mi web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Una vez configurado, ejecuté mi cliente, obtuve una excepción y verifiqué el archivo 'Traces.svclog'. A partir de ahí, solo necesitaba encontrar la excepción.


autoflush = true fue clave
Jeremy Smith

9

Solución con DataContract, Flags for Enums se ve un poco feo. En mi caso, el problema se resolvió agregando algo como "NotSet = 0" en la enumeración:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Ah, sí, lo siento, acabo de comentar una respuesta posterior. Yo también he visto este comportamiento.
El Senador

explicación: tuve el mismo problema. La respuesta de @ Rikin me llevó a: "El mensaje InnerException era 'Enum value' 0 'is invalid for type ..." from [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Tengo el jem: "El problema aquí es que no está inicializando el ..Response y está tomando el valor predeterminado (y no válido) de '0' ... por lo que no se puede serializar".
AJ AJ

3

Estaba enfrentando el mismo problema y lo resolví con el siguiente código. (si hay algún problema de conectividad TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Pegue esta línea antes de abrir el canal del cliente.


1

Resolví el problema. Terminó siendo una ruta a mi archivo de configuración que estaba mal. Los errores de WCF son muy útiles a veces.



1

He visto este error causado por una referencia circular en el gráfico de objetos. Si se incluye un puntero al objeto principal desde un hijo, el serializador se repetirá y, en última instancia, superará el tamaño máximo del mensaje.


1

Este error puede deberse a una discrepancia en el contrato. Considere la aplicación de tres capas a continuación ...

Capa de interfaz de usuario
|
Capa de proceso
|
Capa de acceso a datos
-> Contrato entre el proceso y la capa de interfaz de usuario tiene la misma enumeración que falta (En espera = 3) Enum: Start = 1, Stop = 2. -> Contract Between Data Access and Process layer tiene enum Enum: Start = 1, Stop = 2, Onhold = 3.

En este caso, obtendremos el mismo error en la respuesta de la capa de proceso.

El mismo error se produce en otro desajuste de contrato en una aplicación de varias capas.


Tu respuesta no parece tener nada que ver con la pregunta. Tenga en cuenta también que el OP ya ha resuelto su problema: la ruta al archivo de configuración era incorrecta .
Simon MᶜKenzie

1

Tuve este problema porque configuré mi servicio WCF para devolver un System.Data.DataTable.

Funcionó bien en mi página HTML de prueba, pero explotó cuando puse esto en mi aplicación Windows Form.

Tuve que entrar y cambiar la firma del contrato operativo del servicio de DataTable a DataSet y devolver los datos en consecuencia.

Si tiene este problema, es posible que desee agregar un Contrato operativo adicional a su Servicio para no tener que preocuparse por romper el código que depende de los Servicios existentes.


1

Esto podría deberse a muchas razones; a continuación se muestran algunos de ellos:

  1. Si está utilizando objetos de contrato de datos complejos (eso significa objeto personalizado con más objetos personalizados secundarios), asegúrese de tener todos los objetos personalizados decorados con los atributos DataContract y DataMember
  2. Si sus objetos de contrato de datos usan herencia, asegúrese de que todas las clases base tengan los atributos DataContract y DataMember. Además, necesita que las clases base especifiquen las clases derivadas con el atributo [KnownType (typeof (BaseClassType))] ( consulte más información aquí ).

  3. Asegúrese de que todas las propiedades del objeto de su contrato de datos tengan propiedades get y set.


1

Mi problema era que se pasaban demasiados elementos entre el cliente y el servidor. Tuve que cambiar esta configuración en el comportamiento en ambos lados.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Usé la misma solución. Pero tuve que usar Service Trace Viewer como sugirió @ 100r para ver que era el error.
Björn

1

Es posible que esto no sea relevante para su problema específico, pero el mensaje de error que mencionó tiene muchas causas, una de ellas es usar un tipo de retorno para un [OperationContract] que es abstracto, interfaz o no conocido por el código de cliente WCF.

Verifique la publicación (y la solución) a continuación

https://stackoverflow.com/a/5310951/74138


1

Creo que la mejor manera de resolver esto es seguir los consejos de error y, por lo tanto, buscar registros del servidor. Para habilitar los registros que agregué

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Luego vaya a c: \ logs \ TracesServ_ce.svclog ábralo con el visor de seguimiento del servicio de microsoft. Y vea cuál es realmente el problema.


1

Para obtener más información sobre este problema, consulte también: El host remoto cerró a la fuerza una conexión existente - WCF

Mi problema terminó siendo que mis objetos de transferencia de datos eran demasiado complejos. Comience con propiedades simples como public long Id { get; set; }y una vez que lo haga funcionar, comience a agregar cosas adicionales según sea necesario.


1

Luché con esto durante un par de días y probé todas las respuestas de esta publicación y muchas otras y compartí mi solución porque los síntomas eran los mismos pero el problema era diferente.

El problema era que el grupo de aplicaciones estaba configurado con un límite de memoria y simplemente se reciclaba después de un período de tiempo variable.

¡Espero que esto ayude a alguien más!
Saludos,


1

Mi problema era que ese tipo de devolución de mi servicio era una cadena. Pero devolví una cadena de tipo xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

por lo que se lanzó un error.


1

en mi caso

mi servicio tiene la función de download Files

y este error solo se muestra al intentar descargar Big Files

así que encontré esta respuesta a Aumentar el maxRequestLengthvalor necesario enweb.config

Sé que es raro, pero problema resuelto

si no realiza ninguna operación de carga o descarga, tal vez esta respuesta no lo ayude


1

Para mí las soluciones de este Error son muy extrañas. Fue el problema de la dirección del puerto de EndpointAddress . En Visual Studio, la dirección del puerto de su archivo (por ejemplo, Service1.svc) y la dirección del puerto de su proyecto de wcf deben ser las mismas que proporciona en EndpointAddress . Déjeme describirle esta solución en detalle.

Hay dos pasos para verificar las direcciones de los puertos.

  1. En su proyecto WCF, haga clic derecho en su archivo de servicio (por ejemplo, Service1.svc) -> luego seleccione Ver en el navegador ahora en su navegador tiene una URL como http: // localhost: 61122 / Service1.svc, así que ahora anote su dirección de puerto como a 61122

  2. Haga clic con el botón derecho en su proyecto wcf -> luego seleccione Propiedades -> vaya a la pestaña Web -> Ahora en la sección Servidores -> seleccione Usar servidor de desarrollo de Visual Studio -> seleccione Puerto específico y proporcione la dirección del puerto que encontramos anteriormente en nuestro Servicio1. servicio de svc. Eso es (61122) .

Anteriormente tengo una dirección de puerto diferente. Después de especificar correctamente la dirección del puerto que he dado en EndpointAddress , mi problema se resolvió.

Espero que esto pueda resolver su problema.


0

También tuve este problema y se debió a que olvidé decorar mi modelo con los atributos DataContract y DataMember


0

Si tiene una base de datos (trabajando en Visual Studio), asegúrese de que no haya claves externas en las tablas, yo tenía claves externas y me dio este error y cuando las eliminé funcionó sin problemas

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.