Cuando intento PUBLICAR en una URL, aparece la siguiente excepción:
El servidor remoto devolvió un error: (417) Expectativa fallida.
Aquí hay un código de muestra:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
Usar un HttpWebRequest/HttpWebResponse
par o un HttpClient
no hace la diferencia.
¿Qué está causando esta excepción?
Expect
encabezado que, de forma predeterminada, se agrega comoExpect100Continue
estátrue
por defecto.Respuestas:
System.Net.HttpWebRequest agrega el encabezado 'Encabezado HTTP "Esperar: 100-Continuar"' a cada solicitud a menos que explícitamente le pida que no establezca esta propiedad estática en falso:
Algunos servidores se ahogan con ese encabezado y devuelven el error 417 que está viendo.
Dale una oportunidad.
fuente
De otra manera -
Agregue estas líneas a la sección de configuración del archivo de configuración de su aplicación:
fuente
Esta misma situación y error también pueden surgir con un proxy de servicio web SOAP generado por asistente predeterminado (no 100% si este es también el caso en la
System.ServiceModel
pila de WCF ) cuando está en tiempo de ejecución:Expect
encabezado como parte de un HTTPPOST
oPUT
solicitud debido a una convención de protocolo estándar de enviar la solicitud en dos partes como se cubre en los Comentarios aquí )... produciendo un 417.
Como se explica en las otras respuestas, si el problema específico con el que se encuentra es que el
Expect
encabezado está causando el problema, entonces ese problema específico se puede enrutar haciendo una desconexión relativamente global de la transmisión PUT / POST de dos partes a través deSystem.Net.ServicePointManager.Expect100Continue
.Sin embargo, esto no soluciona el problema subyacente completo: la pila aún puede estar usando cosas específicas de HTTP 1.1 como KeepAlives, etc. (aunque en muchos casos las otras respuestas cubren los casos principales).
Sin embargo, el problema real es que el código autogenerado supone que está bien usar ciegamente las funciones de HTTP 1.1, ya que todos entienden esto. Para detener esta suposición para un proxy de servicio web específico, uno puede cambiar anular el valor subyacente
HttpWebRequest.ProtocolVersion
predeterminado del valor predeterminado de 1.1 creando una clase de proxy derivada que se anula como se muestra en esta publicación :protected override WebRequest GetWebRequest(Uri uri)
(¿dónde
MyWS
está el proxy que el asistente para agregar referencias web le escuchó?)ACTUALIZACIÓN: Aquí hay un impl que estoy usando en producción:
fuente
¿El formulario que intenta emular tiene dos campos, nombre de usuario y contraseña?
Si es así, esta línea:
no es correcto.
necesitarías dos líneas como:
Editar:
De acuerdo, ya que ese no es el problema, una forma de abordar esto es usar algo como Fiddler o Wireshark para ver lo que se envía al servidor web desde el navegador con éxito, luego compararlo con lo que se envía desde su código. Si va a un puerto 80 normal desde .Net, Fiddler aún capturará este tráfico.
Probablemente haya algún otro campo oculto en el formulario que el servidor web espera que no envíe.
fuente
Solución del lado del proxy, enfrenté algunos problemas en el proceso de protocolo de enlace SSL y tuve que forzar a mi servidor proxy a enviar solicitudes usando HTTP / 1.0 para resolver el problema configurando este argumento en httpd.conf
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
después de eso, me enfrenté al error 417 como la aplicación de mis clientes estaba usando HTTP / 1.1 y el proxy se vio obligado a usar HTTP / 1.0, el problema se resolvió configurando este parámetro en httpd.conf en el lado del proxyRequestHeader unset Expect early
sin la necesidad de cambiar nada en el lado del cliente, espero que esto ayude .fuente
Para Powershell es
fuente
Si está utilizando " HttpClient " y no desea utilizar la configuración global para afectar a todos los programas que puede utilizar:
Si está utilizando " WebClient ", creo que puede intentar eliminar este encabezado llamando a:
fuente
En mi situación, este error parece ocurrir solo si la computadora de mi cliente tiene una estricta política de firewall, lo que impide que mi programa se comunique con el servicio web.
Entonces, la única solución que pude encontrar es detectar el error e informar al usuario sobre cómo cambiar la configuración del firewall manualmente.
fuente
El enfoque web.config funciona para las llamadas de servicios de formulario de InfoPath a las reglas habilitadas del servicio web IntApp.
fuente