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?

Matt Schubert
fuente
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>
Rikin Patel
fuente
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 :

Rajesh
fuente
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.

Stuart
fuente
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 
}
b1n0m
fuente
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.

Abdul Azeez
fuente
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.

Matt Schubert
fuente
1

Para solucionar esto, tuvimos que cambiar la identidad de AppPool a una cuenta de administrador .

SarjanWebDev
fuente
Esto me resultó útil. No hice exactamente lo que sugirió Sarjan, solo le di derechos de lectura / escritura en la carpeta de la aplicación (en wwwroot ...) a la identidad del grupo de aplicaciones que estaba usando.
Francesco B.
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.

Mark Challen
fuente
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.

Abhijit Kumar
fuente
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.

jp2code
fuente
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.

Sujeewa
fuente
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"/>
Rob Sedgwick
fuente
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

modeeb
fuente
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.

Lomithrani
fuente
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.

Serj Sagan
fuente
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,

Gonza Oviedo
fuente
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.

joettriscik
fuente
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

Basheer AL-MOMANI
fuente
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.

Dilip0165
fuente
0

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

Ian Rathbone
fuente
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

Laaiqah Seedat
fuente